有没有办法让中间件失败时集成测试快速失败?

Dan*_*umb 8 java integration-testing maven

我们的测试环境有各种依赖中间件的集成测试(CMS平台,底层数据库,Elasticsearch索引).

它们是自动化的,我们使用Docker管理我们的中间件,因此我们没有不可靠网络的问题.但是,有时我们的数据库崩溃,我们的测试失败.

问题是这种失败的检测是通过一连串的org.hibernate.exception.JDBCConnectionException消息.这些是通过超时发生的.当发生这种情况时,我们最终会遇到数百个因此异常而失败的测试,每个测试都需要几秒钟才能失败.因此,我们的测试需要一个年龄才能完成.实际上,当我们意识到它们已经完成时,我们通常会手动终止这些构建.

我的问题:在Maven驱动的Java测试环境中,有没有办法指导构建系统注意特定类型的异常并杀死整个过程,如果它们到达(或达到某种阈值)?

我们可以监视我们的容器并以这种方式杀死构建过程,但我希望有一种更清洁的方式来实现它与maven.

Mar*_*ler 7

如果使用TestNG而不是JUnit,则还有其他可能将测试定义为依赖于其他测试.

例如,像上面提到的其他人一样,您可以使用一种方法来检查数据库连接,并将所有其他测试声明为依赖于此方法.

@Test
public void serverIsReachable() {}

@Test(dependsOnMethods = { "serverIsReachable" })
public void queryTestOne() {}
Run Code Online (Sandbox Code Playgroud)

这样,如果serverIsReachable测试失败,将跳过所有其他依赖于此测试的测试,并且不会将其标记为失败.跳过的方法将在最终报告中报告,这很重要,因为跳过的方法不一定是失败的.但是由于您的初始测试serverIsReachable失败,构建应该完全失败.积极的效果是,你的其他测试不会执行,这应该很快失败.

您还可以使用组扩展此逻辑.假设您之后的某些域逻辑测试使用了数据库查询,您可以使用组声明每个数据库测试,例如

@Test(groups = { "jdbc" })
public void queryTestOne() {}
Run Code Online (Sandbox Code Playgroud)

并声明您的域逻辑测试依赖于这些测试

@Test(dependsOnGroups = { "jdbc.* })
public void domainTestOne() {}
Run Code Online (Sandbox Code Playgroud)

因此,TestNG将保证测试的执行顺序.

希望这有助于使您的测试更有条理.有关更多信息,请查看TestNG依赖文档.