四层测试技能,按测试金字塔编写和执行单元/集成/接口/系统测试,生成结构化测试报告
当需要编写测试计划、编写测试用例、执行测试、生成测试报告时使用。
process_templates/test_plan.md 模板process_templates/test_report.md 模板process_templates/test_results.json 格式测试计划必须包含以下章节:
| 章节 | 必填 | 说明 |
|---|---|---|
| 测试范围 | 是 | 覆盖哪些模块、哪些验收标准 |
| 单元测试计划 | 是 | 用例列表、覆盖目标、mock 策略 |
| 集成测试计划 | 是 | 用例列表、测试环境、依赖配置 |
| 接口测试计划 | 按需 | 端点覆盖矩阵、测试数据(项目有 API 时必选) |
| 系统测试计划 | 按需 | 场景列表、前置条件、环境要求 |
| 测试环境 |
| 是 |
| OS、运行时、依赖版本 |
测试报告按四层分别汇报,每层包含通过/失败/跳过数量和失败详情。
/ 系统测试 \ ← 少量,验证端到端场景
/ 接口测试(API) \ ← 适量,验证接口契约
/ 集成测试 \ ← 较多,验证模块协作
/ 单元测试 \ ← 大量,验证函数/类行为
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
数量比例参考:单元 > 集成 > 接口 > 系统
定义:验证单个函数、方法或类的行为,隔离所有外部依赖。
编写原则:
覆盖率定义:
| 指标 | 名称 | 定义 | 目标 |
|---|---|---|---|
| C0 | 语句覆盖 | 每条可执行语句至少被执行一次 | 100% |
| C1 | 分支覆盖 | 每个条件分支(if/else、switch case)至少各执行一次 | 100% |
覆盖率工具:
| 语言 | 覆盖率工具 | 报告格式 |
|---|---|---|
| Python | pytest-cov (coverage.py) | HTML / XML / JSON |
| C# | coverlet + ReportGenerator | Cobertura / HTML |
| TypeScript | jest --coverage / c8 | LCOV / HTML |
| Java | JaCoCo | HTML / XML |
| Go | go test -cover | HTML / func |
| Rust | cargo-tarpaulin | HTML / XML |
| C/C++ | gcov + lcov | HTML |
覆盖率排除规则:
命名规范:test_<功能>_<场景>_<预期结果>
示例场景:
框架选择:
| 语言 | 框架 | Mock 库 |
|---|---|---|
| Python | pytest | unittest.mock / pytest-mock |
| C# | xUnit | Moq / NSubstitute |
| TypeScript | jest / vitest | jest.mock / vi.mock |
| Java | JUnit 5 | Mockito |
| Go | go test | testify/mock |
| Rust | cargo test | mockall |
| C++ | Google Test | Google Mock |
定义:验证模块间的协作,测试真实或模拟的外部依赖交互。
编写原则:
测试环境:
示例场景:
定义:验证 HTTP/RPC/WebSocket 接口的请求-响应契约。
启用条件:项目暴露了 HTTP / gRPC / WebSocket / MCP 等外部接口。
编写原则:
工具选择(由 Agent 根据技术栈自动选择):
| 语言 | 工具 |
|---|---|
| Python | httpx + pytest / TestClient (FastAPI) |
| C# | WebApplicationFactory + HttpClient |
| TypeScript | supertest / pactum |
| Java | MockMvc / RestAssured |
| Go | net/http/httptest |
示例场景:
定义:端到端验证完整的业务场景,模拟真实用户操作流程。
启用条件:
编写原则:
示例场景:
每个测试场景按以下格式编写:
场景编号:TS-{层级}-{编号}
层级标记:U(单元) / I(集成) / A(接口) / S(系统)
场景描述:一句话描述测试目的
前置条件:测试执行前的环境要求
操作步骤:
1. 步骤一
2. 步骤二
预期结果:期望的输出或行为
对应验收标准:AC-{编号}
按层级顺序执行,前一层通过后再执行下一层:
# Python
pytest tests/unit/ -v --tb=short --cov=src --cov-branch --cov-report=html
pytest tests/integration/ -v --tb=short
pytest tests/api/ -v --tb=short
# C# / .NET
dotnet test --filter "Category=Unit" --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura
dotnet test --filter "Category=Integration"
# Node.js / TypeScript
npx jest tests/unit --coverage --coverageThreshold='{"global":{"statements":100,"branches":100}}'
npx jest tests/integration
# Go
go test ./tests/unit/... -v -cover -coverprofile=coverage.out
go test ./tests/integration/... -v
# Rust
cargo tarpaulin --out Html -- --test-threads=1
# Java
mvn test -Dtest="*UnitTest" -Djacoco.destFile=target/jacoco-unit.exec
{
"run_id": "TR-YYYYMMDD-001",
"project": "项目名称",
"result": "pass | fail",
"total_passed": 0,
"total_failed": 0,
"total_skipped": 0,
"layers": [
{
"layer": "unit",
"passed": 0,
"failed": 0,
"skipped": 0,
"duration_ms": 0,
"coverage": {
"c0_statement": "100%",
"c1_branch": "100%",
"excluded_files": [],
"exclusion_reason": ""
},
"cases": [
{
"name": "test_xxx",
"result": "pass | fail | skip",
"duration_ms": 0,
"error": null
}
]
},
{
"layer": "integration",
"passed": 0,
"failed": 0,
"skipped": 0,
"cases": []
},
{
"layer": "interface",
"passed": 0,
"failed": 0,
"skipped": 0,
"cases": []
},
{
"layer": "system",
"passed": 0,
"failed": 0,
"skipped": 0,
"cases": []
}
],
"failures": [
{
"test": "test_xxx",
"layer": "unit",
"error": "错误描述",
"file": "文件路径",
"line": 0
}
]
}
workflow_state.json 的 status: rollback每个验收标准(AC-{编号})必须至少被一个测试用例覆盖。在测试计划中输出映射表:
| 验收标准 | 单元测试 | 集成测试 | 接口测试 | 系统测试 |
|---|---|---|---|---|
| AC-01 | TS-U-001 | TS-I-001 | TS-A-001 | — |
| AC-02 | TS-U-002, TS-U-003 | — | TS-A-002 | TS-S-001 |