我们的测试环境有各种依赖中间件(CMS平台、底层DB、Elasticsearch索引)的集成测试。
它们是自动化的,我们使用 Docker 管理我们的中间件,因此我们不会遇到不可靠网络的问题。但是,有时我们的数据库会崩溃并且我们的测试会失败。
问题在于,此故障的检测是通过一连串的 org.hibernate.exception.JDBCConnectionException
消息进行的。这些都是通过超时来实现的。当这种情况发生时,我们最终会因为这个异常而导致数百个测试失败,每个测试都需要很多秒才能失败。因此,我们的测试需要 age 才能完成。事实上,当我们意识到它们已经完成时,我们通常只是手动终止这些构建。
我的问题:在 Maven 驱动的 Java 测试环境中,有没有办法指示构建系统注意特定类型的异常并在它们到达(或达到某种阈值)时终止整个进程?
我们可以监视我们的容器并以这种方式终止构建过程,但我希望有一种更干净的方法来使用 maven 来完成它。
最佳答案
如果您使用 TestNG 而不是 JUnit,则可以通过其他方式将测试定义为依赖于其他测试。
例如,像上面提到的其他人一样,您可以有一个方法来检查您的数据库连接并声明所有其他测试都依赖于此方法。
@Test
public void serverIsReachable() {}
@Test(dependsOnMethods = { "serverIsReachable" })
public void queryTestOne() {}
这样,如果 serverIsReachable
测试失败,所有依赖于此测试的其他测试都将被跳过并且不会标记为失败。跳过的方法将在最终报告中报告,这很重要,因为跳过的方法不一定是失败的。 但是 由于您的初始测试 serverIsReachable
失败,因此构建应该完全失败。
积极的影响是,不会执行您的其他测试,这应该非常快地失败。
您还可以使用组扩展此逻辑。假设你的数据库查询之后被一些域逻辑测试使用,你可以用一个组声明每个数据库测试,比如
@Test(groups = { "jdbc" })
public void queryTestOne() {}
并声明你的域逻辑测试依赖于这些测试,
@Test(dependsOnGroups = { "jdbc.* })
public void domainTestOne() {}
因此,TestNG 将保证您的测试的执行顺序。
希望这有助于使您的测试更加结构化。有关更多信息,请查看 the TestNG dependency documentation .
关于java - 当中间件失败时,有没有办法让集成测试快速失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29104869/