TDD发现'一个类的属性?

时间:2011-12-09 09:29:28

标签: java tdd

我第一次尝试一点TDD。我一开始绝对没有,并为自编的日期库编写了一些测试。

我希望能够做到例如:

MyDate m = new MyDate(1,1,2012);

并断言

m.equals(new MyDate(2,1,2012))false

现在只有这两个项目,我可以编写一个构造函数,它根本不做任何事情,但仍然满足“能够用三个int来调用构造函数来构造日期”。我可以写一个始终返回false的等号方法。

到目前为止,我还没有写任何属性,虽然我已经预先确定我想要至少有三个属性,与构造函数的参数相对应。我应该继续编写测试,然后在继续时“发现”这些属性吗?或者我是在努力推动它,我是否应该编写一个基本类,其中包含我已经知道需要的属性?

6 个答案:

答案 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作为目前最强大的工具包。以下是测试驱动开发的示例:

https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/PreferenceInjectionTest.java

答案 4 :(得分:0)

  

到目前为止,我还没有写任何属性,虽然我已经预先确定我想要至少有三个属性,与构造函数的参数相对应。我应该继续编写测试,然后“发现”这些属性   我继续?

超正统的TDD说是的,你不能写任何生产代码,除非你有一个需要该代码通过的失败测试。

但是有一种思想流派(改革TDD,如果你愿意的话)说,允许对设计的想法不是由测试驱动的。在那所学校之后,在编写任何测试之前设计类的接口(可能是部分的),然后编写一些测试,然后添加实现以使它们工作并且这样做可能重构接口。

尝试一下,看看什么最适合你。

答案 5 :(得分:0)

你走在正确的轨道上。您有一个测试套件(带有一个测试)和一些生产代码,生产代码通过了所有测试。这是"绿色" TDD红绿重构生命周期的阶段。

由于您开始使用equals()测试,我建议您编写另一个测试来断言date1.equals(date1)返回true。如果您的equals()方法始终返回false,那么这显然会失败,并且会驱动一个真实的" equals()的实施。另一方面,如果您更关心知道new MyDate(2, 1, 2012)表示的年份,您可以编写一个测试断言它具有值为2012的Year属性。您首先编写的测试取决于在那一刻,你作为代码的设计者和开发者最关心的是什么。

你希望避免一次编码一堆测试的令人讨厌的诱惑 - 这样做意味着你在" red"中花费了大量的额外时间。阶段,你不知道代码是否有效,因为你的测试失败了。