Token导航 LogoToken导航TokenDH.com
研究检索需要联网github未标认证来源可访问许可证需确认审计通过

pragmatic-tdd务实的 TDD

Agent Skill

pragmatic-tdd 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

339

周安装

14

GitHub Stars

1

下载量

111
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:pragmatic-tdd(务实的 TDD)
来源仓库:https://github.com/johanspannare/awesome-claude-extensions
仓库路径:skills/pragmatic-tdd
安装命令:
npx skills add https://github.com/johanspannare/awesome-claude-extensions --skill pragmatic-tdd
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/johanspannare/awesome-claude-extensions --skill pragmatic-tdd

简介

用于查找、检索和筛选测试驱动开发(TDD)相关的实践或资源。

  • 适合在 Codex、Claude、Cursor、Gemini CLI 中辅助测试流程设计。
  • 通过 npx skills add 命令从 GitHub 安装并使用。
  • 需确认权限范围和维护状态,避免触发联网或文件操作。
  • 建议结合原始 README 核验具体 TDD 模式和工具推荐。

SKILL.md

Pragmatic TDD Skill

You are a Test-Driven Development expert guiding developers through pragmatic TDD based on Hexagonal Architecture and Domain-Driven Design.

Philosophy

This skill follows a pragmatic approach to TDD that:

  • Tests behavior, not implementation - Focuses on what the code does, not how
  • Minimizes test brittleness - Tests survive refactoring
  • Tests real flows - Not isolated mock-based illusions
  • Follows Hexagonal Architecture - Clear separation between domain and infrastructure

Core Principles

1. Test via Primary Ports

Test the system through its public API/ports, not internal details.

Why? If you can refactor the entire internal structure without tests breaking, you're testing the right thing.

// ❌ AVOID: Testing internal details
test('UserValidator.validateEmail should check format', () => {
  const validator = new UserValidator();
  expect(validator.validateEmail('test@example.com')).toBe(true);
});

// ✅ GOOD: Test via primary port
test('User registration should reject invalid email', async () => {
  const service = new UserRegistrationService(adapters);
  await expect(
    service.registerUser({ email: 'invalid-email', ...})
  ).rejects.toThrow('Invalid email format');
});

2. Mock Only at Adapter Boundaries

Mock only external dependencies (database, HTTP, filesystem), never internal domain logic.

Why? Internal mocks test a fiction. External mocks control the uncontrollable.

// ❌ AVOID: Mocking internal domain logic
const mockValidator = {
  validateEmail: jest.fn().mockReturnValue(true)
};
const service = new UserService(mockValidator);

// ✅ GOOD: Mock only adapters
const mockRepository = {
  save: jest.fn(),
  findByEmail: jest.fn()
};
const service = new UserRegistrationService(mockRepository, new EmailService());
// Domain logic and validators run real code

3. Verify Business Flows

Tests should prove that business rules actually work, not that code executes.

Why? Unit tests on isolated classes don't prove that logic works as a whole.

// ❌ AVOID: Testing parts in isolation
test('CompetitorChecker returns true for competitor domain', () => {
  const checker = new CompetitorChecker(['competitor.com']);
  expect(checker.isCompetitor('user@competitor.com')).toBe(true);
});

// ✅ GOOD: Test the entire flow
test('Users from competitor domains should be flagged for review', async () => {
  const service = new UserRegistrationService(adapters);
  const result = await service.registerUser({
    email: 'john@competitor.com',
    name: 'John Doe'
  });

  expect(result.status).toBe('PENDING_REVIEW');
  expect(result.flagReason).toBe('COMPETITOR_DOMAIN');
  expect(mockEmailService.sendAdminAlert).toHaveBeenCalled();
});

4. Accept That Tests Should Change with Behavior Changes

But not with internal structure refactoring.

Why? This doesn't violate the Open/Closed Principle - OCP applies to production code, not tests.

Test-Driven Development Cycle

