没有人会兴奋地醒来写单元测试。但每个人都有在凌晨2点被一个本可以通过测试发现的bug叫醒的经历。目标并不是要让你爱上测试——而是使其变得足够无痛,以至于你真的去做它。
为什么测试会被跳过
根据 马丁·福勒的测试金字塔,开发者跳过测试的最常见原因是:时间压力、不清楚测试内容,以及认为测试会减慢开发速度。讽刺的是,跳过测试会更加减慢开发——通过调试、回归bug和对重构的恐惧。
测试什么(实用版本)
你并不需要100%的代码覆盖率。你需要覆盖重要的代码:
- 业务逻辑。 计算、验证、状态转换。如果它做出决策,就要测试它。
- 边缘情况。 空输入、边界值、null/undefined。这些是bug藏身之处。
- 集成点。 API调用、数据库查询、文件操作。模拟外部依赖,测试对响应的处理。
- 错误修复。 每个修复的bug都应该有相应的测试,这样才可以发现它。可以防止回归。
AI单元测试生成器可以从你的代码创建测试框架。粘贴一个函数,它会生成覆盖正常路径、边缘情况和错误条件的测试用例。
测试金字塔
| 级别 | 速度 | 覆盖率 | 何时使用 |
|---|---|---|---|
| 单元测试 | 毫秒 | 单个函数 | 始终。基础。 |
| 集成测试 | 秒 | 组件交互 | API端点、数据库查询 |
| E2E测试 | 分钟 | 完整用户流程 | 仅限关键路径(登录、结账) |
大多数项目需要大量单元测试、一些集成测试和少量E2E测试。金字塔形状很重要——倒置它(大量E2E,少量单元)会导致测试套件速度慢且不稳定。
编写不糟糕的测试
- 每个测试一个断言。 如果测试失败,你应该准确知道是什么坏了,而不需要阅读测试代码。
- 描述性名称。 “test_calculate_tax_with_zero_income_returns_zero”而不是“test_tax_1”。
- 安排-行动-断言。 设置数据,调用函数,检查结果。三个清晰的部分。
- 测试中不包含逻辑。 如果你的测试有if/else或循环,那就太复杂了。测试应该是无聊且明显的。
相关工具
代码生成器 — 生成可测试的代码
代码审查器 — 检查测试的完整性