9.1 测试策略总览
测试的目标不是追求覆盖率数字,而是降低修改代码时的风险。全栈项目通常需要把测试分成多个层次。
应用场景
- 业务规则频繁变化,需要防止回归。
- API 被多个前端或第三方调用,需要稳定契约。
- 数据访问逻辑复杂,需要验证查询、事务和并发行为。
- 发布前需要自动化质量门禁。
推荐分层
| 层次 | 主要对象 | 速度 | 典型工具 |
|---|---|---|---|
| 单元测试 | 纯业务逻辑、领域服务、验证器 | 快 | xUnit、FluentAssertions |
| 集成测试 | API、数据库、依赖注入、配置 | 中 | WebApplicationFactory、Testcontainers |
| 端到端测试 | 浏览器流程、关键路径 | 慢 | Playwright |
重点难点
- 不要把所有测试都写成端到端测试;它们慢且定位问题困难。
- 数据访问测试要避免依赖开发者本机数据库状态。
- 测试命名要描述业务行为,而不是方法名。
示例
public sealed class PriceCalculatorTests
{
[Fact]
public void CalculateTotal_AppliesDiscount_WhenMemberIsActive()
{
var total = PriceCalculator.CalculateTotal(100m, isActiveMember: true);
Assert.Equal(90m, total);
}
}
练习
- 为 Todo 的“已完成任务不能重复完成”规则写单元测试。
- 为
POST /todos写集成测试,验证成功和校验失败两种响应。