| name | testing |
| description | 测试方法(语言无关)——TDD、测试金字塔、Mock 原则、覆盖率哲学、反模式。具体测试工具(Vitest / pytest)见所用预设。 |
测试方法
这是通用方法,不绑定测试框架。具体工具与可运行示例见所用预设:
- web-fullstack:
.agents/rules/testing.md + .agents/specs/testing.md(Vitest / Playwright)
- ai-app:
lang/python/specs/python.md(pytest)/ lang/typescript/specs/typescript.md(Vitest)
TDD 核心循环:Red-Green-Refactor
- Red — 写一个定义行为的失败测试
- Green — 写最少代码让测试通过
- Refactor — 保持测试绿色的同时清理代码
每个循环 2-10 分钟。不写没有失败测试的生产代码。
测试结构:AAA
Arrange(准备数据/依赖)
Act (执行被测行为)
Assert (断言结果)
命名:描述功能 > 应该在[条件]时[行为](中文/英文均可,全项目统一)。
测试金字塔
| 层级 | 范围 | 速度 | 依赖 | 比例 |
|---|
| 单元 | 单函数/类 | 最快 | 无(全 mock/fake) | ~70% |
| 集成 | 模块边界 | 中 | 真实 DB/FS | ~20% |
| E2E | 完整用户流 | 慢 | 全栈 | ~10% |
底层多、顶层少。E2E 贵且脆,只覆盖核心流程。
必测边界
空值 / null / undefined、空集合、零值/负值/最大值、权限不足、并发竞态、外部依赖失败。
Mock 原则
- 在边界 mock:HTTP 客户端、数据库、文件系统、时钟、外部 API
- 不 mock 被测单元本身
- 优先 fake(内存实现) 而非繁琐的 mock
- 断言行为/结果,不要断言"mock 被调了几次"(脆弱)
- 每个测试后重置共享状态
进阶测试类型(按需,概念)
| 类型 | 何时用 | 工具见预设 |
|---|
| 集成测试(真实依赖) | 验证 DB/外部交互 | Testcontainers / pytest fixtures |
| 契约测试 | 服务间接口约定 | Pact 等 |
| 属性测试 | 输入空间大、有不变量 | fast-check / hypothesis |
| 快照测试 | UI/序列化输出 | 框架自带(review 时仔细看 diff) |
覆盖率哲学
- 覆盖率是下限信号,不是目标。常用门槛:行 >80%、分支 >70%、函数 >90%;核心业务逻辑接近 100%
- 排除生成代码、类型定义、配置
- 不为凑覆盖率写废话测试(删了代码测试还能过 = 废话测试)
- 具体覆盖率命令见预设
反模式
- 测实现细节而非行为
- 测试间共享可变状态
- 忽略 flaky 测试不修
- 直接测私有方法
- 巨大的 setup 掩盖测试意图