在Cruise環境中加入Selenium整合測試
前文中我們成功使用 ANT + Maven2 + Cruise 搭建了持續整合環境,實現了 compile 、 test 、 tag 、 deploy 、 publish 等自動化環境。今天我們再接再厲,為其加入 Selenium 整合測試。
關於 Selenium 的介紹和使用方法,在此不做贅述,各位可以藉助萬能的 google 來入門一下,下面我們直切主題。
整合測試前
部署工程
因為在執行整合測試時,需要工程在 web 容器下正常執行,所以,在 maven 的 pre-integration-test 階段,我們需要將工程部署到 web 伺服器下:
啟動 selenium server
使用 maven 呼叫 selenium ,是通過 selenium-maven-plugin 這個外掛實現的,配置如下:
我們需要在 pre-integration-test 階段使用 start-server 目標啟動 selenium 伺服器,執行完整合測試,則需要在 post-integration-test 階段使用 stop-server 目標停掉之。
Xvfb
對於 linux 下的整合測試, cruise 可能執行在純字元介面,因此,當 selenium 啟動瀏覽器時,會報無 xserver 的錯誤,這時,我們就需要使用 xvfb 這個介面模擬程式來搞定這個問題了。正如下面這個連結所述
我們會在 pre-integration-test 階段啟動 xvfb ,然後 selenium 就可以在模擬的 xserver 中啟動瀏覽器了。
但是,我們這樣配置之後,雖然 linux 下可以正常執行整合測試,但是在 windows 下,我們的測試失敗了。
原因就出在這個 xvfb 上。在 windows 下,沒有這個程式來執行, pre-integration-test 階段自然就失敗了 …
我們使用 ${noxvfb} 變數,來決定是否執行 xvfb ,變數的值來自外部。那麼我們就可以用類似 mvn integration-test –Dnoxvfb=true 的命令來關閉 xvfb 了。
不過本地頻繁的輸入這個引數是一個很大的浪費(起碼鍵盤會折壽的說 … ),而且還要人工判斷是否是 windows 系統。所以,再次請出 ant 大神:
使用 <contains string="${os.name}" substring="nux"/> 標籤來判斷系統是否為 linux ,以便決定是否啟動 xvfb 。
執行整合測試
Selenium 的 maven 擴充套件支援兩種呼叫方式:使用使用 surefire 的 junit 呼叫和 selenese 。
surefire 的 junit 呼叫
Maven2 為我們提供了 integration-test 階段來進行整合測試,而一般我們會使用 maven-surefire-plugin 這個外掛來呼叫 junit ,進一步呼叫 Selenium 的測試用例( Selenium 支援多種語言進行),這一做法也可以找到一籮筐的解決方案,比如這裡:
和官方示例:
正如文中所述, maven-surefire-plugin 已經被預設註冊到了 test 階段,因此我們會使用如下的顯示定義來在整合測試階段呼叫 junit :
注意:由於 cruise 已經支援分階段執行,因此我們不希望在 integration-test 階段重複進行 unit-test ,因此,在 utest 目標中,使用了 ${skiput} 變數來由命令列傳入 unit-test 開關。
Selenese
除了使用 surefire 的 junit 呼叫,我們還可以使用 selenium-maven-plugin 的 selenese 目標,它可以脫離 junit ,直接使用瀏覽器端的 selenium 測試程式碼進行整合測試。