NUnit快速入门:从零搭建第一个单元测试项目

张开发
2026/4/12 17:06:03 15 分钟阅读

分享文章

NUnit快速入门:从零搭建第一个单元测试项目
NUnit快速入门从零搭建第一个单元测试项目【免费下载链接】nunitNUnit Framework项目地址: https://gitcode.com/gh_mirrors/nu/nunitNUnit是.NET平台上最流行的单元测试框架之一专为C#、F#和VB.NET等.NET语言设计。这个强大的开源测试框架支持跨平台运行能在Windows、macOS和Linux系统上完美工作为开发者提供了一套完整、灵活的测试解决方案。无论你是刚开始学习单元测试的新手还是希望升级到NUnit 4的有经验开发者本文都将为你提供完整的入门指南。 为什么选择NUnit进行单元测试NUnit框架提供了丰富的断言方法、灵活的测试组织方式和强大的测试运行器让编写和维护单元测试变得简单高效。相比其他测试框架NUnit具有以下优势跨平台兼容性支持.NET Core、.NET Framework和.NET 5/6/7丰富的断言库提供多种断言方式验证代码行为灵活的测试组织通过属性Attributes轻松组织测试用例并行测试执行支持并行运行测试以提高效率易于扩展可通过自定义属性和约束扩展功能 环境准备与安装安装NUnit包在开始之前确保你已经安装了.NET SDK。然后通过以下命令安装NUnitdotnet add package NUnit dotnet add package NUnit3TestAdapter dotnet add package Microsoft.NET.Test.Sdk这三个包分别提供了NUnit核心测试框架NUnit3TestAdapterVisual Studio测试适配器Microsoft.NET.Test.Sdk测试平台支持创建测试项目使用以下命令创建一个新的测试项目dotnet new nunit -n MyFirstNUnitTests cd MyFirstNUnitTests或者手动创建项目文件MyFirstNUnitTests.csprojProject SdkMicrosoft.NET.Sdk PropertyGroup TargetFrameworknet8.0/TargetFramework IsPackablefalse/IsPackable /PropertyGroup ItemGroup PackageReference IncludeNUnit Version4.0.0 / PackageReference IncludeNUnit3TestAdapter Version4.5.0 / PackageReference IncludeMicrosoft.NET.Test.Sdk Version17.8.0 / /ItemGroup /Project 编写你的第一个NUnit测试基础测试结构让我们从一个简单的计算器类开始。首先创建被测试的类// Calculator.cs public class Calculator { public int Add(int a, int b) a b; public int Subtract(int a, int b) a - b; public int Multiply(int a, int b) a * b; public double Divide(int a, int b) (double)a / b; }现在创建测试类// CalculatorTests.cs using NUnit.Framework; [TestFixture] public class CalculatorTests { private Calculator _calculator; [SetUp] public void Setup() { _calculator new Calculator(); } [Test] public void Add_TwoNumbers_ReturnsSum() { // Arrange int a 5; int b 3; // Act int result _calculator.Add(a, b); // Assert Assert.That(result, Is.EqualTo(8)); } [Test] public void Subtract_TwoNumbers_ReturnsDifference() { // Arrange Act int result _calculator.Subtract(10, 4); // Assert Assert.That(result, Is.EqualTo(6)); } }使用约束式断言NUnit 4推荐使用约束式断言语法它更清晰、更灵活[Test] public void Multiply_TwoNumbers_ReturnsProduct() { // 传统断言方式 Assert.AreEqual(15, _calculator.Multiply(3, 5)); // 约束式断言推荐 Assert.That(_calculator.Multiply(3, 5), Is.EqualTo(15)); Assert.That(_calculator.Multiply(3, 5), Is.GreaterThan(10)); Assert.That(_calculator.Multiply(3, 5), Is.Not.EqualTo(0)); } NUnit核心特性详解测试属性Test AttributesNUnit使用属性来标记和组织测试属性用途示例[Test]标记测试方法[Test] public void MyTest()[TestFixture]标记测试类[TestFixture] public class MyTests[SetUp]每个测试前执行[SetUp] public void Setup()[TearDown]每个测试后执行[TearDown] public void Cleanup()[OneTimeSetUp]类中所有测试前执行一次[OneTimeSetUp] public void ClassSetup()[OneTimeTearDown]类中所有测试后执行一次[OneTimeTearDown] public void ClassCleanup()参数化测试NUnit支持多种参数化测试方式避免重复代码[Test] [TestCase(1, 2, 3)] [TestCase(5, 5, 10)] [TestCase(-1, 1, 0)] public void Add_VariousNumbers_ReturnsCorrectSum(int a, int b, int expected) { int result _calculator.Add(a, b); Assert.That(result, Is.EqualTo(expected)); } [Test] [TestCaseSource(nameof(DivisionTestCases))] public void Divide_VariousNumbers_ReturnsCorrectResult(int a, int b, double expected) { double result _calculator.Divide(a, b); Assert.That(result, Is.EqualTo(expected).Within(0.0001)); } private static object[] DivisionTestCases { new object[] { 10, 2, 5.0 }, new object[] { 9, 4, 2.25 }, new object[] { 0, 5, 0.0 } };异常测试测试方法是否抛出预期异常[Test] public void Divide_ByZero_ThrowsDivideByZeroException() { var calculator new Calculator(); // 方法1使用Assert.Throws Assert.ThrowsDivideByZeroException(() calculator.Divide(5, 0)); // 方法2使用约束式语法 Assert.That(() calculator.Divide(5, 0), Throws.TypeOfDivideByZeroException()); }️ 高级测试组织技巧测试分类与筛选[Test] [Category(Fast)] [Category(Math)] public void FastMathTest() { // 快速数学测试 } [Test] [Category(Slow)] [Category(Integration)] public void SlowIntegrationTest() { // 慢速集成测试 } // 运行特定分类的测试 // dotnet test --filter CategoryFast并行测试执行[TestFixture] [Parallelizable(ParallelScope.All)] public class ParallelTests { [Test] public void Test1() { /* 与其他测试并行执行 */ } [Test] public void Test2() { /* 与其他测试并行执行 */ } }️ 运行与调试测试命令行运行测试# 运行所有测试 dotnet test # 运行特定测试类 dotnet test --filter FullyQualifiedName~CalculatorTests # 运行特定测试方法 dotnet test --filter NameAdd_TwoNumbers_ReturnsSum # 显示详细输出 dotnet test --verbosity normalVisual Studio集成在Visual Studio中打开测试资源管理器Test Explorer查看所有测试用例运行特定测试或测试组调试测试代码查看测试结果和代码覆盖率持续集成配置在GitHub Actions中配置NUnit测试name: .NET Tests on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Setup .NET uses: actions/setup-dotnetv3 with: dotnet-version: 8.0.x - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --no-restore - name: Test run: dotnet test --no-build --verbosity normal 测试报告与最佳实践生成测试报告# 生成TRX格式报告 dotnet test --logger trx # 生成HTML报告需要额外包 dotnet test --logger htmlNUnit测试最佳实践命名规范使用MethodName_Scenario_ExpectedBehavior模式单一职责每个测试只验证一个行为AAA模式遵循Arrange-Act-Assert结构避免测试依赖测试之间应该相互独立使用有意义的断言消息Assert.That(result, Is.EqualTo(expected), $计算 {a} {b} 应该等于 {expected}但得到 {result}); 调试常见问题测试不运行检查是否安装了NUnit3TestAdapter确认项目文件引用了正确的包版本确保测试方法标记为public断言失败使用Assert.That的详细错误消息检查浮点数比较时使用Within容差验证对象相等性时考虑引用相等和值相等并行测试问题检查测试之间是否有共享状态考虑使用[NonParallelizable]属性使用线程安全的测试数据 下一步学习路径掌握了NUnit基础后你可以进一步探索异步测试使用async/await测试异步方法数据驱动测试从数据库或文件加载测试数据自定义约束创建领域特定的断言约束测试生命周期深入理解测试执行顺序集成测试结合其他框架进行端到端测试NUnit的强大之处在于它的灵活性和可扩展性。随着你的测试需求增长你会发现NUnit能够适应各种复杂的测试场景。从简单的单元测试到复杂的集成测试NUnit都能提供可靠的支持。记住好的测试是代码质量的基石而NUnit是你构建这些基石的强大工具。开始编写你的第一个测试体验测试驱动开发TDD带来的信心和效率提升吧提示NUnit项目位于src/NUnitFramework/framework/目录包含完整的源代码和丰富的测试示例。探索这些代码可以加深对框架内部工作原理的理解。【免费下载链接】nunitNUnit Framework项目地址: https://gitcode.com/gh_mirrors/nu/nunit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章