java - 由 Maven 运行时集成测试随机失败或抛出错误

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

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

最佳答案

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

修复是为了确保您的测试在运行时始终保持一致的状态。 (这是良好单元测试的指导原则。)您需要注意通过 @Before@BeforeClass@ 进行测试设置和拆卸。 After@AfterClass 注释(或 TestNG 等效项)。我建议谷歌搜索数据库单元测试最佳实践。对于数据库测试,在事务中运行测试可以防止此类问题。这样,无论测试通过还是失败,数据库都会回滚到其起始状态。 Spring 对 JDBC 数据库测试有一些很好的支持。 (即使您的项目不是 Spring 项目,这些类也非常有用。)阅读 11.2.2 Unit Testing support Classes 部分看看AbstractTransactionalJUnit4SpringContextTests/AbstractTransactionalTestNGSpringContextTests类和 @TransactionConfiguration注解(后一个来自运行 Spring Contexts)。还有其他数据库测试工具,例如 DbUnit .

关于java - 由 Maven 运行时集成测试随机失败或抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25163346/

相关文章:

java - 更新 Intellij 2019.1 后未指定模块

java - 从 Spring Boot 1 迁移到 Spring Boot 2 后的性能问题

java - maven如何判断私有(private)仓库中的模块是否发生变化?

eclipse - 在 Eclipse 中运行 JUnit 单元测试时出现 ClassNotFoundException(使用 Maven)

eclipse - 如何在本地构建和运行 Scala Spark

android - 项目管理 IntelliJ IDEA/Android Studio

JavaFX - 生成 App Jar 时不显示虚拟键盘

java - tomcat的config文件夹中的属性文件放在哪里

java - 如何使用itextpdf向pdf添加水印

maven - 如何在 CI 构建中更改 POM 版本?