为什么C#测试并不可怕,反而有益?
\n\n如果你刚开始学习C#,并且听说过“优秀的开发者总是编写测试”,但完全不知道从何入手——那么你来对地方了。代码测试常常让新手感到害怕:似乎这是一件复杂的事情,需要深厚的架构知识和大量的配置。实际上,编写C#测试是一项可以在一个晚上掌握的技能,而它的好处将持续多年。
\n\n想象一下,你组装了一个由数千个零件组成的复杂机械。你不会在未检查每个部件的情况下就全速启动它吧?程序也是如此:C#单元测试允许你单独检查代码的每一个“螺丝钉”,而不必等到整个系统在生产环境中崩溃。在本文中,我们将从零开始讲解C#测试:从选择框架到编写第一个有意义的测试。开始吧!
\n\nC#测试从何开始:环境准备
\n\n在编写代码之前,让我们确保你拥有所有必要的工具。进行C#测试,你需要:
\n- \n
- Visual Studio 2022(Community版免费)或JetBrains Rider(如果有许可证)。 \n
- .NET SDK(版本6、7或8——任何LTS版本均可)。 \n
- 对C#中OOP的基本理解:类、方法、接口。 \n
当环境准备好后,创建一个新项目。我建议立即将代码分为两个项目:主项目(你的库或应用程序)和测试项目。在Visual Studio中,可以通过命令完成:File → New → Project → xUnit Test Project (.NET Core)或NUnit Test Project。但我们会更进一步,讲解这两种流行的工具。
选择框架:NUnit vs xUnit
\n\n在C#世界中,有两个主要的“玩家”用于编写模块测试:NUnit和xUnit。两者都运行良好,但有一些细微差别:
\n\n- \n
- NUnit——经典框架,源自Java(类似于JUnit)。具有属性
[Test]、[SetUp]、[TearDown]。对初学者非常直观。 \n - xUnit——由ASP.NET创建者开发的现代框架。使用
[Fact]和[Theory]。被认为更“干净”,并且与.NET Core集成更好。 \n
对于初学者,我建议使用xUnit——它更简单,不需要多余的属性,更容易理解。但如果你的团队使用NUnit——也没关系,我们会讲解两种选项。
\n\n第一个C#单元测试:编写代码
\n\n假设我们有一个简单的计算器类:
\n\npublic class Calculator\n{\n public int Add(int a, int b) => a + b;\n \n public int Divide(int a, int b)\n {\n if (b == 0)\n throw new DivideByZeroException("不能除以零!");\n return a / b;\n }\n}\n\n现在为这个类编写测试。创建一个测试项目(xUnit)并添加对主项目的引用。
\n\nxUnit测试示例
\n\nusing Xunit;\n\npublic class CalculatorTests\n{\n [Fact]\n public void Add_ShouldReturnSum_WhenTwoNumbers()\n {\n // Arrange\n var calculator = new Calculator();\n \n // Act\n var result = calculator.Add(3, 5);\n \n // Assert\n Assert.Equal(8, result);\n }\n \n [Fact]\n public void Divide_ShouldThrowException_WhenDivideByZero()\n {\n var calculator = new Calculator();\n \n Assert.Throws<DivideByZeroException>(() => calculator.Divide(10, 0));\n }\n}\n\n请注意Arrange-Act-Assert(AAA)结构。这是编写测试的黄金标准:首先准备数据,然后执行操作,最后验证结果。记住这个模式——它将帮助你避免混乱。