对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

并行测试执行

Spring Framework 5.0 在使用 Spring TestContext 框架时,引入了在单个 JVM 内并行执行测试的基本支持。通常来说,这意味着大多数测试类或测试方法无需对测试代码或配置进行任何修改即可并行运行。spring-doc.cadn.net.cn

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

请记住,在测试套件中引入并发可能会导致意外的副作用、奇怪的运行时行为,以及间歇性失败或看似随机失败的测试。因此,Spring 团队提供了以下一般性指导原则,说明在哪些情况下不应并行运行测试。spring-doc.cadn.net.cn

如果测试满足以下条件,请不要并行运行测试:spring-doc.cadn.net.cn

  • 使用 Spring Framework 的 @DirtiesContext 支持。spring-doc.cadn.net.cn

  • 使用 Spring Boot 的 @MockBean@SpyBean 支持。spring-doc.cadn.net.cn

  • 使用 JUnit 4 的 @FixMethodOrder 支持,或任何旨在确保测试方法按特定顺序执行的测试框架功能。但请注意,如果整个测试类是并行运行的,则此规则不适用。spring-doc.cadn.net.cn

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

如果并行测试执行失败,并抛出异常指出当前测试的ApplicationContext已不再处于活动状态,这通常意味着该ApplicationContext已在另一个线程中从ContextCache中被移除。spring-doc.cadn.net.cn

这可能是由于使用了 @DirtiesContext,或是由于上下文被自动从 ContextCache 中移除所致。如果问题根源在于 @DirtiesContext,那么您要么需要找到避免使用 @DirtiesContext 的方法,要么将此类测试排除在并行执行之外。如果 ContextCache 的最大容量已被超出,您可以增大缓存的最大容量。详情请参见关于上下文缓存的讨论。spring-doc.cadn.net.cn

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