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

并行测试执行

Spring Framework 5.0 引入了基本支持,可以在使用 Spring TestContext Framework 时在单个 JVM 内并行执行测试。一般来说,这意味着大多数测试类或测试方法可以在不更改测试代码或配置的情况下并行运行。spring-doc.cadn.net.cn

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

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

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

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