平行測試執行

Spring TestContext Framework 提供在單一 JVM 內平行執行測試的基本支援。一般而言,這表示大多數測試類別或測試方法可以平行執行,而無需對測試程式碼或組態進行任何變更。

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

請記住,將並行性引入您的測試套件可能會導致意想不到的副作用、奇怪的執行階段行為,以及間歇性或看似隨機失敗的測試。因此,Spring 團隊針對何時不應平行執行測試提供以下一般指南。

如果測試符合以下條件,請勿平行執行測試

  • 使用 Spring Framework 的 @DirtiesContext 支援。

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

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

  • 使用 JUnit 4 的 @FixMethodOrder 支援或任何旨在確保測試方法以特定順序執行的測試框架功能。但是請注意,如果整個測試類別平行執行,則不適用此情況。

  • 變更共用服務或系統(例如資料庫、訊息 Broker、檔案系統等)的狀態。這適用於嵌入式和外部系統。

如果平行測試執行失敗,並出現例外狀況,指出目前測試的 ApplicationContext 已不再作用中,這通常表示 ApplicationContext 已從不同執行緒中的 ContextCache 中移除。

這可能是由於使用 @DirtiesContext 或由於 ContextCache 的自動逐出所致。如果 @DirtiesContext 是罪魁禍首,您需要找到一種方法來避免使用 @DirtiesContext,或將此類測試從平行執行中排除。如果已超過 ContextCache 的最大大小,您可以增加快取的最大大小。如需詳細資訊,請參閱關於context 快取的討論。

只有在基礎 TestContext 實作提供複製建構子時,Spring TestContext Framework 中的平行測試執行才有可能,如 TestContext 的 javadoc 中所述。Spring 中使用的 DefaultTestContext 提供了這樣的建構子。但是,如果您使用提供自訂 TestContext 實作的協力廠商程式庫,則需要驗證它是否適用於平行測試執行。