关于 ddd-testing-strategist
面向 DDD 项目的测试策略指南,供后端开发者和架构师按领域层、架构类型及测试目标规划测试。内容包括测试金字塔、Mock 策略、TDDD、CI/CD 集成和 N+1 查询检测。
主要功能
- 01规划 DDD 分层测试与测试金字塔
- 02提供值对象、聚合根和仓储测试策略
- 03按架构类型调整 Mock 方法
- 04介绍测试驱动领域设计流程
- 05涵盖 CI/CD、覆盖率与 N+1 检测
- 06提供 CQRS 和事件溯源测试建议
适用场景
- 01为 DDD 项目制定分层测试计划
- 02设计聚合根与领域服务测试
- 03选择仓储和外部端口的 Mock 策略
- 04将架构测试与 N+1 检测纳入 CI
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ full-stack-skills/ ddd-skills --skill ddd-testing-strategist安装后在 Claude Code 中输入/ddd-testing-strategist确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlexamples/01-app-adapter-test-examples.md02-architecture-test-examples.md03-builder-mock-patterns.md04-cqrs-es-test-examples.md05-domain-test-examples.mdreferences/01-architecture-testing-comparison.md02-ci-cd-test-stages.md03-clean-ddd-hexagonal-testing.md04-cqrs-event-sourcing-testing.md05-integration-test-strategies.md06-mock-integration-patterns.md07-test-coverage-targets.md08-test-driven-domain-design.md09-testing.md10-unit-testing-strategies.mdreferences/guides/.gitkeepreferences/patterns/.gitkeep详细介绍
DDD 测试策略师
DDD 测试策略——从值对象单元测试到所有 DDD 架构的端到端验证。涵盖 DDD 测试金字塔、各层专属测试模式、按架构划分的 Mock 策略、测试驱动领域设计(TDDD)、CI/CD 流水线集成,以及 N+1 查询检测。
工作流
用户输入 → 场景分类 → 输出测试策略 + 代码模板
Step 1: 按用户问题场景分类(金字塔/AR/Repository/Mock/CQRS/TDDD/CI-CD/覆盖率)
Step 2: 从 references 获取对应测试模板
Step 3: 按架构类型调整 Mock 策略
Step 4: 输出代码模板 + CI/CD 配置 + 覆盖率目标
什么时候用:用户询问 DDD 测试策略、聚合根测试、Repository 测试、Mock 策略、CQRS 测试、TDDD、CI/CD 测试集成时触发。
范围
✅ 擅长处理
- DDD 测试金字塔(60% Domain + 20% Integration + 10% E2E + 10% Architecture)
- 各层测试策略:Value Object / Aggregate Root / Domain Service / Repository / Application / Adapter
- 按架构类型差异化测试(Layered / Hexagonal / Clean / COLA / CQRS / Event Sourcing)
- 测试驱动领域设计(TDDD)方法论
- Mock 策略选择(Mock Ports / Capture Events / Real DB)
- CI/CD 三阶段流水线 + N+1 查询检测 + ArchUnit 架构测试
- 测试覆盖率目标设定 + 分支覆盖率检查
⚠️ 需要条件
- 已有 DDD 项目代码或正在设计领域模型
- 已有测试框架(JUnit / Mockito / Spring Test / Testcontainers)
- 理解 DDD 战术模式(Entity / VO / Aggregate / Repository / Domain Event)
❌ 超出范围(不适用场景)
- 非 DDD 项目测试——标准测试框架(JUnit / pytest / Jest)
- 纯前端测试——Cypress / Playwright / Vitest
- 性能 / 负载 / 安全测试——JMeter / k6 / OWASP ZAP
- 特定语言的测试教程——概念和模式与语言无关
- 非 DDD 项目的 CI/CD 配置
适用对象
本技能面向:后端开发人员(实现 DDD 架构)、软件架构师(评估和选择模式)、技术负责人(审查团队实现),以及 DDD 初学者(学习领域驱动设计基础知识)。
规则
- DDD 测试金字塔必须优先覆盖 Domain 层测试(占总测试数的 60%)。
- Domain 层测试绝不能 Mock Domain Service 或 Aggregate Root——只 Mock 外部端口。
- Repository 集成测试必须使用 Testcontainers 和真实数据库,绝不能使用 Mock。
- Event Sourcing 项目必须包含事件重放和投影测试。
- 架构合规测试(ArchUnit)必须在 CI 流水线中运行。
DDD 测试金字塔
DDD 金字塔与经典金字塔的关键区别:Domain 层(VO + AR + DS)占 60%,是测试核心。
╱ E2E Tests ╲ ← 10%
╱──────── API Integration ────────╲ ← 10%
╱────── Repository Integration ──────╲ ← 10%
╱─────── Application Service ─────────╲ ← 10%
╱──────── Domain Service Tests ──────────╲ ← 15%
╱────────── Aggregate Root Tests ───────────╲ ← 25%
╱──────────── Value Object Tests ──────────────╲ ← 15%
各层测试策略
① 值对象测试(纯函数)
@Test void money_should_prevent_negative_amount() {
assertThrows(IllegalArgumentException.class, () -> new Money(-1.0, "CNY")); }
@Test void money_add_should_sum_same_currency() {
assertEquals(new Money(30.0, "CNY"), new Money(10.0, "CNY").add(new Money(20.0, "CNY"))); }
覆盖:构造验证、运算逻辑、等值比较、不变式。
② 聚合根测试(核心业务逻辑)
class OrderPayTest {
@Test void pay_changes_status_to_paid_when_draft() { ... }
@Test void pay_emits_orderPaidEvent() { ... }
@Test void pay_fails_when_already_paid() { ... }
@Test void pay_fails_when_cancelled() { ... } }
覆盖:为每个状态转移单独编写测试类 → 正常路径 + 边界条件 + 不变量 + 事件。
③ 领域服务测试(Mock Repository,捕获事件)
@Test void pricing_service_applies_vip_discount() {
when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order));
pricingService.calculatePrice(order.getId());
assertEquals(new Money(90.0, "CNY"), order.getTotalAmount()); }
Mock 原则:只 Mock Repository / Gateway(Interface),不 Mock Domain Service 或 Aggregate Root。
④ 应用服务 + ⑤ Repository + ⑥ 适配器测试
@Test void place_order_creates_and_saves() {
var orderId = handler.handle(new PlaceOrderCommand("cust-123", ...));
assertNotNull(orderId); }
@SpringBootTest @Testcontainers
class OrderRepositoryImplTest {
@Test void persists_and_retrieves_complete_aggregate() { ... } }
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class OrderControllerTest {
@Test void post_orders_returns_201() { ... }
@Test void post_invalid_product_returns_400() { ... } }
App Service:Mock 所有外部端口。Repository:Testcontainers + 真实 DB。Adapter:MockMvc + 真实 DB。
Mock 策略矩阵
| 测试目标 | Repository | Gateway | EventBus | External |
|---|---|---|---|---|
| Value Object | N/A | N/A | N/A | N/A |
| Aggregate Root | N/A | N/A | Capture | N/A |
| Domain Service | Mock | Mock | Capture | Mock |
| Application Service | Mock | Mock | Mock | Mock |
| Repository Integration | Real DB | N/A | N/A | N/A |
| API Integration | Real DB | Mock | Mock | Mock |
| E2E | Real DB | Real | Real | Real |
| 原则:Domain 层不需要 Mock;只 Mock 接口(Port),不 Mock 实现类;领域事件采用 Capture 模式。 |
各架构的测试差异
| 架构 | 测试重点 | 差异说明 |
|---|---|---|
| Layered | Aggregate Root + Repository | Domain 层全面测试(60%+) |
| Hexagonal | Port Mock + Adapter Integration | Mock 接口即可 Mock 整个外部系统 |
| Clean | Entity + UseCase Interactor | UseCase 层 Mock 输出端口 |
| COLA | Domain + App Service | Domain 零依赖;额外测试 CQRS 分流 |
| CQRS | Command + Query Read Model | 写模型采用聚合测试;读模型直接查询视图 |
| Event Sourcing | Event Replay + Projection | 必须测试聚合重放;测试投影读模型 |
测试驱动领域设计(TDDD)
四步工作流:RED → GREEN → REFACT → REPEAT
@Test void tddd_order_should_not_allow_paying_twice() {
Order order = Order.create(customerId, items);
order.pay(mockGateway);
assertThrows(OrderException.class, () -> order.pay(mockGateway)); }
public void pay(PaymentGateway gateway) {
if (this.status == OrderStatus.PAID) throw new OrderException("Already paid");
this.status = OrderStatus.PAID;
addDomainEvent(new OrderPaidEvent(this.getId())); }
测试覆盖率目标
| 层 | 目标 | 关键覆盖点 |
|---|---|---|
| Value Object | ≥ 95% | 构造验证、运算逻辑、等值比较 |
| Aggregate Root | ≥ 95% | 状态转移(每条路径)、领域事件 |
| Domain Service | ≥ 90% | 跨实体编排、外部数据计算 |
| Application | ≥ 80% | Use Case 完整路径 + 异常路径 |
| Repository | ≥ 80% | 聚合完整性、N+1 查询 |
| Adapter (API) | ≥ 70% | 协议转换、错误映射 |
| 建议优先追踪分支覆盖率,Domain 层达到 ≥ 90%。 |
常见陷阱
- 只测应用服务,不测领域层 — DDD 的核心是领域层。
- Mock 领域服务 — 不应 Mock 领域服务。
- 聚合根只测 Happy Path — 必须覆盖不变式违反和边界条件。
- 把 Repository 测试当作 E2E — Repository 只验证持久化。
- 忘记事件重放测试 — 这是最隐蔽的 bug 来源。
- 测试与实现耦合 — 测试行为,而非内部细节。
- 不测试领域事件 — 每个业务方法都应验证事件是否发布。
- Mock DB,而不用 Testcontainers — 始终使用真实数据库。
- 不测试 CQRS 的 Query 端 — Command 和 Query 端的策略完全不同。
- 不检测 N+1 查询 — 在 CI 中集成 SQL 计数检测。
- E2E 测试太多 — 只保留 3-5 个关键旅程。
- 忘记 ArchUnit — 依赖方向合规性应自动检查。
常见问题
| 问题 | 回答 |
|---|---|
| 聚合根测试需要 Spring 吗? | 不需要。它是纯 POJO,直接使用 JUnit + AssertJ 即可。 |
| Repository 应 Mock 还是真实 DB? | 领域服务使用 Mock;Repository 使用真实 DB。 |
| 如何测试 CQRS 的 Query 端? | 直接访问读模型,无需 Mock。 |
| Event Sourcing 必须进行哪些测试? | 事件重放:给定事件序列 → 重放 → 验证状态。 |
| 如何避免 N+1 查询? | 集成 SQLStatementCountValidator。 |
| TDDD 和传统 TDD 有什么区别? | TDDD 以“领域行为/状态转移”为单元。 |
关键词
DDD 测试,测试金字塔,聚合根测试,值对象测试,领域服务测试,Repository 测试,应用服务测试,适配器测试,CQRS 测试,Event Sourcing 测试,TDDD,Mock 策略,Testcontainers,ArchUnit,N+1 测试,领域事件测试,分支覆盖率,CI/CD 测试,集成测试,E2E 测试,事件重放测试
参考资料
| 文件 | 用途 |
|---|---|
| references/testing.md | 测试金字塔 + 各层 TypeScript 示例 |
| references/mock-integration-patterns.md | Mock 实现 + Java 集成测试 |
| references/clean-ddd-hexagonal-testing.md | Clean/Hexagonal/DDD 多层测试 |
| references/unit-testing-strategies.md | VO/AR/DS 单元测试 + 状态转移 |
| references/integration-test-strategies.md | Repository/API 集成测试 + N+1 |
| references/cqrs-event-sourcing-testing.md | CQRS + ES 重放/投影/快照测试 |
| references/test-coverage-targets.md | 覆盖率目标 + 分支覆盖率 + JaCoCo |
| references/ci-cd-test-stages.md | CI/CD 三阶段 + GitHub Actions |
| references/architecture-testing-comparison.md | 各架构的测试差异 + 项目阶段策略 |
| references/test-driven-domain-design.md | TDDD 四步工作流 + 完整案例 |
示例
| 文件 | 用途 |
|---|---|
| examples/domain-test-examples.md | VO + AR + DS 完整测试示例 |
| examples/app-adapter-test-examples.md | App Service + Adapter + E2E |
| examples/cqrs-es-test-examples.md | CQRS + ES 重放/投影/快照测试 |
| examples/builder-mock-patterns.md | Builder + Mock Repository/EventPublisher |
| examples/architecture-test-examples.md | ArchUnit 架构测试(分层/聚合隔离) |
安全与保障
此技能仅包含文档,不包含可执行脚本,不收集用户数据,也不访问外部服务或网络。
DDD 技能之旅
📍 你在这里:
ddd-testing-strategist— 第 6 步 ← 上一步:转到ddd-domain-designer技能(安装:npx skills add full-stack-skills/ddd-skills --skill ddd-domain-designer)。 → 下一步:转到ddd-devops-integration技能(安装:npx skills add full-stack-skills/ddd-skills --skill ddd-devops-integration)。 🔗 相关:转到ddd-code-reviewer技能(安装:npx skills add full-stack-skills/ddd-skills --skill ddd-code-reviewer) |ddd-cqrs-architecture技能(安装:npx skills add full-stack-skills/ddd-skills --skill ddd-cqrs-architecture)。 🏠 首页:转到ddd-architecture-awesome技能(安装:npx skills add full-stack-skills/ddd-skills --skill ddd-architecture-awesome)。