SKILL.md
readonly只读
name
csharp-nunit
description
获取 NUnit 单元测试的最佳实践,包括数据驱动测试
NUnit 最佳实践
您的目标是帮助我使用 NUnit 编写有效的单元测试,涵盖标准测试和数据驱动测试方法。
项目设置
- 使用单独的测试项目,命名约定为
[ProjectName].Tests - 引用 Microsoft.NET.Test.Sdk、NUnit 和 NUnit3TestAdapter 包
- 创建与待测试类匹配的测试类(例如,
CalculatorTests对应Calculator) - 使用 .NET SDK 测试命令:
dotnet test运行测试
测试结构
- 对测试类应用
[TestFixture]属性 - 对测试方法使用
[Test]属性 - 遵循 Arrange-Act-Assert (AAA) 模式
- 使用模式
MethodName_Scenario_ExpectedBehavior命名测试 - 使用
[SetUp]和[TearDown]进行每个测试的设置和清理 - 使用
[OneTimeSetUp]和[OneTimeTearDown]进行每个类的设置和清理 - 使用
[SetUpFixture]进行程序集级别的设置和清理
标准测试
- 保持测试专注于单一行为
- 避免在一个测试方法中测试多个行为
- 使用清晰表达意图的断言
- 仅包含验证测试用例所需的断言
- 使测试独立且幂等(可以按任意顺序运行)
- 避免测试之间的依赖
数据驱动测试
- 使用
[TestCase]提供内联测试数据 - 使用
[TestCaseSource]提供程序生成的测试数据 - 使用
[Values]提供简单的参数组合 - 使用
[ValueSource]提供基于属性或方法的数据源 - 使用
[Random]提供随机数值测试数据 - 使用
[Range]提供顺序数值测试数据 - 使用
[Combinatorial]或[Pairwise]组合多个参数
断言
- 使用
Assert.That配合约束模型(推荐的 NUnit 风格) - 使用约束如
Is.EqualTo、Is.SameAs、Contains.Item - 使用
Assert.AreEqual进行简单的值相等性检查(经典风格) - 使用
CollectionAssert进行集合比较 - 使用
StringAssert进行字符串特定的断言 - 使用
Assert.Throws<T>或Assert.ThrowsAsync<T>测试异常 - 在断言中使用描述性消息,以便在失败时清晰明了
模拟和隔离
- 考虑在 NUnit 旁边使用 Moq 或 NSubstitute
- 模拟依赖项以隔离被测单元
- 使用接口以方便模拟
- 考虑使用 DI 容器处理复杂的测试设置
测试组织
- 按功能或组件分组测试
- 使用
[Category("CategoryName")]进行分类 - 必要时使用
[Order]控制测试执行顺序 - 使用
[Author("DeveloperName")]指示所有权 - 使用
[Description]提供额外的测试信息 - 考虑使用
[Explicit]标记不应自动运行的测试 - 使用
[Ignore("Reason")]临时跳过测试






