SuperAPI AI 工具集

dotnet-integration-testing

测试与质量

查看项目

更新于 10-16 01:09

技能介绍

用途:为 .NET 应用编写集成测试,使用真实基础设施而非替身,覆盖进程内 API 测试、容器化可弃置基础设施、数据库 fixture 管理与测试隔离。

前提:测试项目已通过 dotnet-add-testing 脚手架创建并引用集成测试包;Docker 守护进程需运行(Testcontainers 要求);基线为 .NET 8.0+,Testcontainers 3.x+,.NET Aspire 9.0+。Microsoft.AspNetCore.Mvc.Testing 的包版本需与目标框架主版本匹配(net8.0 用 8.x,net9.0 用 9.x,net10.0 用 10.x)。文中示例使用 Testcontainers 4.x API,模式同样适用于 3.x,仅命名空间略有差异。

主要能力与用法:WebApplicationFactory 通过 WebApplicationFactory<TEntryPoint> 创建进程内测试服务器,测试直接发 HTTP 请求,完整走中间件、路由、模型绑定与序列化,无网络开销。Program 类需对测试项目可见,可设为 public 或加 InternalsVisibleTo 程序集特性。可用 WithWebHostBuilder 或自定义工厂的 ConfigureWebHost 覆盖服务、配置与中间件,如替换 IEmailSender、替换 DbContext 连接;认证端点可通过自定义 TestAuthHandler 注入声明。

Testcontainers 在 Docker 中启动真实基础设施,每次测试运行获得全新可弃置环境,提供 Testcontainers.PostgreSql、Testcontainers.MsSql、Testcontainers.Redis 等模块。常见模式是组合使用:Testcontainers 提供数据库,WebApplicationFactory 承载 API。

.NET Aspire 测试使用 DistributedApplicationTestingBuilder(包 Aspire.Hosting.Testing)构建并启动多服务拓扑,通过 CreateHttpClient 访问服务,并可等待资源健康(WaitForResourceHealthyAsync)。

数据库 fixture 与隔离:事务回滚方式最快、隔离性高、复杂度低,适合大多数场景;当被测代码自行提交事务导致回滚不可行时,可用 Respawn 在各测试间重置数据库状态,需先执行迁移或 EnsureCreated 以便识别待清理表,并忽略 __EFMigrationsHistory。

限制:测试项目脚手架、测试策略与类型选择、API 响应结构的快照测试分别由其他技能负责,不在本技能范围内。Testcontainers 依赖 Docker 守护进程。Aspire 相关 API 与版本假设基于文中所列版本,其他版本可能不同。具体价格、性能数据、完整平台支持范围暂未提供。