大模型应用
审查或改进测试质量时,检测测试坏味道、过度 mock…
在评审测试代码或提升测试有效性、可维护性与可靠性时,系统化识别并修复常见测试反模式。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 46/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 44/100 ×0.15
适用场景
审查或改进测试质量时,检测测试坏味道、过通用
解决思路
- 从六个核心维度评估测试:正确性(验证正确行为)、可靠性(确定性、不 flaky)、可维护性(易理解)、性能(运行快)、覆盖率(覆盖关键路径)、隔离性(不依赖外部状态)。
- 检测过度 mock:若单个测试超过 3-4 个 mock、mock 纯函数或 mock 设置过于复杂,即为坏味道;修复方式是只 mock I/O 边界(API、数据库、文件系统),不要 mock 业务逻辑或纯函数,尽量使用真实实现。
- 检测脆弱测试:避免依赖实现细节的选择器(如 `.form-container > div:nth-child(2) > button`),改用语义化选择器(如 `getByRole('button', { name: 'Submit' })`)。
- 检测 flaky 测试:避免用 `setTimeout` 等待异步(如 `await new Promise(resolve => setTimeout(resolve, 1000))`),改用正确的 async/await 处理(如 `const data = await fetchData()`)。
- 检测弱断言:避免 `expect(users).toBeDefined()` 这类过于模糊的断言,改用具体断言(如 `expect(user).toMatchObject({ id: expect.any(Number), name: 'John' })`)。
- 用覆盖率工具分析:运行 `bun test --coverage` 并打开 `coverage/index.html`;检查阈值 `bun test --coverage --coverage.thresholds.lines=80`;Python 用 `uv run pytest --cov --cov-report=html` 并打开 `htmlcov/index.html`。
- 按 FIRST 原则检查单元测试质量:Fast(毫秒级)、Isolated(测试间无依赖)、Repeatable(每次结果一致)、Self-validating(清晰的通过/失败)、Timely(与代码同步编写)。
- 遵循 mock 准则:只 mock 外部依赖、不 mock 业务逻辑或纯函数、尽可能使用真实实现、每个测试最多 3-4 个 mock。
- 设定覆盖率目标:业务逻辑行覆盖率 80%+、关键路径(认证、支付)100%、所有错误路径都测试、边界条件都测试。
- 采用 AAA 模式组织测试结构:Arrange(准备数据)、Act(执行操作)、Assert(断言结果)。
- 代码评审时逐项检查:测试验证行为而非实现、断言具体且有意义、无 flaky 测试(时序/顺序问题)、正确使用 async/await、测试名清晰描述行为、最小化代码重复、关键路径有测试、覆盖正常路径与错误场景。
- 避免测试实现细节:不要用 `vi.spyOn(Math, 'sqrt')` 后断言 `toHaveBeenCalled()`,而应断言输出结果(如 `expect(distance).toBe(5)`)。
- 避免过度 mock:不要 mock 纯函数(如 `vi.fn((a, b) => a + b)`),应导入真实实现,只 mock 外部服务(如 `mockPaymentGateway`)。
适用边界 · 注意事项
- 测试代码本身尚未编写或完全缺失时,应先补测试而非做质量分析
- 仅需快速验证功能是否可用、不关注长期可维护性的临时脚本或原型代码