並行測試執行

Spring TestContext 框架提供在單個 JVM 中並行執行測試的基本支援。通常,這意味著大多數測試類或測試方法無需更改測試程式碼或配置即可並行執行。

有關如何設定並行測試執行的詳細資訊,請參閱您的測試框架、構建工具或 IDE 的文件。

請記住,在測試套件中引入併發可能會導致意外的副作用、奇怪的執行時行為以及間歇性或看似隨機失敗的測試。因此,Spring 團隊提供了以下關於何時不應並行執行測試的通用指南。

如果測試滿足以下條件,請勿並行執行:

  • 使用 Spring Framework 的 @DirtiesContext 支援。

  • 使用 Spring Framework 的 @MockitoBean@MockitoSpyBean 支援。

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

  • 使用 JUnit Jupiter 的 @TestMethodOrder 支援或任何旨在確保測試方法按特定順序執行的測試框架特性。但請注意,如果整個測試類並行執行,則此條不適用。

  • 更改共享服務或系統的狀態,例如資料庫、訊息代理、檔案系統等。這適用於嵌入式和外部系統。

如果並行測試執行因 ApplicationContext 在當前測試中不再處於活動狀態而失敗,這通常意味著 ApplicationContext 在另一個執行緒中已從 ContextCache 中移除。

這可能是由於使用了 @DirtiesContext,或者由於 ContextCache 的自動驅逐。如果 @DirtiesContext 是罪魁禍首,您需要找到方法避免使用 @DirtiesContext 或將這些測試排除在並行執行之外。如果 ContextCache 的最大大小已超出,您可以增加快取的最大大小。有關詳細資訊,請參閱關於上下文快取的討論。

Spring TestContext 框架中的並行測試執行僅在底層的 TestContext 實現提供了複製建構函式時才可能,如TestContext 的 javadoc 中所述。Spring 中使用的 DefaultTestContext 提供了這樣的建構函式。但是,如果您使用提供了自定義 TestContext 實現的第三方庫,您需要驗證它是否適合並行測試執行。