用途
本技能是一份 .NET 测试框架的参考数据,用于识别和对照 .NET 生态中主流测试框架的检测模式与 API 写法。覆盖的框架包括 MSTest、xUnit、NUnit 和 TUnit。它面向需要编写、审查、迁移或分析 .NET 测试代码的场景,提供跨框架的写法对照表。
主要能力
测试文件识别
按框架给出测试类与测试方法的标记方式:
- MSTest:测试类标记
[TestClass],测试方法标记[TestMethod]、[DataTestMethod]。 - xUnit:无类标记(基于约定),测试方法标记
[Fact]、[Theory]。 - NUnit:测试类标记
[TestFixture],测试方法标记[Test]、[TestCase]、[TestCaseSource]。 - TUnit:无类标记(基于约定),测试方法标记
[Test]。
断言 API 对照
按类别给出四种框架的断言写法,类别包括:相等(Equality)、布尔(Boolean)、空值(Null)、异常(Exception)、集合(Collection)、字符串(String)、类型(Type)、Inconclusive、Fail。例如相等断言:MSTest 用 Assert.AreEqual,xUnit 用 Assert.Equal,NUnit 用 Assert.That(x, Is.EqualTo(y)),TUnit 用 await Assert.That(x).IsEqualTo(y)。
第三方断言库
列出 Should*(Shouldly)、.Should()(FluentAssertions / AwesomeAssertions)、Verify()(Verify)。TUnit 还提供可选的 TUnit.Assertions.Should 包,在同一基础设施上提供 FluentAssertions 风格的 value.Should().BeEqualTo(...)。
Sleep/Delay 模式
列出 Thread sleep(Thread.Sleep(2000))、Task delay(await Task.Delay(1000))、SpinWait(SpinWait.SpinUntil(() => condition, timeout))。
跳过/忽略注解
按框架给出注解及是否支持原因:MSTest 用 [Ignore] / [Ignore("reason")];xUnit 用 [Fact(Skip = "reason")](原因必填);NUnit 用 [Ignore("reason")](原因必填);TUnit 用 [Skip("reason")](原因必填,也支持类与程序集作用域,如 [assembly: Skip("…")],并支持测试内动态跳过 Skip.Test("reason"))。条件编译用 #if false / #if NEVER(无法提供原因)。
异常处理的惯用替代
当测试用 try/catch 验证异常时,给出各框架的原生替代写法,例如 MSTest 的 Assert.ThrowsExactly<T> / Assert.Throws<T>,xUnit 的 Assert.Throws<T>,NUnit 的 Assert.Throws<T> 配合 Assert.That,TUnit 的 await Assert.That(() => ...).Throws<T>().WithMessage(...) 或 .ThrowsExactly<T>()。
Mystery Guest 常见模式
列出需要留意的信号:文件系统(File.ReadAllText、File.Exists、File.WriteAllBytes、Directory.GetFiles、硬编码路径的 Path.Combine)、数据库(SqlConnection、未使用内存提供程序的 DbContext、SqlCommand)、网络(未覆盖 HttpMessageHandler 的 HttpClient、WebRequest、TcpClient)、环境(Environment.GetEnvironmentVariable、Environment.CurrentDirectory)。可接受项包括 MemoryStream、StringReader、内存数据库提供程序、自定义 DelegatingHandler。
集成测试标记
识别集成测试的标记:类名包含 Integration、E2E、EndToEnd 或 Acceptance;[TestCategory("Integration")](MSTest);[Trait("Category", "Integration")](xUnit);[Category("Integration")](NUnit、TUnit);项目名以 .IntegrationTests 或 .E2ETests 结尾。
Setup/Teardown 方法
按框架给出方法级、类级、程序集级、会话级的初始化与清理写法。例如方法级:MSTest 用 [TestInitialize] 或构造函数、[TestCleanup] 或 IDisposable.Dispose / IAsyncDisposable.DisposeAsync;xUnit 用构造函数与 Dispose;NUnit 用 [SetUp] / [TearDown];TUnit 用 [Before(Test)] 或构造函数、[After(Test)] 或 Dispose。类级:MSTest 用 [ClassInitialize] / [ClassCleanup];NUnit 用 [OneTimeSetUp] / [OneTimeTearDown];xUnit 用 IClassFixture<T> 与 fixture 的 Dispose;TUnit 用 [Before(Class)] / [After(Class)]。TUnit 还支持程序集级 [Before(Assembly)] / [After(Assembly)] 与会话级 [Before(TestSession)] / [After(TestSession)]。
使用方式
本技能以参考数据形式提供,供在编写、审查或迁移 .NET 测试代码时对照查阅。资料未提供安装命令或调用方式。
适用场景
- 在多种 .NET 测试框架之间对照断言与注解写法。
- 审查测试代码时识别测试标记、跳过注解与 Setup/Teardown 结构。
- 识别 Mystery Guest 模式与集成测试标记,辅助判断测试类型。
- 将 try/catch 异常验证改写为框架原生断言。
限制与注意事项
- TUnit 的断言是异步的,必须 await;遗漏 await 会导致断言从不执行、测试静默通过。内置分析器会在缺少 await 时发出警告。多个断言可用
.And/.Or链式组合,或通过Assert.Multiple()分组。 - TUnit 没有真正的 inconclusive 状态,使用
Skip.Test("reason")。 - xUnit 的
Assert.Fail()需要 .NET 10+。 - 资料未提供收费、价格、平台或效果相关信息。