整合測試

重要的是,能夠在無需部署到應用伺服器或連線到其他企業基礎設施的情況下執行一些整合測試。這樣做可以讓你測試以下內容:

  • Spring IoC 容器上下文的正確連線。

  • 使用 JDBC 或 ORM 工具進行資料訪問。這可以包括 SQL 語句的正確性、Hibernate 查詢、JPA 實體對映等等。

Spring Framework 在 `spring-test` 模組中提供了對整合測試的一流支援。實際 JAR 檔案的名稱可能包含釋出版本,也可能採用 `org.springframework.test` 的長形式,具體取決於你從哪裡獲取它(請參閱依賴管理部分以獲取解釋)。此庫包含 `org.springframework.test` 包,其中包含用於使用 Spring 容器進行整合測試的寶貴類。這種測試不依賴於應用伺服器或其他部署環境。此類測試執行速度比單元測試慢,但比等效的 Selenium 測試或依賴於部署到應用伺服器的遠端測試快得多。

單元和整合測試支援以註解驅動的 Spring TestContext Framework 的形式提供。TestContext 框架與實際使用的測試框架無關,這允許在各種環境中(包括 JUnit、TestNG 等)對測試進行檢測。

以下部分概述了 Spring 整合支援的高階目標,本章的其餘部分將重點介紹專用主題:

整合測試目標

Spring 的整合測試支援具有以下主要目標:

接下來的幾個部分描述了每個目標,並提供了實現和配置細節的連結。

上下文管理和快取

Spring TestContext Framework 提供 Spring `ApplicationContext` 例項和 `WebApplicationContext` 例項的一致載入以及這些上下文的快取。支援載入上下文的快取非常重要,因為啟動時間可能會成為一個問題——不是因為 Spring 本身的開銷,而是因為 Spring 容器例項化的物件需要時間來例項化。例如,一個擁有 50 到 100 個 Hibernate 對映檔案的專案可能需要 10 到 20 秒才能載入對映檔案,在每個測試夾具中執行每個測試之前都要承擔這種成本會導致整體測試執行速度變慢,從而降低開發人員的生產力。

測試類通常宣告 XML 或 Groovy 配置元資料的資源位置陣列——通常在類路徑中——或用於配置應用程式的元件類陣列。這些位置或類與 `web.xml` 或生產部署的其他配置檔案中指定的相同或相似。

預設情況下,一旦載入,配置的 `ApplicationContext` 將在每個測試中重用。因此,設定成本只在每個測試套件中承擔一次,後續測試執行會快得多。在此上下文中,“測試套件”指在同一個 JVM 中執行的所有測試——例如,對於給定專案或模組,從 Ant、Maven 或 Gradle 構建執行的所有測試。在極少數情況下,如果測試破壞了應用程式上下文並需要重新載入(例如,透過修改 bean 定義或應用程式物件的狀態),TestContext 框架可以配置為在執行下一個測試之前重新載入配置並重建應用程式上下文。

測試夾具的依賴注入

當 TestContext 框架載入您的應用程式上下文時,它可以透過使用依賴注入來選擇性地配置您的測試類例項。這提供了一種方便的機制,透過使用應用程式上下文中的預配置 bean 來設定測試夾具。這裡的一個強大優勢是,您可以在各種測試場景中重用應用程式上下文(例如,用於配置 Spring 管理的物件圖、事務代理、`DataSource` 例項等),從而避免為單個測試用例重複複雜的測試夾具設定。

舉個例子,考慮一個場景,我們有一個類(`HibernateTitleRepository`)實現了 `Title` 領域實體的資料訪問邏輯。我們想編寫整合測試來測試以下方面:

  • Spring 配置:基本上,所有與 `HibernateTitleRepository` bean 配置相關的內容是否都正確且存在?

  • Hibernate 對映檔案配置:所有內容是否都正確對映,並且是否設定了正確的延遲載入?

  • `HibernateTitleRepository` 的邏輯:此類的配置例項是否按預期執行?

請參閱使用 TestContext 框架 進行測試夾具的依賴注入。

事務管理

在訪問真實資料庫的測試中,一個常見問題是它們對永續性儲存狀態的影響。即使您使用開發資料庫,狀態的更改也可能會影響未來的測試。此外,許多操作(例如插入或修改持久資料)無法在事務外部執行(或驗證)。

TestContext 框架解決了這個問題。預設情況下,框架為每個測試建立並回滾一個事務。您可以編寫假定事務存在的程式碼。如果在測試中呼叫事務代理物件,它們會根據其配置的事務語義正確執行。此外,如果測試方法在為測試管理的事務中執行期間刪除了選定表的內容,則事務預設回滾,資料庫將恢復到執行測試之前的狀態。透過使用在測試的應用程式上下文中定義的 `PlatformTransactionManager` bean,為測試提供事務支援。

如果您希望事務提交(不常見,但偶爾在您希望特定測試填充或修改資料庫時很有用),您可以使用 `@Commit` 註解告訴 TestContext 框架使事務提交而不是回滾。

請參閱使用 TestContext 框架 進行事務管理。

整合測試支援類

Spring TestContext Framework 提供了幾個 `abstract` 支援類,可以簡化整合測試的編寫。這些基類提供了與測試框架連線的明確定義鉤子,以及方便的例項變數和方法,讓您可以訪問:

  • `ApplicationContext`,用於執行顯式 bean 查詢或測試整個上下文的狀態。

  • `JdbcTemplate`,用於執行 SQL 語句以查詢資料庫。您可以使用此類查詢來確認與資料庫相關的應用程式程式碼執行前後的資料庫狀態,Spring 確保此類查詢與應用程式程式碼在同一個事務範圍內執行。與 ORM 工具結合使用時,請務必避免 假陽性

此外,您可能希望建立自己的自定義、應用程式範圍的超類,其中包含特定於您專案的例項變數和方法。

請參閱 TestContext 框架 的支援類。

© . This site is unofficial and not affiliated with VMware.