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