后端与接口
用 .NET Aspire + xUnit…
在 .NET Aspire 应用中用 xUnit 编写集成测试,通过真实容器化依赖(SQL Server、Redis、消息队列)验证服务间通信与 ASP.NET Core 应用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 .NET Aspire + xUni特定
解决思路
- 安装所需 NuGet 包:Aspire.Hosting.Testing、xunit、xunit.runner.visualstudio、Microsoft.NET.Test.Sdk。
- 在测试项目启动前添加 TestEnvironmentInitializer,用 [ModuleInitializer] 设置环境变量 DOTNET_HOSTBUILDER__RELOADCONFIGONCHANGE=false,避免 Linux 上文件描述符耗尽。
- 创建 AspireAppFixture 实现 IAsyncLifetime:在 InitializeAsync 中用 DistributedApplicationTestingBuilder.CreateAsync<Projects.YourApp_AppHost>([...]) 传入测试配置(如 YourApp:UseVolumes=false、YourApp:Environment=IntegrationTest、YourApp:Replicas=1)。
- 调用 builder.BuildAsync() 构建应用,再用 CancellationTokenSource(如 10 分钟)调用 _app.StartAsync() 启动。
- 启动后用另一个 CancellationTokenSource(如 5 分钟)调用 _app.ResourceNotifications.WaitForResourceHealthyAsync("api", token) 等待服务健康。
- 提供 GetEndpoint(resourceName, scheme) 方法,通过 _app.GetEndpoint(...) 动态获取端点,绝不硬编码 URL。
- 在 DisposeAsync 中调用 _app.DisposeAsync() 正确释放资源。
- 用 [CollectionDefinition("Aspire collection")] 定义集合,配合 ICollectionFixture<AspireAppFixture> 共享 fixture,减少测试执行时间并避免端口冲突。
- 在测试类上标注 [Collection("Aspire collection")],通过构造函数注入 fixture,用 _fixture.App.CreateHttpClient("yourapp") 发起请求并断言状态码。
- 让 Aspire 动态分配端口(127.0.0.1:0)以避免冲突。
- 使用真实依赖(数据库、缓存)而非 mock。
- 用 xUnit 集合控制测试并行化,相关测试串行执行。
- 始终等待健康检查通过后再运行测试,不要用 Task.Delay() 代替健康检查轮询。
- 通过 GetConnectionStringAsync() 动态获取连接字符串,而不是硬编码。
- 用 Respawn 重置数据库,保证测试隔离。
- 结合 Playwright 做 UI 测试,连接 Aspire 编排的真实后端。
- 测试消息队列时验证异步消息传递。
- 用条件资源配置覆盖测试专用设置。
- 测试失败时查看 Aspire Dashboard(http://localhost:15888)。
- 用 Aspire CLI 配合 MCP 让 AI 助手查询真实应用状态。
- 设置 ASPIRE_ALLOW_UNSECURED_TRANSPORT=true 启用更详细日志。
- 用 docker logs 检查容器输出。
- 在 fixture 中打断点调试启动问题。
- 确保资源名称在 AppHost 与测试中一致。
- 用真实测试数据填充数据库,并测试失败场景以验证错误处理与弹性。
- 保持每个测试独立、与顺序无关,并监控测试执行时间,必要时并行化。
适用边界 · 注意事项
- 不使用 .NET Aspire 或 xUnit 的项目不适用。
- 无法运行容器化基础设施(如 SQL Server、Redis)的环境不适用。
- 需要完全隔离、无外部依赖的纯单元测试场景不适用。