关于 csharp-nunit
面向 .NET 开发者的 NUnit 单元测试编写指南,涵盖常规测试与数据驱动测试,并提供结构、断言、隔离和组织方面的约定。
主要功能
- 01AAA 测试结构
- 02测试命名与 Fixture 约定
- 03数据驱动测试属性
- 04断言使用建议
- 05Setup 与 Teardown 模式
- 06模拟依赖与测试隔离
适用场景
- 01创建独立的 NUnit 测试项目
- 02为 .NET 代码编写聚焦的单元测试
- 03添加参数化测试用例
- 04组织跨测试的 Setup 与 Teardown
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ github/ awesome-copilot --skill csharp-nunit安装后在 Claude Code 中输入/csharp-nunit确认已加载。
详细介绍
NUnit 最佳实践
你的目标是帮助我使用 NUnit 编写有效的单元测试,涵盖标准测试和数据驱动测试两种方式。
项目设置
- 使用单独的测试项目,命名约定为
[ProjectName].Tests - 引用 Microsoft.NET.Test.Sdk、NUnit 和 NUnit3TestAdapter 包
- 创建与被测类匹配的测试类(例如,为
Calculator创建CalculatorTests) - 使用 .NET SDK 测试命令:
dotnet test来运行测试
测试结构
- 将
[TestFixture]特性应用于测试类 - 将
[Test]特性用于测试方法 - 遵循 Arrange-Act-Assert(AAA)模式
- 使用
MethodName_Scenario_ExpectedBehavior模式命名测试 - 使用
[SetUp]和[TearDown]进行每个测试的 setup 和 teardown - 使用
[OneTimeSetUp]和[OneTimeTearDown]进行每个类的 setup 和 teardown - 使用
[SetUpFixture]进行程序集级别的 setup 和 teardown
标准测试
- 保持测试聚焦于单一行为
- 避免在一个测试方法中测试多个行为
- 使用表达意图的清晰断言
- 仅包含验证测试用例所需的断言
- 使测试独立且幂等(可以按任意顺序运行)
- 避免测试间的相互依赖
数据驱动测试
- 使用
[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>测试异常 - 在断言中使用描述性消息,以便在失败时更清晰
Mock 与隔离
- 考虑将 Moq 或 NSubstitute 与 NUnit 一起使用
- Mock 依赖项以隔离被测单元
- 使用接口以便于 Mock
- 考虑使用 DI 容器处理复杂的测试设置
测试组织
- 按功能或组件对测试进行分组
- 使用
[Category("CategoryName")]进行分类 - 在必要时使用
[Order]控制测试执行顺序 - 使用
[Author("DeveloperName")]表明归属 - 使用
[Description]提供额外的测试信息 - 对于不应自动运行的测试,考虑使用
[Explicit] - 使用
[Ignore("Reason")]临时跳过测试
评论
支持 Markdown