dotnet-test-frameworks
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese.NET Test Framework Reference
.NET 测试框架参考
Language-specific detection patterns for .NET test frameworks (MSTest, xUnit, NUnit, TUnit).
针对.NET测试框架(MSTest、xUnit、NUnit、TUnit)的语言专属检测模式。
Test File Identification
测试文件识别
| Framework | Test class markers | Test method markers |
|---|---|---|
| MSTest | | |
| xUnit | (none — convention-based) | |
| NUnit | | |
| TUnit | | |
| 框架 | 测试类标记 | 测试方法标记 |
|---|---|---|
| MSTest | | |
| xUnit | (无,基于约定识别) | |
| NUnit | | |
| TUnit | | |
Assertion APIs by Framework
各框架断言API
| Category | MSTest | xUnit | NUnit |
|---|---|---|---|
| Equality | | | |
| Boolean | | | |
| Null | | | |
| Exception | | | |
| Collection | | | |
| String | | | |
| Type | | | |
| Inconclusive | | skip via | |
| Fail | | | |
Third-party assertion libraries: (Shouldly), (FluentAssertions / AwesomeAssertions), (Verify).
Should*.Should()Verify()| 分类 | MSTest | xUnit | NUnit |
|---|---|---|---|
| 相等判断 | | | |
| 布尔判断 | | | |
| 空值判断 | | | |
| 异常判断 | | | |
| 集合判断 | | | |
| 字符串判断 | | | |
| 类型判断 | | | |
| 不确定结果 | | 通过 | |
| 强制失败 | | | |
第三方断言库:(Shouldly)、(FluentAssertions / AwesomeAssertions)、(Verify)。
Should*.Should()Verify()Sleep/Delay Patterns
睡眠/延迟模式
| Pattern | Example |
|---|---|
| Thread sleep | |
| Task delay | |
| SpinWait | |
| 模式 | 示例 |
|---|---|
| 线程睡眠 | |
| 任务延迟 | |
| 自旋等待 | |
Skip/Ignore Annotations
跳过/忽略注解
| Framework | Annotation | With reason |
|---|---|---|
| MSTest | | |
| xUnit | | (reason is required) |
| NUnit | | (reason is required) |
| TUnit | | (reason is required) |
| Conditional | | (no reason possible) |
| 框架 | 注解 | 支持填写原因 |
|---|---|---|
| MSTest | | |
| xUnit | | (必须填写原因) |
| NUnit | | (必须填写原因) |
| TUnit | | (必须填写原因) |
| 条件编译 | | (无法填写原因) |
Exception Handling — Idiomatic Alternatives
异常处理——惯用替代方案
When a test uses / to verify exceptions, suggest the framework-native alternative:
trycatchMSTest:
csharp
// Instead of try/catch (matches exact type):
var ex = Assert.ThrowsExactly<InvalidOperationException>(
() => processor.ProcessOrder(emptyOrder));
Assert.AreEqual("Order must contain at least one item", ex.Message);
// Or (also matches derived types):
var ex = Assert.Throws<InvalidOperationException>(
() => processor.ProcessOrder(emptyOrder));
Assert.AreEqual("Order must contain at least one item", ex.Message);xUnit:
csharp
var ex = Assert.Throws<InvalidOperationException>(
() => processor.ProcessOrder(emptyOrder));
Assert.Equal("Order must contain at least one item", ex.Message);NUnit:
csharp
var ex = Assert.Throws<InvalidOperationException>(
() => processor.ProcessOrder(emptyOrder));
Assert.That(ex.Message, Is.EqualTo("Order must contain at least one item"));当测试使用/验证异常时,推荐使用框架原生的替代方案:
trycatchMSTest:
csharp
// 替代try/catch(匹配 exact 类型):
var ex = Assert.ThrowsExactly<InvalidOperationException>(
() => processor.ProcessOrder(emptyOrder));
Assert.AreEqual("Order must contain at least one item", ex.Message);
// 或者(也匹配派生类型):
var ex = Assert.Throws<InvalidOperationException>(
() => processor.ProcessOrder(emptyOrder));
Assert.AreEqual("Order must contain at least one item", ex.Message);xUnit:
csharp
var ex = Assert.Throws<InvalidOperationException>(
() => processor.ProcessOrder(emptyOrder));
Assert.Equal("Order must contain at least one item", ex.Message);NUnit:
csharp
var ex = Assert.Throws<InvalidOperationException>(
() => processor.ProcessOrder(emptyOrder));
Assert.That(ex.Message, Is.EqualTo("Order must contain at least one item"));Mystery Guest — Common .NET Patterns
神秘访客(Mystery Guest)——常见.NET模式
| Smell indicator | What to look for |
|---|---|
| File system | |
| Database | |
| Network | |
| Environment | |
| Acceptable | |
| 坏味道指标 | 排查点 |
|---|---|
| 文件系统 | 带硬编码路径的 |
| 数据库 | |
| 网络请求 | 未重写 |
| 环境变量 | |
| 可接受用法 | |
Integration Test Markers
集成测试标记
Recognize these as integration tests (adjust smell severity accordingly):
- Class name contains ,
Integration,E2E, orEndToEndAcceptance - (MSTest)
[TestCategory("Integration")] - (xUnit)
[Trait("Category", "Integration")] - (NUnit)
[Category("Integration")] - Project name ending in or
.IntegrationTests.E2ETests
以下特征可识别为集成测试(对应调整坏味道严重等级):
- 类名包含、
Integration、E2E或EndToEndAcceptance - (MSTest)
[TestCategory("Integration")] - (xUnit)
[Trait("Category", "Integration")] - (NUnit)
[Category("Integration")] - 项目名以或
.IntegrationTests结尾.E2ETests
Setup/Teardown Methods
Setup/Teardown 方法
| Framework | Setup | Teardown |
|---|---|---|
| MSTest | | |
| xUnit | constructor | |
| NUnit | | |
| MSTest (class) | | |
| NUnit (class) | | |
| xUnit (class) | | fixture's |
| 框架 | Setup | Teardown |
|---|---|---|
| MSTest | | |
| xUnit | 构造函数 | |
| NUnit | | |
| MSTest(类级别) | | |
| NUnit(类级别) | | |
| xUnit(类级别) | | fixture 的 |