并行测试执行

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

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

请记住,将并发引入到您的测试套件中可能会导致意外的副作用、奇怪的运行时行为以及测试偶尔或看似随机失败。因此,Spring团队为不应该并行运行测试提供以下一般准则。

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

  • 使用Spring Framework的@DirtiesContext支持。

  • 使用Spring Boot的@MockBean@SpyBean支持。

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

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

如果并行测试执行失败,并出现异常,指出当前测试的ApplicationContext不再处于活动状态,通常意味着ApplicationContext在不同线程中从ContextCache中被移除。

这可能是由于使用@DirtiesContext或由于自动从ContextCache中驱逐。如果@DirtiesContext是问题所在,您需要找到避免使用@DirtiesContext的方法,或者将这些测试排除在并行执行之外。如果ContextCache的最大大小已超出,您可以增加缓存的最大大小。有关详细信息,请参阅有关上下文缓存的讨论。

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