Spring Framework 5.0 引入了对使用 Spring TestContext 框架时在单个 JVM 内并行执行测试的基本支持。一般来说,这意味着大多数测试类或测试方法可以在不改变测试代码或配置的情况下并行运行。
:::tips 关于如何设置并行测试执行的细节,请参见你的测试框架、构建工具或 IDE 的文档。 :::
请记住,在你的测试套件中引入并发性可能会导致意外的副作用、奇怪的运行时行为,以及间歇性或看似随机的测试失败。因此,Spring 团队提供了以下关于何时不并行运行测试的一般准则。
如果测试中出现以下情况,请不要并行运行测试:
- 使用 Spring Framework 的 @DirtiesContext 支持。
- 使用 Spring Boot 的 @MockBean 或 @SpyBean 支持。
- 使用 JUnit 4 的 @FixMethodOrder 支持或任何旨在确保测试方法以特定顺序运行的测试框架功能。然而,请注意,如果整个测试类是并行运行的,这并不适用。
- 改变共享服务或系统的状态,如数据库、消息代理、文件系统和其他。这同时适用于嵌入式和外部系统。
:::tips 如果并行测试执行失败,出现异常,说明当前测试的 ApplicationContext 不再活动,这通常意味着 ApplicationContext 在不同的线程中被从 ContextCache 中移除。
这可能是由于使用了 @DirtiesContex t或由于从 ContextCache 中自动驱逐。如果 @DirtiesContext 是罪魁祸首,你需要找到一种方法来避免使用 @DirtiesContext,或者将这类测试排除在并行执行之外。如果已经超过了 ContextCache 的最大尺寸,你可以增加缓存的最大尺寸。详见关于 上下文缓存 的讨论。 :::
:::tips 在 Spring TestContext 框架中,只有当底层的 TestContext 实现提供一个拷贝构造函数时,并行测试执行才有可能,这在 TestContext 的javadoc 中有所解释。Spring 中使用的 DefaultTestContext 提供了这样一个构造函数。然而,如果你使用一个提供自定义 TestContext 实现的第三方库,你需要验证它是否适合于并行测试执行。 :::