测试架构总览:三层测试金字塔与 23 个测试文件全景

📑 目录

这是「GSD 全景代码解析」专题的第 48 篇。

一、GSD 测试哲学

在 AI Agent 工具链中,测试不仅是 Bug 捕获网,更是架构契约的强制执行者。GSD 的测试体系围绕一个核心信念构建:如果代码难以测试,说明架构需要重构

graph TD
    A[测试金字塔] --> B[单元测试
70%] A --> C[集成测试
20%] A --> D[E2E 测试
10%] B --> E[快速反馈] C --> F[组件协作] D --> G[用户旅程]

二、三层测试架构

2.1 单元测试层(tests/unit/)

覆盖所有核心模块的纯逻辑单元:

tests/unit/
├── commands/
│   ├── new-project.test.js      # 项目初始化逻辑
│   ├── plan-phase.test.js       # 规划阶段解析
│   └── execute-phase.test.js    # 执行阶段调度
├── parsers/
│   ├── plan-parser.test.js      # plan.json 解析
│   └── prompt-builder.test.js   # 提示词构建
├── core/
│   ├── state-machine.test.js    # 状态机转换
│   ├── context-engine.test.js   # 上下文管理
│   └── agent-delegator.test.js  # Agent 委托逻辑
└── utils/
    ├── git-utils.test.js        # Git 操作工具
    ├── file-utils.test.js       # 文件系统工具
    └── template-utils.test.js   # 模板处理工具

设计原则

  • 每个测试文件对应一个源文件
  • 使用 Jest 的 describe 按功能分组
  • Mock 外部依赖(文件系统、Git、LLM API)
  • 单测试执行时间 < 100ms

2.2 集成测试层(tests/integration/)

验证组件间的协作:

tests/integration/
├── workflow/
│   ├── execute-phase.integration.test.js
│   ├── plan-phase.integration.test.js
│   └── verify-work.integration.test.js
├── sdk/
│   ├── phase-runner.integration.test.js
│   ├── hook-system.integration.test.js
│   └── query-layer.integration.test.js
└── agent/
    ├── planner-executor.integration.test.js
    └── reviewer-verifier.integration.test.js

关注点

  • 数据流完整性(输入 → 处理 → 输出)
  • 错误传播链路
  • 状态持久化与恢复
  • 并发安全性

2.3 E2E 测试层(tests/e2e/)

模拟完整用户旅程:

tests/e2e/
├── project-lifecycle/
│   ├── new-project-to-deploy.test.js
│   ├── plan-to-execute.test.js
│   └── full-cycle-with-audit.test.js
├── cli/
│   ├── command-invocation.test.js
│   └── error-handling.test.js
└── regression/
    ├── issue-42-repro.test.js
    └── issue-78-repro.test.js

三、23 个测试文件全景

#文件层级覆盖范围优先级
1plan-parser.test.js单元plan.json 解析P0
2prompt-builder.test.js单元动态提示词构建P0
3state-machine.test.js单元状态转换逻辑P0
4context-engine.test.js单元上下文截断与注入P0
5agent-delegator.test.js单元Agent 选择与调用P0
6new-project.test.js单元项目初始化P1
7plan-phase.test.js单元规划阶段逻辑P1
8execute-phase.test.js单元执行阶段调度P1
9git-utils.test.js单元Git 操作封装P1
10file-utils.test.js单元文件读写工具P1
11template-utils.test.js单元模板渲染P2
12phase-runner.integration.test.js集成Phase 执行引擎P0
13hook-system.integration.test.js集成钩子注册与触发P0
14query-layer.integration.test.js集成查询接口P1
15planner-executor.integration.test.js集成Planner→Executor 链路P1
16reviewer-verifier.integration.test.js集成Reviewer→Verifier 链路P1
17new-project-to-deploy.test.jsE2E完整项目生命周期P0
18plan-to-execute.test.jsE2E规划到执行流程P1
19full-cycle-with-audit.test.jsE2E含审计的完整流程P1
20command-invocation.test.jsE2ECLI 命令调用P1
21error-handling.test.jsE2E错误恢复流程P2
22drift-detection.test.js专项配置漂移检测P1
23security-audit.test.js专项安全规则验证P1

四、测试策略选择矩阵

场景推荐层级原因
新增纯函数工具单元无副作用,易于断言
修改 Agent 调用链集成需要验证协作逻辑
新增 CLI 命令E2E验证用户交互完整性
重构状态管理单元+集成既要验证逻辑,又要验证持久化
修复并发 Bug集成+压力需要模拟并发场景

五、Mock 策略

// LLM API Mock
jest.mock('../src/llm/client', () => ({
  invoke: jest.fn(async (prompt) => {
    // 返回确定性响应,确保测试可重复
    return { content: mockResponses[prompt.type] };
  })
}));

// 文件系统 Mock
jest.mock('fs/promises', () => ({
  readFile: jest.fn(async (path) => mockFs[path]),
  writeFile: jest.fn(async (path, data) => { mockFs[path] = data; }),
  mkdir: jest.fn(async () => {})
}));

// Git Mock
jest.mock('../src/utils/git', () => ({
  commit: jest.fn(async (msg) => ({ hash: 'abc123' })),
  getStatus: jest.fn(async () => ({ modified: [], untracked: [] }))
}));

六、覆盖率目标

单元测试:  statements 85% | branches 80% | functions 90% | lines 85%
集成测试:  statements 60% | branches 50% | functions 70% | lines 60%
E2E 测试:   关键用户旅程 100% 覆盖

七、CI 集成

# .github/workflows/test.yml
jobs:
  test:
    strategy:
      matrix:
        tier: [unit, integration, e2e]
    steps:
      - run: npm test -- --testPathPattern=tests/${{ matrix.tier }}/
      - uses: codecov/codecov-action@v3

单元测试每次提交触发,集成测试每小时触发,E2E 测试每天触发。


下一篇预告: 第 49 篇《关键测试解析(上):Plan Parser、State Machine、Agent Delegator》

我们将深入解读测试金字塔中最核心的 11 个单元测试文件,解析它们的测试策略、边界条件覆盖和 Mock 设计。单元测试是 GSD 质量体系的基石,敬请期待。