并行测试执行

Spring TestContext 框架提供在单个 JVM 中并行执行测试的基本支持。一般来说,这意味着大多数测试类或测试方法可以在没有任何测试代码或配置更改的情况下并行运行。

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

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

如果测试满足以下条件,请勿并行运行测试:

  • 使用 Spring 框架的@DirtiesContext 支持。

  • 使用 Spring 框架的@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实现的第三方库,则需要验证它是否适合并行测试执行。