SuperAPI AI 工具集

dotnet-testing-strategy

测试与质量

查看项目

更新于 10-16 09:46

技能介绍

用途:为 .NET 应用选择测试类型、组织测试项目并挑选测试替身。技能不涉及测试项目脚手架、覆盖率与变异测试工具、CI 报告与流水线集成(分别参见 dotnet-add-testing、dotnet-test-quality、dotnet-gha-build-test/dotnet-ado-build-test)。建议先运行 dotnet-project-analysis 了解解决方案结构。

决策框架:代码是否依赖外部基础设施(数据库、HTTP 服务、文件系统、消息代理)?是,则看该基础设施行为是否对正确性关键;关键且需完整应用栈(中间件、认证、路由)则用 E2E/功能测试(WebApplicationFactory 或 Playwright),关键但不需要完整栈则用集成测试(WebApplicationFactory 或 Testcontainers);非关键则用带测试替身的单元测试。否,则纯逻辑(计算、转换、校验)用无替身的单元测试,其余用带替身的单元测试。

各类测试定位:单元测试无基础设施、单测 <10ms,适用于纯逻辑、领域规则、值对象、转换、校验器;集成测试用真实基础设施、100ms–5s,适用于仓储查询、API 契约、序列化往返、中间件行为;E2E 用完整栈、1–30s,仅覆盖关键用户流与少数关键失败场景。业务逻辑优先单元测试,基础设施边界用集成测试(mock 的 DbContext 不能证明 LINQ 生成有效 SQL),E2E 少而精。测试金字塔可依应用复杂度调整。

项目组织:在 tests/ 下镜像 src/ 结构,后缀区分类型,如 MyApp.Domain.UnitTests、MyApp.Api.IntegrationTests、MyApp.Api.FunctionalTests。一个生产类对应一个测试类,可按方法拆分(如 OrderService_CreateTests)。命名用 Method_Scenario_ExpectedBehavior,或 Should_Expected_When_Scenario、Given_When_Then 之一并保持一致。测试遵循 Arrange-Act-Assert,三段无法清晰划分就拆测试。

测试替身:桩返回固定数据;mock 验证交互;fake 是可用的轻量真实实现(内存仓储);spy 记录调用后再断言。需验证调用方式且要真实实现选 spy,仅验证交互选 mock,需真实行为选 fake,否则用桩。领域重的应用优先 fake;mock 过多是测试坏味道;集成边界优先真实基础设施。

反模式与要点:不要测实现细节、避免过多 mock 设置、避免不确定(时间、随机、网络)测试,时间相关逻辑注入 .NET 8+ 的 TimeProvider 并用 FakeTimeProvider。测试行为而非实现,每个测试一个逻辑断言,测试相互独立,命名自解释,按风险匹配测试类型。不要 mock 不拥有的类型(HttpClient、DbContext),不要重复创建测试项目,不要在测试中 Thread.Sleep,不要直接测私有方法,不要在集成测试中硬编码连接串。