有人可以在测试驱动开发中解释“假它直到你做到”的方法吗?

时间:2010-11-12 15:50:37

标签: c# .net unit-testing tdd nunit

当您采用“假装直到制造IT”TDD方法时,我有一个问题需要了解代码的演变。

好吧,你假装它,假设你返回一个常数,这样破损的测试在开始时是绿色的。然后你重新考虑了你的代码。然后你运行相同的测试,显然会因为你伪造了它!

但如果测试通过,你怎么能依赖它,特别是当你知道你伪造了那个?

如何通过真实的代码重构来重构伪造的测试,以便它仍然可靠?

由于

6 个答案:

答案 0 :(得分:6)

首先创建一个单元测试来测试不存在的新功能。

现在,您对非现有方法进行了单元测试。然后,您创建的方法不会执行任何操作,并且您的单元测试会编译,但当然会失败。

然后继续构建方法,底层功能等,直到单元测试成功。

这是(某种)测试驱动的开发。

您应该能够信任的原因是您应该进行单元测试,以便它实际测试您的功能。当然,如果它只是返回一个常量而你只是测试它,那你就有问题了。但是,你的单元测试还没有完成。

您的单元测试应该(理论上)测试每一行。如果你做得好,这应该有效。

答案 1 :(得分:6)

简短的回答是:写更多测试。

如果方法返回一个常量(当它应该计算某些东西时),只需为具有不同结果的条件添加一个测试。所以,假设您有以下内容:

@Test
public void testLength()
{
    final int result = objectUnderTest.myLength("hello");
    assertEquals(5, result);
}

myLength已实现为return 5,然后您编写了类似的(附加)测试,但是传入"foobar"并声明输出为6

当你编写测试时,你应该尝试对实现做出非常报复,并尝试编写暴露其缺点的东西。当你编写代码时,我认为你的意思是非常 laissez-faire 并且只需要很少的东西就可以让这些讨厌的测试成为绿色。

答案 2 :(得分:4)

伪造它直到你说它写了最简单的东西来通过你当前的测试。通常,当您为新功能编写单个测试用例时,最简单的方法是返回常量。当一些简单的东西满足你的测试时,那是因为你还没有(还)有足够的测试。所以写另一个测试,正如@Andrzej Doyle所说。现在你正在开发的功能需要一些逻辑。也许这次最简单的事情就是编写非常基本的if-else逻辑来处理你的两个测试用例。你知道你假装它,所以你知道你没有完成。当编写实际代码来解决问题比简化扩展虚假以覆盖另一个测试用例更简单时 - 这就是你所做的。而且你有足够的测试用例来确保你正确地写它。

答案 3 :(得分:3)

这可能是指使用模拟/存根/ fakes 的做法,您的受测系统/类与之合作。

在这种情况下,您“伪造”协作者,而不是您正在测试的东西,因为您没有此协作者界面的实现。

因此,你伪造它直到你“成功”,这意味着你在一个具体的类中实现它。

答案 4 :(得分:0)

在TDD中,所有要求都表示为测试。如果你假装某些东西并且所有测试都通过了,你的要求就会得到满足如果这没有给您预期的行为,那么您没有将所有要求表达为测试。

如果你现在继续假装,你最终会注意到最简单的解决方案就是真正解决问题。

答案 5 :(得分:0)

在重构代码时,您正在从返回常量值切换到返回变量表达式,这些变量是派生/计算的。

假设第一次编写正确,测试仍然对您新重构的实现有效,并且不必重构。

了解 Fake It 背后的动机很重要:它类似于首先编写 Assert,除了您的生产代码。它让你变绿,让你专注于以最简单的方式将假的表达成有效的表达,同时仍然通过测试。在你放弃并切换到三角测量之前,这是在实现不明显时首先尝试的事情。