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

pen*_*ake 13 .net c# tdd nunit unit-testing

当你采取"假装直到你制造IT"TDD方法时,我有一个问题需要理解代码的演变.

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

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

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

谢谢

Pie*_*kel 6

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

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

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

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

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

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

  • 单元测试不应测试每一行。具有失败条件的方法将仅针对该条件进行测试,并针对每个其他成功/失败条件进行其他测试。因此,即使从理论上讲,很少有测试能够测试每条线。 (2认同)

And*_*yle 6

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

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

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

myLength实现为return 5,然后你编写一个类似的(额外的)测试,但传入"foobar"而断言输出为6.

当你编写测试时,你应该尝试对实现做出非常报复,并尝试编写暴露其缺点的东西.当你编写代码时,我认为你的意思是非常放任自流,而且要做那些令人讨厌的测试是绿色的.


Car*_*ter 5

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