哈德逊或maven与jodatime偶尔出现日期或时区差异

时间:2011-01-14 12:48:26

标签: unit-testing datetime maven-2 hudson jodatime

我希望以下解释有意义,因为这是我们面临的一个奇怪的问题,很难描述。

我们有一个maven项目,它在hudson中构建,并包含一些使用和断言日期的单元测试。哈德森服务器在solaris上运行。现在,偶尔(如30%的时间)使用日期的单元测试失败,因为在单元测试中从指定时间扣除了3,5小时,因此断言开始失败。其他70%的一切都运行良好,虽然代码中没有任何改变,我们每小时运行哈德森工作几次。

我将以下代码添加到unittest以检查时间:

@Test
public void testDate() {
    System.out.println("new DateMidnight(2011, 1, 5).toDate();");
    System.out.println(new DateMidnight(2011, 1, 5).toDate());
    System.out.println(new DateMidnight(2011, 1, 5).toDate().getTime());

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2011);
    cal.set(Calendar.MONTH, 0);
    cal.set(Calendar.DAY_OF_MONTH, 5);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    System.out.println("cal.getTime();");
    System.out.println(cal.getTime());
    System.out.println(cal.getTime().getTime());
}

所以基本上它应该在使用jodatime或普通旧日历时打印相同的东西。在70%的运行中就是这种情况;对于其他30%我得到以下打印输出:

Running TestSuite
new DateMidnight(2011, 1, 5).toDate();
Tue Jan 04 21:30:00 MET 2011
1294173000000
cal.getTime();
Wed Jan 05 12:00:00 MET 2011
1294225200000

因此,日历保留了正确的日期和时间,但jodatime扣除了3.5小时。

本地maven测试永远不会出现这个问题,我们无法弄清楚它可能是什么原因造成的。特别是,我们无法想到测试有时会通过的单一原因,有时会在不更改任何代码或哈德森或服务器设置的情况下失败。

此外,我们使用cobertura运行maven安装,这意味着单元测试运行两次。它也会发生在第一次通过并且第二次失败或反过来失败或两次失败时。

感谢任何解决原因的解决方案或提示,
斯泰恩

3 个答案:

答案 0 :(得分:1)

您可能也遇到了某些版本的SUREFIRE-533,这应该可以通过在运行hudson的环境中设置TZ环境变量来解决。如果这有帮助,请报告问题。

答案 1 :(得分:0)

也许Hudson在3台服务器上运行,而1台JDK中的时区数据版本与其他2台服务器不同? (详细查看JVM版本)。请记住,Joda-Time也有自己的时区数据版本,两者可能不同。

答案 2 :(得分:0)

现在问题似乎已经解决了。

我们将jodatime版本从5.14.2升级到5.14.6。 从那时起,我每隔半小时就在auto上运行一次构建,所以经过大约100次运行后我们再也没遇到过这个问题了。