SuperAPI AI 工具集

dotnet-test-frameworks

测试与质量

查看项目

更新于 10-15 18:31

技能介绍

用途

本技能是一份 .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+。
  • 资料未提供收费、价格、平台或效果相关信息。