讀古今文學網 > Maven實戰 > 17.6 測試Maven插件 >

17.6 測試Maven插件

編寫Maven插件的最後一步是對其進行測試,單元測試較之於一般的Maven項目無異,可以參考第10章。手動測試Maven插件也是一種做法,讀者可以將插件安裝到本地倉庫後,再找個項目測試該插件。本節要介紹的並非上述兩種讀者已經十分熟悉的測試方法,而是如何編寫自動化的集成測試代碼來驗證Maven插件的行為。

讀者可以想像一下,既然是集成測試,那麼就一定需要一個實際的Maven項目,配置該項目使用插件,然後在該項目上運行Maven構建,最後再驗證該構建成功與否,可能還需要檢查構建的輸出。

既然有數以千計的Maven插件,那麼很可能已經有很多人遇到過上述的需求,因此Maven社區有一個用來幫助插件集成測試的插件,它就是maven-invoker-plugin。該插件能夠用來在一組項目上執行Maven,並檢查每個項目的構建是否成功,最後,它還可以執行BeanShell或者Groovy腳本來驗證項目構建的輸出。

BeanShell和Groovy都是基於JVM平台的腳本語言,讀者可以訪問http://www.beanshell.org/和http://groovy.codehaus.org/以瞭解更多的信息。本章下面的內容會用到少許的Groovy代碼,不過這些代碼十分簡單,很容易理解。

回顧一下前面的代碼行統計插件,可以使用Archetype創建一個最簡單的Maven項目,然後在該項目中配置maven-loc-plugin。如果一切正常,就應該能夠看到如下的Maven構建輸出:

為了驗證這一行為,先配置maven-loc-plugin的POM使用maven-invoker-plugin,如代碼清單17-6所示。

代碼清單17-6 配置maven-loc-plugin使用maven-invoker-plugin

代碼清單17-6中maven-invoker-plugin有三項配置。首先projectDirectory用來配置測試項目的目錄,也就是說在src/it目錄下存放要測試的Maven項目源碼;其次goals表示在測試項目上要運行的Maven目標,這裡的配置就表示maven-invoker-plugin會在src/it目錄下的各個Maven項目中運行mvn install命令;最後的postBuildHookScript表示在測試完成後要運行的驗證腳本,這裡是一個groovy文件。

從代碼清單17-6中我們還看到,maven-invoker-plugin的兩個目標install和run被綁定到了integration-test生命週期階段。這裡的install目標用來將當前的插件構建並安裝到倉庫中供測試項目使用,run目標則會執行定義好的mvn命令並運行驗證腳本。

當然僅僅該配置還不夠,src/it目錄下必須有一個或者多個供測試的Maven項目,我們可以使用maven-archetype-quickstart創建一個項目並修改POM使用mvn-loc-plugin,如代碼清單17-7所示。該測試項目的其餘代碼不再贅述。

代碼清單17-7 maven-loc-plugin的測試項目POM

代碼清單17-7就是一個最簡單的POM,然後配置maven-loc-plugin的count目標綁定到了verify生命週期階段。

測試項目準備好了,現在要準備的是與該項目對應的驗證腳本文件,即validate.groovy,它應該位於src/it/app目錄下(即上述測試項目的根目錄),內容如代碼清單17-8所示。

代碼清單17-8 maven-loc-plugin的集成測試驗證腳本

這段Groovy代碼做的事情很簡單。它首先讀取app項目目錄下的build.log文件,當maven-invoker-plugin構建測試項目的時候,會把mvn輸出保存到項目下的build.log文件中。因此,可以解析該日誌文件來驗證maven-loc-plugin是否輸出了正確的代碼行信息。

上述Groovy代碼首先假設沒有找到正確的主代碼統計信息和測試代碼統計信息,然後它逐行遍歷日誌文件,緊接著使用正則表達式檢查尋找要檢查的內容(兩個斜槓//中間的內容是正則表達式,而=~表示尋找該正則表達式匹配的內容),如果找到期望的輸出,就將countMain和countTest置為true。最後,如果這兩個變量的值有false,就拋出對應的異常信息。

Maven會首先在測試項目app上運行mvn install命令,如果運行成功,則再執行validate.groovy腳本。只有腳本運行通過且沒有異常,集成測試才算成功。

現在在maven-loc-plugin下運行mvn clean install,就能看到如下的輸出:

從輸出中可以看到maven-invoker-plugin的install目標將當前項目maven-loc-plugin安裝至本地倉庫,然後它的run目標構建測試項目app,並最後報告運行結果。

至此,所有Maven插件集成測試的步驟就都完成了。

上述樣例只涉及了maven-invoker-plugin的很少一部分配置點,用戶還可以配置:

·debug(boolean):是否在構建測試項目的時候開啟debug輸出。

·settingsFile(File):執行集成測試所使用的settings.xml,默認為本機環境settings.xml。

·localRepositoryPath(File):執行集成測試所使用的本地倉庫,默認就是本機環境倉庫。

·preBuildHookScript(String):構建測試項目之前運行的BeanShell或Groovy腳本。

·postBuildHookScript(String):構建測試項目之後運行的BeanShell或Groovy腳本。

要瞭解更多的配置點,或者查看更多的樣例。讀者可以訪問maven-invoker-plugin的站點:http://maven.apache.org/plugins/maven-invoker-plugin/。