关于单元测试和日期的首选方法是什么?

时间:2011-06-06 09:14:54

标签: java unit-testing date

我有一个计算日期的课程,我想知道如何最好地测试这个。我想出了两种方法,并想知道你对“更好”的想法(当然,你可能有任何其他巧妙的想法)。

例如,在我的代码中,如果没有满足条件,则返回从今天开始的一年和一个月的默认日期。

方法#1: 在单元测试中复制日期计算逻辑:

DateMidnight expectedDefaultDate = new DateMidnight().plusYears(1).plusMonths(1);
assertEquals(expectedDefaultDate , unit.getExpireDate());

方法#2: 将“今天”作为固定时间点和硬代码预期响应日期注入:

DateMidnight fixedPointInTime = new DateMidnight(2011, 06, 05);
unit.setToday(fixedPointInTime);
DateMidnight expectedDefaultDate = new DateMidnight(2012, 07, 05);
assertEquals(expectedDefaultDate, unit.getExpireDate());

我很震惊这些。我在代码重复方面不是很重要,但对于我的预期,第一种方法对我来说更清楚。你会使用哪种(如果有的话)以及为什么?

5 个答案:

答案 0 :(得分:2)

单元测试的目的是发现错误。我建议你采取你认为最有可能发现错误的方法。简单复制代码,可能找不到所有错误。但是,如果您更改原始代码(例如,使其更有效),则示例可能不再重复。

恕我直言,最好的办法就是两种方式都写出来,要么在不同的变化下打破。

答案 1 :(得分:2)

恕我直言,单元测试应具有以下属性:

  1. 可重复
  2. 测试“有趣”的案例
  3. 就日期而言,使用“今天”是不好的,因为每天运行测试时都不同。日期的“有趣”案例通常涉及周末,节假日,月末/年等等。

    过去曾经困扰过我的一个例子:基于日期的测试,直到有一天,在重要版本发布之前的一天,你在周末工作并发现许多(意外)失败的测试。如果你在周末工作,你已经承受了很大的压力,真的不需要失败的测试来增加“恐惧,不确定和怀疑”!

    总之,请勿使用“今天”。如果你真的想测试每个日期,那么不要每天都这样做,而是在测试中为它编写一个循环,以便从固定的开始日期延伸到超出预期寿命的日期范围。系统(然后是一些)。

答案 2 :(得分:1)

第二种方法更好。 测试代码应该非常简单和愚蠢,测试的代码应该是智能和复杂的。如果测试代码太聪明,并且测试失败,您将永远不会知道错误是在测试代码中还是在测试代码中。

答案 3 :(得分:0)

在第二种情况下,不仅存在代码重复,还存在数据硬编码。我喜欢第一种方法。

答案 4 :(得分:0)

这里似乎有两件事需要测试:

  1. 班级正确计算从今天起一个月和一年
  2. 在某些情况下,从今天起一年零一个月的退货日期。
  3. 显然,对于#1,您需要使用硬编码值。对于后者,现在你可以重复代码。

    只是我的想法,虽然我不知道这是挑剔。