首页 > 解决方案 > 如何创建 Spring Boot 测试套件

问题描述

假设我有 10 个弹簧启动测试类(用 @RunWith(SpringRunner.class) 和 @SpringBootTest 注释)

每个测试都需要启动 spring 容器大约 10 秒,尽管容器可能会执行相同的初始化。

所以我可能需要 100 秒来进行“mvn 测试”。

有没有办法可以将我的 10 个测试类分组到一个套件中,让容器只启动一次。

所以我可以:

标签: spring-bootjunitspring-testspring-boot-test

解决方案


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-管理缓存

例如,如果您不更改集成测试的任何测试属性,那么 Spring 可以仅在一个应用程序上下文上运行所有测试属性,并且非常高效。

您当前行为的另一个指标可能是@DirtiesContext在您的测试执行后使用它会导致一个新的应用程序上下文。


推荐阅读