为什么“先测试”不是自虐,而是一种超能力
\n\n想象一下:你编写代码,一切运行正常。你很开心。一个月后你回到项目,修改了一行代码——然后一切都崩溃了。熟悉吗?欢迎加入不写测试的开发者俱乐部。现在再想象另一种现实:你修改代码,运行测试——10秒后你就知道什么也没有被破坏。这不是魔法,这是TDD(测试驱动开发)。
\n\n在本文中,我们将以C#为例来剖析TDD。没有枯燥的理论。只有实践、代码和真实案例。如果你认为TDD是为“纯粹的架构师”或“企业级怪物”准备的——你会感到惊讶。这是一个能拯救你的代码和神经的工具。
\n\n什么是TDD以及红-绿-重构如何运作
\n\nTDD不是关于测试。它是关于设计。你不是在代码之后编写测试,而是反过来:先写测试,然后编写能通过测试的最小代码,最后才进行重构。这个循环被称为红-绿-重构:
\n\n- \n
- 红——编写一个注定会失败的测试(红色)。 \n
- 绿——编写最少的代码使测试通过(绿色)。 \n
- 重构——在不改变代码行为的前提下改进代码。 \n
看起来很奇怪?让我们看一个例子。假设我们需要一个带有加法方法的计算器。通常我们会先写类,再写测试。在TDD中则相反。
\n\n步骤1:红——编写一个会失败的测试
\n\nusing NUnit.Framework;\n\n[TestFixture]\npublic class CalculatorTests\n{\n [Test]\n public void Add_ShouldReturnSumOfTwoNumbers()\n {\n // Arrange\n var calculator = new Calculator();\n \n // Act\n var result = calculator.Add(2, 3);\n \n // Assert\n Assert.AreEqual(5, result);\n }\n}\n\n运行——测试失败,因为Calculator类不存在。红色是正常的。现在我们的任务是让它变绿。
\n\n步骤2:绿——编写最少的代码使测试通过
\n\npublic class Calculator\n{\n public int Add(int a, int b)\n {\n return a + b; // 最小实现\n }\n}\n\n测试变绿了。太好了。但代码目前还很丑陋。进入步骤3。
\n\n步骤3:重构——改进但不破坏
\n\n在这个阶段,我们可以添加检查、异常处理或修改架构。关键是测试必须保持绿色。
\n\npublic class Calculator\n{\n public int Add(int a, int b)\n {\n if (a < 0 || b < 0)\n throw new ArgumentException("只允许正数");\n return a + b;\n }\n}\n\n测试会失败吗?是的。这意味着需要更新测试或修改逻辑。在TDD中,重构始终是与测试的对话。
\n\n如何为C#中的TDD选择框架:NUnit vs xUnit
\n\n在C#中有三个流行的框架:NUnit、xUnit和MSTest。我们将讨论前两个,因为它们最灵活。
\n\n| 标准 | \nNUnit | \nxUnit | \n
|---|---|---|
| 属性 | \n[Test], [SetUp] | \n[Fact], [Theory] | \n
| 参数化 | \n[TestCase] | \n[InlineData] | \n