并行测试执行

Spring TestContext 框架提供在单个 JVM 中并行执行测试的基本支持。通常,这意味着大多数测试类或测试方法无需更改测试代码或配置即可并行运行。

有关如何设置并行测试执行的详细信息,请参阅您的测试框架、构建工具或 IDE 的文档。

请记住,在测试套件中引入并发可能会导致意外的副作用、奇怪的运行时行为以及间歇性或看似随机失败的测试。因此,Spring 团队提供了以下关于何时不应并行运行测试的通用指南。

如果测试满足以下条件,请勿并行运行:

  • 使用 Spring Framework 的 @DirtiesContext 支持。

  • 使用 Spring Framework 的 @MockitoBean@MockitoSpyBean 支持。

  • 使用 Spring Boot 的 @MockBean@SpyBean 支持。

  • 使用 JUnit Jupiter 的 @TestMethodOrder 支持或任何旨在确保测试方法按特定顺序运行的测试框架特性。但请注意,如果整个测试类并行运行,则此条不适用。

  • 更改共享服务或系统的状态,例如数据库、消息代理、文件系统等。这适用于嵌入式和外部系统。

如果并行测试执行因 ApplicationContext 在当前测试中不再处于活动状态而失败,这通常意味着 ApplicationContext 在另一个线程中已从 ContextCache 中移除。

这可能是由于使用了 @DirtiesContext,或者由于 ContextCache 的自动驱逐。如果 @DirtiesContext 是罪魁祸首,您需要找到方法避免使用 @DirtiesContext 或将这些测试排除在并行执行之外。如果 ContextCache 的最大大小已超出,您可以增加缓存的最大大小。有关详细信息,请参阅关于上下文缓存的讨论。

Spring TestContext 框架中的并行测试执行仅在底层的 TestContext 实现提供了复制构造函数时才可能,如TestContext 的 javadoc 中所述。Spring 中使用的 DefaultTestContext 提供了这样的构造函数。但是,如果您使用提供了自定义 TestContext 实现的第三方库,您需要验证它是否适合并行测试执行。