【问题标题】:Unit Testing - TDD - C#单元测试 - TDD - C#
【发布时间】:2023-03-05 19:35:02
【问题描述】:
我正在使用测试驱动开发(C#、控制台应用程序)构建机器人原型。首先,我创建了一个测试项目和一个 RobotTest 类。在这里,我编写了失败和通过的测试方法,我构造了 Robot 类。然后,我创建了一个类 RobertPrototype,其中创建了 Robot 类对象以使用 Robot 类中的方法。除此之外,我在 RobertPrototype 中添加了一些其他方法(用于解析输入)。
我不知道这是否是我在通过 TDD 开发时必须遵循的方式。我必须在 Robot 类本身中包含所有方法吗?
请指导我。谢谢。
【问题讨论】:
标签:
visual-studio-2010
c#-4.0
tdd
nunit
【解决方案1】:
我必须在 Robot 类本身中包含所有方法吗?
我不明白这个问题。您已经说过您的测试在一个单独的项目中,并且您正在编写一个单独的客户端类 RobotPrototype 使用 Robot 类。
在这一点上,这似乎是一个合理的设计。
我认为您为某些 Robot 类方法编写的每一位“工作”测试编写了您的类的所有位,这让您自己感到困惑。这不是思考 TDD 的方式。这并不意味着编写一个失败的测试来创建一个机器人对象,然后编写一个机器人构造函数的外壳,编写一个使用机器人的类的外壳,编写一个使用 RobotPrototype 的客户端外壳。然后编写一个失败的测试,然后编写一个空的 Robot 方法,编写使用该方法的 RobotPrototype 代码,编写使用 RobotPrototype 使用的客户端代码。不不不。
您的机器人设计中的每个类都有自己对应的测试类。每个类中的每个方法在其对应的测试类中都有自己对应的方法。 TDD 循环是逐个方法执行的。
试试这个:
- 专注于一个类和它对应的测试类。显然,您首先需要一个机器人。从 Robot 类开始。
- 使用 TDD 循环,编写函数式方法。
- 当您有足够的
Robot 功能来做某事时,您就可以开始编写一些使用 Robot 的代码(RobotPrototype 类)。
- RobotPrototype 类有它自己对应的Test 类。它的每个方法都有一个对应的测试方法。您应该已经编写了足够的机器人功能来完成任何给定的 RobotPrototype 方法。如果没有,请停止。回到 Robot 并在那里编写功能方法。
鉴于上述情况,要带走的要点是:
您首先编写了完整的“核心”方法。完成后,每种方法都有工作测试。
在使用现有代码编写新代码时,您知道现有代码可以工作,因为它已经过测试。而且,您的新代码有自己的测试。
因此,您的应用程序是建立在测试代码层之上的。
在编写和重写时,您不断重新运行测试。并定期确保重新运行所有这些。如果之前的工作测试失败,那么您就知道自己遇到了问题,并且知道首先要查找的位置。
尽可能每个类都有一个测试类,每个方法都有(至少一个)测试方法。
【解决方案2】:
TDD 的一种实现是 Red-Green-Refactor。
在编写测试(红色)时,您需要向 Robot 添加方法才能通过(绿色)。下一步是组织代码,可能到其他类(重构)。用于通过测试的初始代码可能与您的最终代码在不同的类中。
【解决方案3】:
一般来说,您首先编写您愿意进行单元测试的类的框架,并保留所有未实现的方法。然后你编写关于这个类和你愿意测试的所有方法的单元测试。然后你运行单元测试,这将失败,因为你还没有实现这些方法(你让它们抛出NotImplementedException),但至少你的单元测试可以编译和执行。然后你继续实现这些方法并运行通常应该通过的单元测试。然后你重构你的代码,当你运行单元测试时它应该仍然通过。你继续下一堂课,这个过程会重复。