spring-boot - 如何创建 Spring Boot 测试套件
问题描述
假设我有 10 个弹簧启动测试类(用 @RunWith(SpringRunner.class) 和 @SpringBootTest 注释)
每个测试都需要启动 spring 容器大约 10 秒,尽管容器可能会执行相同的初始化。
所以我可能需要 100 秒来进行“mvn 测试”。
有没有办法可以将我的 10 个测试类分组到一个套件中,让容器只启动一次。
所以我可以:
- 只为“mvn test”运行套件。(为各个测试类正确命名)
- 可选择在 IDE 中运行单个测试。
解决方案
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
在您的测试执行后使用它会导致一个新的应用程序上下文。
推荐阅读
- python - 如何在使用事件处理程序时更改全局变量
- scala - 按计数光滑分组
- java - 三星 S9+ 和 RenderScript Intrinsics
- r - 带有factoextra的pca biplot中的排斥功能
- reactjs - 根据断点更改 colspan
- laravel-5 - 子目录中的 Laravel websocket
- gremlin - Gremlin/Neptune:按顶点属性对边进行排序
- vue.js - 脚本“npm run dev”和“npm run watch”是做什么用的?
- c# - C++ Unity Plugin如何释放USB音频设备
- php - 实时模式中存在类似的对象,但使用了测试模式密钥来发出此请求。扔进php