如果发生"未能加载ApplicationContext "错误,则自动终止所有集成测试



我们有一些集成测试(使用spring框架编写)由于bean初始化异常而失败最终生成Failed to load ApplicationContext。根据我对spring测试文档的理解,ApplicationContext的加载发生在类级别,所以我的疑问是-

  1. 一旦ApplicationContext失败(即Failed to load ApplicationContext)由于bean初始化异常在集成测试类运行期间,ApplicationContext是否会再次尝试为该特定集成测试类中存在的每个单独的集成测试启动(最终将失败)?

    1. 询问上述场景,因为当bean发生故障时,我们看到到postgres的连接数量激增,似乎对于集成测试类中的每个集成测试(最终由于Failed to load ApplicationContext而失败),spring试图创建一个到postgres的新连接,并且在ApplicationContext失败之前不会破坏它。我们如何才能阻止这种情况,请提供一些建议。
  2. 另外,一旦我们得到Failed to load ApplicationContext,是否有一种方法可以完全自动地以编程方式终止所有集成测试的运行?如果是,请帮忙如何实现?谢谢。

测试框架- junit + Spring

更新:提到的测试框架使用。

UPDATE

我实现了对"测试上下文失败阈值"的内置支持;

从Spring Framework 6.1开始,上下文失败阈值策略已经到位,可以帮助避免重复尝试加载失败的ApplicationContext。默认情况下,失败阈值设置为1,这意味着对于给定的上下文缓存键,只会尝试加载一次ApplicationContext。任何后续尝试为相同的上下文缓存键加载ApplicationContext都将导致立即加载IllegalStateException,并给出一个错误消息,解释该尝试被先发制人地跳过。

要了解更多细节,请参阅Spring Framework参考手册。


原始答:

如果ApplicationContext反复加载失败,目前无法中止集成测试。

要投票支持这种支持,请参阅Spring框架问题。

  1. 如果在测试类中有多个集成测试,那么它将多次失败。

  2. 你可以使用dependsOnGroups终止所有的集成测试用例财产。

例如,您可以有一个方法来检查是否存在bean异常失败并将所有其他测试声明为依赖于此方法。但是这可以使用TestNG

来完成
@Test(groups = { "isApplicationContextFailed" }) // you can run with simply @Test here if there is only one independent test.
public void isApplicationContextFailed() {}
@Test(dependsOnMethods = { "isApplicationContextFailed" })
public void queryTestOne() {}
@Test(dependsOnMethods = { "isApplicationContextFailed" })
public void queryTestTwo() {}

您可以从TestNG ->https://testng.org/doc/documentation-main.html依赖方法

注意:-如果你正在使用JUnit,还有一些其他的方法可以做到这一点。在这种情况下,请更新。

如果您正在使用JUnit,那么在您的测试类中添加下面的login,它将工作。

public class BaseClass {
@BeforeClass
public void isApplicationContextFailed() {
//logic to check for application failure
}

//continue with your test methods.
}

建议您通过以下参考资料了解详情。

https://junit.org/junit4/javadoc/4.13/org/junit/BeforeClass.html

https://howtodoinjava.com/testng/testng-before-and-after-annotations/

最新更新