Context 快取
一旦 TestContext 框架為測試載入 ApplicationContext
(或 WebApplicationContext
),該 Context 就會被快取並重複用於在同一個測試套件中宣告相同唯一 Context 組態的所有後續測試。為了理解快取如何運作,重要的是要理解「唯一」和「測試套件」的含義。
ApplicationContext
可以通過用於載入它的組態參數組合來唯一識別。因此,唯一的組態參數組合用於產生一個金鑰,Context 在該金鑰下被快取。TestContext 框架使用以下組態參數來建立 Context 快取金鑰
-
locations
(來自@ContextConfiguration
) -
classes
(來自@ContextConfiguration
) -
contextInitializerClasses
(來自@ContextConfiguration
) -
contextCustomizers
(來自ContextCustomizerFactory
) – 這包括@DynamicPropertySource
方法以及 Spring Boot 測試支援的各種功能,例如@MockBean
和@SpyBean
。 -
contextLoader
(來自@ContextConfiguration
) -
parent
(來自@ContextHierarchy
) -
activeProfiles
(來自@ActiveProfiles
) -
propertySourceDescriptors
(來自@TestPropertySource
) -
propertySourceProperties
(來自@TestPropertySource
) -
resourceBasePath
(來自@WebAppConfiguration
)
例如,如果 TestClassA
為 @ContextConfiguration
的 locations
(或 value
) 屬性指定 {"app-config.xml", "test-config.xml"}
,則 TestContext 框架會載入對應的 ApplicationContext
,並將其儲存在 static
Context 快取中,金鑰僅基於這些位置。因此,如果 TestClassB
也為其位置定義 {"app-config.xml", "test-config.xml"}
(顯式或隱式透過繼承),但不定義 @WebAppConfiguration
、不同的 ContextLoader
、不同的活動 Profile、不同的 Context Initializer、不同的測試屬性來源或不同的父 Context,則相同的 ApplicationContext
會由兩個測試類別共用。這表示載入應用程式 Context 的設定成本僅發生一次(每個測試套件),並且後續的測試執行速度會快得多。
測試套件和 Fork 程序
Spring TestContext 框架將應用程式 Context 儲存在靜態快取中。這表示 Context 實際上儲存在 為了從快取機制中受益,所有測試都必須在同一個程序或測試套件中執行。這可以通過在 IDE 中將所有測試作為一個群組執行來實現。同樣地,當使用建置框架(例如 Ant、Maven 或 Gradle)執行測試時,重要的是要確保建置框架不會在測試之間 Fork。例如,如果 Maven Surefire 外掛程式的 |
Context 快取的大小有上限,預設最大大小為 32。每當達到最大大小時,就會使用最近最少使用 (LRU) 的驅逐策略來驅逐和關閉過時的 Context。您可以通過設定名為 spring.test.context.cache.maxSize
的 JVM 系統屬性,從命令列或建置 Script 組態最大大小。作為替代方案,您可以通過 SpringProperties
機制設定相同的屬性。
由於在給定的測試套件中載入大量應用程式 Context 可能會導致套件花費不必要的時間來執行,因此通常最好確切地知道已載入和快取了多少 Context。要檢視底層 Context 快取的統計資訊,您可以將 org.springframework.test.context.cache
記錄類別的日誌級別設定為 DEBUG
。
在不太可能發生的情況下,測試會損壞應用程式 Context 並需要重新載入(例如,通過修改 Bean 定義或應用程式物件的狀態),您可以使用 @DirtiesContext
註解您的測試類別或測試方法(請參閱 Spring 測試註解 中關於 @DirtiesContext
的討論)。這會指示 Spring 從快取中移除 Context,並在執行下一個需要相同應用程式 Context 的測試之前重建應用程式 Context。請注意,對 @DirtiesContext
註解的支援由 DirtiesContextBeforeModesTestExecutionListener
和 DirtiesContextTestExecutionListener
提供,預設情況下已啟用。
ApplicationContext 生命周期和控制台記錄
當您需要除錯使用 Spring TestContext 框架執行的測試時,分析控制台輸出(即,輸出到 關於 Spring 框架本身或在 測試的 測試的
如果 Context 在特定測試方法之後根據 當 Spring |