【问题标题】:Handling Local vs Remote Database TimeZone Differences in Tests处理测试中的本地与远程数据库时区差异
【发布时间】:2010-12-14 11:50:13
【问题描述】:

我在 Java 中进行了单元测试,它将一个常量时间戳写入本地测试数据库中的一行,将其读回并将其与我的预期进行比较。这在我位于 GMT 时区的本地笔记本电脑上运行良好。

当我将代码提交到我们的持续集成服务器时,测试失败,时间差为 -5 小时。这并不奇怪,因为我们的集成服务器托管在美国东海岸的 AWS 上。但是,它导致了一个问题......

没有将我的本地 MySQL 服务器更改为与远程服务器具有相同的时区(并且让我团队中的所有开发人员也这样做),任何人都可以告诉我如何在代码中解决这个问题而不会太老套吗?

//Fetch actual table contents
IDataSet databaseDataSet = databaseTester.getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable("batch");

// Load expected data from an XML dataset
IDataSet expectedDataSet = new XmlDataSet(getClass().getResourceAsStream("/dbunit/expected_insert_batch.xml"));
ITable expectedTable = expectedDataSet.getTable("batch");

// Assert actual database table match expected table
Assertion.assertEquals(expectedTable, actualTable);

谢谢,

【问题讨论】:

  • 您应该详细说明如何将时间戳作为整数进行比较?作为字符串?
  • 是的,请显示单元测试的详细信息:)
  • DBUnit 正在进行时间戳比较

标签: java mysql timezone dbunit


【解决方案1】:

您可以set a timezone 将 MySQL 服务器与操作系统时区分开,甚至可以用于单独的数据库会话。前者更适合 IMO,除了 UI 和导入数据时,在任何地方都使用 UTC

【讨论】:

    【解决方案2】:

    我建议您让所有系统都使用相同的时区,例如UTC/GMT+0 并且仅在向用户显示或报告时使用时区。

    【讨论】:

      【解决方案3】:

      好的,这可能不是最好的选择,但为什么不创建另一个

      "/dbunit/expected_insert_batch.xml" 
      

      为您的 CI 服务器。然后在您的单元测试中为时区添加一个开关。

      【讨论】:

        【解决方案4】:

        如果您在 Java 中创建时间戳,我建议使用模拟,这样它就完全不依赖于系统。

        请参阅this question 的答案以获取想法。

        【讨论】:

        • 但我的单元测试是测试 DAO 是否正确写入数据库。多亏了一个模拟,我已经在写一个恒定的时间戳,但问题是它必须通过数据库编写来测试 - 如果时区与描述的不同,它会导致问题......
        • 对于这个问题,我主张正如其他人所回答的那样,只需将所有数据库时间保持在 UTC 中,并仅使用时区进行显示。
        【解决方案5】:

        您需要使您的测试不依赖于环境。寻找可以使该字段动态化并且应该可以在任何地方使用的地方。

        【讨论】:

        • DAO 测试将始终依赖于它运行的数据库,但我同意一般测试应该与环境无关。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 2020-06-06
        • 2019-10-22
        • 2014-06-17
        • 1970-01-01
        相关资源
        最近更新 更多