如何创建 Spring Boot 测试套件

Posted

技术标签:

【中文标题】如何创建 Spring Boot 测试套件【英文标题】:How to create spring boot test suite 【发布时间】:2020-04-06 12:38:21 【问题描述】:

假设我有 10 个 spring boot 测试类(用 @RunWith(SpringRunner.class) 和 @SpringBootTest 注释)

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

所以“mvn 测试”可能需要 100 秒。

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

所以我可以:

仅为“mvn test”运行套件。 (为各个测试类正确命名) 可选择在 IDE 中运行单个测试。

【问题讨论】:

【参考方案1】:

Spring 使用缓存管理在测试之间缓存应用程序上下文:

默认情况下,一旦加载,配置的 ApplicationContext 会被重复用于每个测试。因此,每个测试套件只产生一次设置成本,随后的测试执行速度要快得多。在这种情况下,术语“测试套件”意味着所有测试都在同一个 JVM 中运行 — 例如,所有测试都从给定项目或模块的 Ant、Maven 或 Gradle 构建中运行。在不太可能的情况下,测试破坏了应用程序上下文并需要重新加载(例如,通过修改 bean 定义或应用程序对象的状态),可以将 TestContext 框架配置为在执行下一个之前重新加载配置并重建应用程序上下文测试。 (https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/testing.html#integration-testing)

因此,如果可能,此机制会尝试在已运行的应用程序上下文上执行您的集成测试。当您看到多个应用程序上下文启动时,这表明您的测试以某种方式使用了不同的设置,例如不同的配置文件处于活动状态,测试属性,MockBeans 等。

Spring 文档概述了它将应用程序上下文放入缓存中的指标:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/testing.html#testcontext-ctx-management-caching

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

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

【讨论】:

以上是关于如何创建 Spring Boot 测试套件的主要内容,如果未能解决你的问题,请参考以下文章

spriing boot 实战

如何在 Spring Boot 嵌入式 tomcat 中设置 HTTPS SSL 密码套件首选项

译:从 JSON 文件加载 Spring Boot 属性

Drools集成SpringBoot

Spring Boot初步认识

Spring Boot 集成 Ehcache 缓存,三步搞定!