Parallel Test Execution

Spring Framework 5.0 在使用 Spring TestContext 框架时引入了对在单个 JVM 中并行执行测试的基本支持。通常,这意味着大多数测试类或测试方法可以在没有任何测试代码或配置更改的情况下并行运行。

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

请记住,在你的测试套件中引入并发性可能会导致意外的副作用、奇怪的运行时行为以及中断或看似随机失败的测试。因此,Spring 团队针对何时不并行运行测试提供了以下一般准则。

如果测试满足以下条件,则不要并行运行测试:

  • 使用 Spring Framework 的 `@DirtiesContext`支持。

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

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

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

如果并行测试执行失败,并出现异常,指出当前测试的 ApplicationContext 已不再活动,这通常意味着 ApplicationContext 已在另一个线程中从 ContextCache 中删除。 这可能是由于使用 @DirtiesContextContextCache 中的自动驱逐。如果 @DirtiesContext 是罪魁祸首,则您需要找到一种方法来避免使用 @DirtiesContext 或将此类测试排除在并行执行之外。如果 ContextCache 的最大大小已被超出,您可以增加缓存的最大大小。请参阅有关 context caching 的讨论以了解详情。

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