用途:指导在 .NET(v3 基线 .NET 8.0+)项目中用 xUnit 编写单元测试,聚焦 v3 特性并给出与 v2 的差异说明。
主要能力:
- 测试特性:[Fact] 用于无参测试;[Theory] 配合 [InlineData]、[MemberData](支持 TheoryData<T>)、[ClassData](v3 用强类型 TheoryDataRow<T>)实现参数化。
- 测试夹具:IClassFixture 在同一测试类内共享昂贵资源,ICollectionFixture 配合 [CollectionDefinition]/[Collection] 跨测试类共享。
- 异步生命周期:IAsyncLifetime 的 InitializeAsync/DisposeAsync 在 v3 返回 ValueTask(v2 为 Task),可用于类级与逐测试的异步建/拆。
- 并行执行:默认按集合并行、集合内顺序执行;可用 [CollectionDefinition(..., DisableParallelization = true)] 禁用特定集合并行,或通过 xunit.runner.json(parallelizeAssembly、parallelizeTestCollections、maxParallelThreads)配置。
- 输出与日志:通过构造函数注入 ITestOutputHelper 输出诊断信息;可编写 ILoggerProvider 适配器将 ILogger 日志写入测试输出。
- 断言:自定义断言辅助类;v3 新增 Assert.Multiple 可聚合多条断言。
- 分析器:xunit.analyzers 在编译期提示常见错误,如 xUnit1004、xUnit1012、xUnit1025、xUnit2000 等,可在 .editorconfig 中调整严重级别。
版本差异要点:包名 v2 为 xunit,v3 为 xunit.v3;断言包在 v3 拆分为 xunit.v3.assert(或 xunit.v3.assert.source);v3 移除了 Assert 方法上的可选消息参数,改用自定义断言或 Assert.Fail()。
使用方式:需已通过 dotnet-add-testing 搭建测试项目并引用 xUnit 包,可用 dotnet-version-detection 确认 .NET 8.0+;xunit.runner.json 需设为 CopyToOutputDirectory=PreserveNewest。
限制与范围外:不涉及测试项目脚手架、测试策略决策、集成测试(WebApplicationFactory、Testcontainers)、Verify 快照测试。入门提示:夹具类须为 public 且有公共无参构造函数;构造函数注入的 ITestOutputHelper 不可用于静态成员;不要在同一方法同时标注 [Fact] 与 [Theory];异步测试应返回 Task 而非 void。