TDD在C#中:别再害怕测试,开始编写拿得出手的代码

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么“先测试”不是自虐,而是一种超能力

\n\n

想象一下:你编写代码,一切运行正常。你很开心。一个月后你回到项目,修改了一行代码——然后一切都崩溃了。熟悉吗?欢迎加入不写测试的开发者俱乐部。现在再想象另一种现实:你修改代码,运行测试——10秒后你就知道什么也没有被破坏。这不是魔法,这是TDD(测试驱动开发)。

\n\n

在本文中,我们将以C#为例来剖析TDD。没有枯燥的理论。只有实践、代码和真实案例。如果你认为TDD是为“纯粹的架构师”或“企业级怪物”准备的——你会感到惊讶。这是一个能拯救你的代码和神经的工具。

\n\n

什么是TDD以及红-绿-重构如何运作

\n\n

TDD不是关于测试。它是关于设计。你不是在代码之后编写测试,而是反过来:先写测试,然后编写能通过测试的最小代码,最后才进行重构。这个循环被称为红-绿-重构:

\n\n
    \n
  • 红——编写一个注定会失败的测试(红色)。
  • \n
  • 绿——编写最少的代码使测试通过(绿色)。
  • \n
  • 重构——在不改变代码行为的前提下改进代码。
  • \n
\n\n

看起来很奇怪?让我们看一个例子。假设我们需要一个带有加法方法的计算器。通常我们会先写类,再写测试。在TDD中则相反。

\n\n

步骤1:红——编写一个会失败的测试

\n\n
using 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\n
public 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\n
public 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\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n

博客

书籍推荐

标准NUnitxUnit
属性[Test], [SetUp][Fact], [Theory]
参数化[TestCase][InlineData]