我第一次尝试一点TDD。我一开始绝对没有,并为自编的日期库编写了一些测试。
我希望能够做到例如:
MyDate m = new MyDate(1,1,2012);
并断言
m.equals(new MyDate(2,1,2012))
是false
。
现在只有这两个项目,我可以编写一个构造函数,它根本不做任何事情,但仍然满足“能够用三个int来调用构造函数来构造日期”。我可以写一个始终返回false
的等号方法。
到目前为止,我还没有写任何属性,虽然我已经预先确定我想要至少有三个属性,与构造函数的参数相对应。我应该继续编写测试,然后在继续时“发现”这些属性吗?或者我是在努力推动它,我是否应该编写一个基本类,其中包含我已经知道需要的属性?
答案 0 :(得分:3)
如果您想学习TDD 以及,我建议您按照本书进行操作。写一点测试,看它失败,让它通过,删除重复,重复。在此之前,您应该编写一份您认为需要编写的所有测试的清单。这是一种与TDD一起运作良好的“提前思考”。您将返回此列表以交叉您通过的测试,并添加在您工作时发生的新测试。
我建议您在学习之前不要尝试使用此过程的变体: - )
你的小测试已经足够了;您必须首先通过编写返回true的equals方法使其失败。然后你让它通过,然后你编写另一个测试,证明如果它们具有相同的属性,两个日期可以相等。它只需要几分钟。
祝你好运!答案 1 :(得分:2)
如果只有一次测试,则最佳等于总是返回false 。
您知道会有其他测试用例并写return false
是浪费时间。您应该编写更多测试,以便您可以实际编写return false
以外的工作代码。
例如
MyDate m = new MyDate(1,1,2012);
assertTrue(m.equals(new MyDate(1,1,2012)));
和
MyDate m = new MyDate(1,1,2012);
assertFalse(m.equals(new MyDate(2,1,2012)));
您实际上可以编写一些真实的代码来比较日期值。
答案 2 :(得分:1)
我会考虑先写一些其他测试 -
[Test]
public void ANewlyConstructedMyDateHasCorrectYear(){
Assert.AreEqual(2012, new MyDate(2, 1, 2012).Year);
}
例如- 然后最终继续确保您的Equals方法符合您的预期。
答案 3 :(得分:1)
您应该开始编写其他测试,定义您对此课程的期望。我一步一步地,在测试代码和实际代码之间交替(写测试用例,满足这个, 写另一个)。有时我只是不知道如何实现某些东西,以及算法 在满足测试用例的同时出现。
另一种有用的技术是嘲笑;我更喜欢jMockit作为目前最强大的工具包。以下是测试驱动开发的示例:
答案 4 :(得分:0)
到目前为止,我还没有写任何属性,虽然我已经预先确定我想要至少有三个属性,与构造函数的参数相对应。我应该继续编写测试,然后“发现”这些属性 我继续?
超正统的TDD说是的,你不能写任何生产代码,除非你有一个需要该代码通过的失败测试。
但是有一种思想流派(改革TDD,如果你愿意的话)说,允许对设计的想法不是由测试驱动的。在那所学校之后,在编写任何测试之前设计类的接口(可能是部分的),然后编写一些测试,然后添加实现以使它们工作并且这样做可能重构接口。
尝试一下,看看什么最适合你。
答案 5 :(得分:0)
你走在正确的轨道上。您有一个测试套件(带有一个测试)和一些生产代码,生产代码通过了所有测试。这是"绿色" TDD红绿重构生命周期的阶段。
由于您开始使用equals()
测试,我建议您编写另一个测试来断言date1.equals(date1)
返回true
。如果您的equals()
方法始终返回false
,那么这显然会失败,并且会驱动一个真实的" equals()
的实施。另一方面,如果您更关心知道new MyDate(2, 1, 2012)
表示的年份,您可以编写一个测试断言它具有值为2012的Year属性。您首先编写的测试取决于在那一刻,你作为代码的设计者和开发者最关心的是什么。
你希望避免一次编码一堆测试的令人讨厌的诱惑 - 这样做意味着你在" red"中花费了大量的额外时间。阶段,你不知道代码是否有效,因为你的测试失败了。