集成测试在maven运行时随机失败或抛出错误

时间:2014-08-06 14:41:44

标签: java maven intellij-idea integration-testing maven-plugin

我正在使用maven运行一套集成测试,大约10%的测试会失败或抛出错误。但是,当我启动服务器并从我的IDE(intellij idea)手动运行各个失败的测试时,它们都没有问题。可能是造成这个问题的原因是什么?

1 个答案:

答案 0 :(得分:2)

这几乎总是由以不一致的顺序运行的单元测试或通过分叉测试并行运行的两个测试之间的竞争条件引起的。如果测试#1首先完成,则它通过。但是如果测试#2首先完成,它会使测试资源(例如测试数据库)处于备用状态,从而导致测试#1失败。这在数据库测试中很常见,特别是当一个或多个更改数据库时。即使在IDEA中,您也可能会发现com.example.FooTest类中的所有测试在您运行该类时始终会通过。但是如果你运行com.example包中的所有测试或项目中的所有测试,有时(甚至总是)FooTest中的测试都会失败。

修复是为了确保您的测试在运行时始终保证一致的状态。 (这是良好单元测试的指导原则。)您需要通过@Before@BeforeClass@After@AfterClass来关注测试设置和拆卸注释(或TestNG等价物)。我推荐谷歌搜索database unit testing best practices。对于数据库测试,在事务中运行测试可以防止这些类型的问题。这样,无论测试通过还是失败,数据库都会回滚到其启动状态。 Spring对JDBC dtaabase测试有很大的支持。 (即使您的项目不是Spring项目,这些类也非常有用。)阅读11.2.2 Unit Testing support Classes部分并查看AbstractTransactionalJUnit4SpringContextTests / AbstractTransactionalTestNGSpringContextTests类和{{3}注释(后者来自运行Spring上下文)。还有其他数据库测试工具,例如@TransactionConfiguration