我有一个计算日期的课程,我想知道如何最好地测试这个。我想出了两种方法,并想知道你对“更好”的想法(当然,你可能有任何其他巧妙的想法)。
例如,在我的代码中,如果没有满足条件,则返回从今天开始的一年和一个月的默认日期。
方法#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());
我很震惊这些。我在代码重复方面不是很重要,但对于我的预期,第一种方法对我来说更清楚。你会使用哪种(如果有的话)以及为什么?
答案 0 :(得分:2)
单元测试的目的是发现错误。我建议你采取你认为最有可能发现错误的方法。简单复制代码,可能找不到所有错误。但是,如果您更改原始代码(例如,使其更有效),则示例可能不再重复。
恕我直言,最好的办法就是两种方式都写出来,要么在不同的变化下打破。
答案 1 :(得分:2)
恕我直言,单元测试应具有以下属性:
就日期而言,使用“今天”是不好的,因为每天运行测试时都不同。日期的“有趣”案例通常涉及周末,节假日,月末/年等等。
过去曾经困扰过我的一个例子:基于日期的测试,直到有一天,在重要版本发布之前的一天,你在周末工作并发现许多(意外)失败的测试。如果你在周末工作,你已经承受了很大的压力,真的不需要失败的测试来增加“恐惧,不确定和怀疑”!
总之,请勿使用“今天”。如果你真的想测试每个日期,那么不要每天都这样做,而是在测试中为它编写一个循环,以便从固定的开始日期延伸到超出预期寿命的日期范围。系统(然后是一些)。
答案 2 :(得分:1)
第二种方法更好。 测试代码应该非常简单和愚蠢,测试的代码应该是智能和复杂的。如果测试代码太聪明,并且测试失败,您将永远不会知道错误是在测试代码中还是在测试代码中。
答案 3 :(得分:0)
在第二种情况下,不仅存在代码重复,还存在数据硬编码。我喜欢第一种方法。
答案 4 :(得分:0)
这里似乎有两件事需要测试:
显然,对于#1,您需要使用硬编码值。对于后者,现在你可以重复代码。
只是我的想法,虽然我不知道这是挑剔。