【问题标题】:Junit tests fails randomized while using database and entity manager使用数据库和实体管理器时,Junit 测试随机失败
【发布时间】:2010-01-14 17:04:10
【问题描述】:

我尝试编写一个大型测试类。

我正在使用 Junit、Hibernate 和 TopLink 和 H2 数据库。在此之前我使用的是 EJB3Unit(包括 Hibernate 和 H2)。

我的测试类有 57 种测试方法。如果我一次运行所有测试随机一个或多个测试失败。如果我单独运行每个测试,则不会出错。

有人知道出了什么问题吗?以及如何防止这种情况发生?

  1. 对于每个测试方法,我都会创建一个新的内存数据库,但名称不同。
  2. 我创建了一个新的 entitymanagarfactory 和 entitymanagar 实例。
  3. 我已禁用二级缓存。
  4. 我通过脚本创建了所有表(没有发生错误,所以数据库真的很新鲜)。
  5. 我做了一些数据库操作和测试。
  6. 我清除会话和 em。
  7. 我删除了内存数据库中的所有对象
  8. 我关闭了数据库
  9. 我关闭了 em 和 emf。

我还需要做更多吗?

非常感谢...

【问题讨论】:

  • 您是否有可能从池中提取对象(如连接)(例如,在休眠配置中)并且响应没有完全提交?您的测试设置或拆卸方法是否可能在每个实例之前没有正确注释和运行?你真的需要为每个方法调用重新创建一个数据库吗?
  • “一次性”是指测试套件中的并行执行还是顺序执行?
  • 我的意思是“一次性”顺序执行。

标签: java database hibernate junit toplink


【解决方案1】:

测试之间似乎存在依赖关系。 理想情况下,您应该在每次测试后使用 tearDown 方法将数据库恢复到其原始状态(在 JUnit 4 中,使用 @After 注释)。

如果你已经这样做了,那么依赖就更加微妙了。为了找出它的原因,我建议你开始对测试进行二进制搜索:注释掉一半的测试。如果随机失败仍然存在,则注释掉剩余一半的一半(依此类推)。如果失败消失,那么问题出在另一半:取消注释并注释掉另一半。这个过程会很快收敛。

很好的狩猎。

【讨论】:

  • 我使用@After 和@Before 来建立一个新的数据库并杀死它。有时所有测试都通过。所有使用删除测试方法的测试等等让我想,我只需要“关键”的大量测试方法来获得更多或更少的错误。
【解决方案2】:

依赖性是这种随机失败的可能性。

另一个原因可能是集合中元素的顺序。一旦我正在编写测试并依赖于第一个元素。它没有排序,所以我不确定我问的对象是否总是相同的。

【讨论】:

  • 非常感谢...在这种情况下,排序不是问题(但我也这样做了;-))。它接缝,有“幻影”条目。我认为 PM 将一些信息保存在本地线程或静态变量中。如果我有更多的时间,我会更深入地研究。
猜你喜欢
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2022-01-23
  • 2020-03-13
  • 2016-01-31
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多