《Spring 5官方文檔》11集成測試(一)
11.1 概述
能夠在不需要部署到應用服務器或連接到其它企業基礎服務的前提下做一些集成測試是很重要的。這將使你能夠測試以下內容:
- Spring IoC容器上下文的正確裝配。
- 使用JDBC或其它ORM工具訪問數據。這將包括SQL語句、Hibernate查詢和JPA實體映射的正確性等等這些內容。
Spring Framework在spring-test模塊中為集成測試提供了強有力的支持。該Jar包的實際名字可能會包含發布版本號而且可能是org.springframework.test這樣長的形式,這取決於你是從哪獲得的(請參閱section on Dependency Management中的解釋)。這個庫包括了org.springframework.test包,其中包含了使用Spring容器進行集成測試的重要的類。這個測試不信賴於應用服務器和其它的發布環境。這些測試會比單元測試稍慢但比同類型的Selenium測試或信賴於發布到應用服務器的遠程測試要快得多。
在Spring2.5及之後的版本,單元和集成測試支持是以注解驅動Spring TestContext框架這樣的形式提供的。TestContext框架對實際使用的測試框架是不可知的的,因此可以使用包括 JUnit, TestNG等等許多測試手段。
11.2 集成測試的目標
Spring的集成測試支持有以下幾點主要目標:
- 管理各個測試執行之間的Spring IoC容器緩存
- 提供測試配置實例的依賴注入
- 提供適合集成測試的事務管理
- 提供輔助開發人員編寫集成測試的具備Spring特性的基礎類
下麵幾節將解釋每個目標並提供實現和配置詳情的鏈接。
11.2.1 上下文管理和緩存
Spring TestContex框架對Spring ApplicationContext 和WebApplicationContext提供一致性加載並對它們進行緩存。對加載的上下文進行緩存提供支持是很重要的,因為啟動時間是個問題——不是因為Spring自己的開銷,而是被Spring容器初始化的對象需要時間去初始化。比如,一個擁有50到100個Hibernate映射文件的項目可能花費10到20秒的時間去載這些映射文件,在運行每一個測試工具中的測試用例之前都會引發開銷並導致總體測試運行變緩慢,降低開發效率。
測試類通常聲明一批XML的資源路徑或者Groovy的配置元數據——通常在類路徑中——或者是一批用於配置應用程序的注解類。這些路徑或者類跟在web.xml或者其它用於生產部署的配置文件中指定的是一樣的。
通常,一旦被加載過一次,ApplicationContext就將被用於每個測試中。因此啟動開銷在一次測試集中將隻會引發一次,隨後執行的測試將會快得多。在這裏,“測試集”的意思是在同一個JVM的所有測試——比如說,對給定項目或者模塊的一次Ant、Maven或者Gradle構建運行的所有測試。在不太可能的情況下,一個測試會破壞應用上下文並引起重新加載——比如,修改一個bean定義或者應用程序對象的狀態——TestContex框架將被設置為在開始下個測試之前重新加載配置並重建應用上下文。
11.2.2 測試配置的信賴注入
當TestContext框架加載你的應用程序上下文的時候,它將通過信賴注入有選擇性地配置測試實例。這為使用你的應用程序上下文中的預配置bean來建立測試配置提供了一個很方便的機製。這裏有一個很大的便處就是你可以在不同的測試場景中重複使用應用程序上下文(比如,配置基於Spring管理的對象圖、事務代理、數據源等等),這樣省去了為每個測試用例建立複雜的測試配置的必要。
舉例說明,考慮這樣一個場景,我們有一個類叫做HibernateTitleRepository,它實現了Title領域實體的數據訪問邏輯。我們想編寫集成測試來測試以下方麵:
- Spring配置:總的來說,就是與HibernateTitleRepository配置有關的一切是否正確和存在?
- Hibernate映射文件:是否所有映射都正確,並且延遲加載的設置是否準備就緒?
- HibernateTitleRepository的邏輯:此類中的配置實例是否與預期一致?
查看使用TestContext框架進行測試配置的信賴注入。
11.2.3 事務管理
測試中訪問一個真實數據庫的一個常見的問題是在持久層存儲狀態付出的努力。即使你使用開發環境的數據庫,改變相應的狀態也會影響將來的測試。並且,許多操作——插入或者改變持久層數據——也不能在事務之外執行(或者驗證)。
TestContext框架解決了這個問題。默認行為下,這個框架將為每個測試創建並回滾一個事務。你隻需簡單的假定事務是存在的並寫你的代碼即可。如果你調用事務代理對象,他們也會根據它們配置的語義正確執行。而且,如果一個測試方法在運行相應事務時刪除了選定表中的內容,事務默認情況下會進行回滾,數據庫會回到測試執行前的那個狀態。事務通過定義在應用程序上下文中的PlatformTransactionManager bean來得到支持。
如果你需要提交事務——通常不會這樣做,但有時當你想用一個特定的測試來填充或者修改數據庫時也會顯得有用——TestContext框架將根據@Commit注解的指示對事務進行提交而不是回滾。
查看使用TestContext框架進行事務管理。
11.2.3 集成測試的支持類
Spring TestContext框架提供了一些支持來簡化集成測試的編寫。這些基礎類為測試框架提供了定義良好的鉤子,還有一些便利的實例變量和方法,使你能夠訪問:
- ApplicationContext,用於從整體上來進行顯示的bean查找或者測試上下文的狀態。
- JdbcTemplate,用於執行SQL語句來查詢數據庫。這些的查詢可用於確認執行數據庫相關的應用程序代碼前後數據庫的狀態,並且Spring保證這些查詢與應用程序代碼在同一個事務作用域中執行。如果需要與ORM工具協同使用,請確保避免誤報。
還有,你可能想用特定於你的項目的實例和方法來創建你自己自定義的,應用程序範圍的超類。
查看TestContext框架的支持類。
最後更新:2017-05-18 10:32:27