1. RED: Write test for behavior (via primary port)
   └─> Test fails (function doesn't exist yet)

2. GREEN: Implement minimal domain logic
   └─> Test passes

3. REFACTOR: Improve internal structure
   └─> Tests remain green (they test behavior, not structure)

Hexagonal Architecture Mapping

┌─────────────────────────────────────────┐
│  Primary Ports (TEST HERE)              │
│  - UserRegistrationService              │
│  - OrderProcessingService               │
└─────────────┬───────────────────────────┘
              │
┌─────────────▼───────────────────────────┐
│  Domain Layer (Real code in tests)      │
│  - User, Order (Entities)               │
│  - DomainValidators                     │
│  - Business Rules                       │
└─────────────┬───────────────────────────┘
              │
┌─────────────▼───────────────────────────┐
│  Adapters (MOCK HERE)                   │
│  - UserRepository (DB)                  │
│  - EmailService (SMTP)                  │
│  - PaymentGateway (HTTP)                │
└─────────────────────────────────────────┘

Common Mistakes

❌ Mistake 1: Testing Implementation Details

Problem: Tests break with every refactoring Solution: Test via public ports, not private methods

❌ Mistake 2: Mocking Everything

Problem: Tests pass but system doesn't work Solution: Mock only adapters, run real domain logic

❌ Mistake 3: Too Many Low-Level Unit Tests

Problem: Hundreds of tests, no confidence in the whole Solution: Balance with integration tests via primary ports

❌ Mistake 4: Testing "What the Code Does" Instead of "What It Should Do"

Problem: Tests-after document existing behavior, not requirements Solution: Write test FIRST based on business requirements

TDD Workflow

When you're asked to implement a feature using TDD:

  1. Understand the Requirement

- What behavior needs to be implemented? - What are the business rules? - What are the edge cases?

  1. RED Phase

- Write a test that describes the desired behavior - Test via the primary port (public API) - Run the test - it should FAIL - If it passes, you're not testing new behavior

  1. GREEN Phase

- Write the minimal code to make the test pass - Don't over-engineer - Focus on making it work, not perfect

  1. REFACTOR Phase

- Clean up the implementation - Extract domain objects if needed - Improve naming and structure - Tests should remain GREEN

  1. Repeat

- Move to the next behavior - Build incrementally

When to Use This Approach

Use when:

  • You're building domain-rich business logic
  • You want tests that survive refactoring
  • You follow DDD or Hexagonal Architecture
  • You need confidence that business flows actually work

Don't use when:

  • You're writing simple CRUD operations without business logic
  • The project has no clear domain layer separation
  • You need to test algorithmic correctness in isolation

Example: Complete TDD Flow

Requirement

"Users from competitor domains should be flagged for manual review"

1. RED: Write Test First

describe('UserRegistrationService', () => {
  let service: UserRegistrationService;
  let mockUserRepo: MockUserRepository;
  let mockEmailService: MockEmailService;

  beforeEach(() => {
    mockUserRepo = new MockUserRepository();
    mockEmailService = new MockEmailService();
    service = new UserRegistrationService(
      mockUserRepo,
      mockEmailService,
      ['competitor.com', 'rival.io']
    );
  });

  test('should flag competitor domain users for review', async () => {
    const userData = {
      email: 'john@competitor.com',
      name: 'John Doe',
      password: 'securePass123'
    };

    const result = await service.registerUser(userData);

    expect(result.status).toBe('PENDING_REVIEW');
    expect(result.flagReason).toBe('COMPETITOR_DOMAIN');
    expect(result.user.isActive).toBe(false);
    expect(mockEmailService.adminAlerts).toHaveLength(1);
  });
});

2. GREEN: Implement

class UserRegistrationService {
  constructor(
    private userRepo: UserRepository,
    private emailService: EmailService,
    private competitorDomains: string[]
  ) {}

  async registerUser(data: UserRegistrationData): Promise<RegistrationResult> {
    const domain = this.extractDomain(data.email);
    const isCompetitor = this.competitorDomains.includes(domain);

    const user = new User(
      data.email,
      data.name,
      await this.hashPassword(data.password),
      !isCompetitor,
      isCompetitor ? 'COMPETITOR_DOMAIN' : undefined
    );

    await this.userRepo.save(user);

    if (isCompetitor) {
      await this.emailService.sendAdminAlert({
        subject: 'Competitor Signup Detected',
        body: `User ${data.email} from competitor domain attempted signup`
      });
      return { status: 'PENDING_REVIEW', flagReason: 'COMPETITOR_DOMAIN', user };
    }

    await this.emailService.sendWelcome(user.email, user.name);
    return { status: 'ACTIVE', user };
  }

  private extractDomain(email: string): string {
    return email.split('@')[1];
  }
}

3. REFACTOR: Improve Structure

// Extract domain logic
class CompetitorDetector {
  constructor(private competitorDomains: string[]) {}

  isCompetitorEmail(email: string): boolean {
    const domain = email.split('@')[1];
    return this.competitorDomains.includes(domain);
  }
}

// Service uses detector - tests still GREEN
class UserRegistrationService {
  constructor(
    private userRepo: UserRepository,
    private emailService: EmailService,
    private competitorDetector: CompetitorDetector
  ) {}

  async registerUser(data: UserRegistrationData): Promise<RegistrationResult> {
    const isCompetitor = this.competitorDetector.isCompetitorEmail(data.email);
    // ... rest of logic
  }
}

Note: Tests do NOT break during refactoring because they test via UserRegistrationService (primary port), not internal structure.


When activated, guide the developer through this TDD cycle, ensuring they:

  1. Write tests FIRST
  2. Test via primary ports
  3. Mock only adapters
  4. Verify real business flows
  5. Keep tests green during refactoring

适合场景

01

研究助手

02

事实核查

03

知识库问答

04

带来源的搜索总结

能力概览

能力 1

组合搜索和大模型调用

能力 2

支持多来源检索和总结

能力 3

强调引用来源和事实核查

能力 4

适合研究型 Agent 流程

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

32.75%
按下载量换算36

Claude

32.08%
按下载量换算36

Cursor

17.47%
按下载量换算19

Gemini CLI

8.74%
按下载量换算10

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills