说我有10个Spring Boot测试类(用@RunWith(SpringRunner.class)和@SpringBootTest注释)
每个测试都需要启动弹簧容器大约10秒钟,尽管容器可能会执行相同的初始化。
所以我可能需要100秒钟来进行“ MVN测试”。
有一种方法可以将我的10个测试类分组为1个套件,并让容器仅启动一次。
所以我可以:
Spring使用缓存管理在测试之间缓存应用程序上下文:
默认情况下,一旦加载,已配置的ApplicationContext将在每次测试中重复使用。因此,每个测试套件仅产生一次安装成本,并且随后的测试执行要快得多。在这种情况下,术语“测试套件”表示所有测试都在同一JVM中运行,例如,所有测试都从给定项目或模块的Ant,Maven或Gradle构建运行。在不太可能的情况下,测试破坏了应用程序上下文并需要重新加载(例如,通过修改bean定义或应用程序对象的状态),可以将TestContext框架配置为在执行下一个之前重新加载配置并重建应用程序上下文测试。 (https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/testing.html#integration-testing)
因此,如果可能,此机制会尝试在已经运行的应用程序上下文上执行集成测试。当您看到启动了多个应用程序上下文时,这表明您的测试以某种方式使用了不同的设置,例如不同的配置文件处于活动状态,测试属性,MockBean
等。
Spring文档概述了将哪些应用程序上下文放入其缓存中https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/testing.html#testcontext-ctx-management-caching
如果您例如不要为集成测试更改任何测试属性,Spring只能在一个应用程序上下文上运行所有测试属性,并且效率很高。
您当前行为的另一个指标可能是@DirtiesContext
的使用,它会在执行测试后导致全新的应用程序上下文。