csharp-nunit

csharp-nunit

热门

获取 NUnit 单元测试的最佳实践,包括数据驱动测试

3.6万Star
4556Fork
更新于 2026/7/13
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.EqualToIs.SameAsContains.Item
  • 使用 Assert.AreEqual 进行简单的值相等性检查(经典风格)
  • 使用 CollectionAssert 进行集合比较
  • 使用 StringAssert 进行字符串特定的断言
  • 使用 Assert.Throws<T>Assert.ThrowsAsync<T> 测试异常
  • 在断言中使用描述性消息,以便在失败时清晰明了

模拟和隔离

  • 考虑在 NUnit 旁边使用 Moq 或 NSubstitute
  • 模拟依赖项以隔离被测单元
  • 使用接口以方便模拟
  • 考虑使用 DI 容器处理复杂的测试设置

测试组织

  • 按功能或组件分组测试
  • 使用 [Category("CategoryName")] 进行分类
  • 必要时使用 [Order] 控制测试执行顺序
  • 使用 [Author("DeveloperName")] 指示所有权
  • 使用 [Description] 提供额外的测试信息
  • 考虑使用 [Explicit] 标记不应自动运行的测试
  • 使用 [Ignore("Reason")] 临时跳过测试