讀古今文學網 > Maven實戰 > 12.4 使用jetty-maven-plugin進行測試 >

12.4 使用jetty-maven-plugin進行測試

在進行Web開發的時候,我們總是無法避免打開瀏覽器對應用進行測試,比如為了驗證程序功能、驗證頁面佈局,尤其是一些與頁面相關的特性,手動部署到Web容器進行測試似乎是唯一的方法。近年來出現了很多自動化的Web測試技術如Selenium,它能夠錄製Web操作,生成各種語言腳本,然後自動重複這些操作以進行測試。應該說,這類技術方法是未來的趨勢,但無論如何,手動的、親眼比對驗證的測試是無法被完全替代的。測試Web頁面的做法通常是將項目打包並部署到Web容器中,本節介紹如何使用jetty-maven-plugin,以使這些步驟更為便捷。

在介紹jetty-maven-plugin之前,筆者要強調一點,雖然手動的Web頁面測試是必不可少的,但這種方法絕不應該被濫用。現實中常見的情況是,很多程序員即使修改了一些較底層的代碼(如數據庫訪問、業務邏輯),都會習慣性地打開瀏覽器測試整個應用,這往往是沒有必要的。可以用單元測試覆蓋的代碼就不應該依賴於Web頁面測試,且不說頁面測試更加耗時耗力,這種方式還無法自動化,更別提重複性了。因此Web頁面測試應該僅限於頁面的層次,例如JSP、CSS、JavaScript的修改,其他代碼修改(如數據訪問),請編寫單元測試。

傳統的Web測試方法要求我們編譯、測試、打包及部署,這往往會消耗數10秒至數分鐘的時間,jetty-maven-plugin能夠幫助我們節省時間,它能夠週期性地檢查項目內容,發現變更後自動更新到內置的Jetty Web容器中。換句話說,它幫我們省去了打包和部署的步驟。jetty-maven-plugin默認就很好地支持了Maven的項目目錄結構。在通常情況下,我們只需要直接在IDE中修改源碼,IDE能夠執行自動編譯,jetty-maven-plugin發現編譯後的文件變化後,自動將其更新到Jetty容器,這時就可以直接測試Web頁面了。

使用jetty-maven-plugin十分簡單。指定該插件的坐標,並且稍加配置即可,見代碼清單12-13。

代碼清單12-13 配置jetty-maven-plugin

jetty-maven-plugin並不是官方的Maven插件,它的groupId是org.mortbay.jetty,上述代碼中使用了Jetty 7的最新版本。在該插件的配置中,scanIntervalSeconds顧名思義表示該插件掃瞄項目變更的時間間隔,這裡的配置是每隔10秒。需要注意的是,如果不進行配置,該元素的默認值是0,表示不掃瞄,用戶也就失去了所謂的自動化熱部署的功能。上述代碼中webappConfig元素下的contextPath表示項目部署後的context path。例如這裡的值為/test,那麼用戶就可以通過http://hostname:port/test/訪問該應用。

下一步啟動jetty-maven-plugin。不過在這之前需要對settings.xml做個微小的修改。前面介紹過,默認情況下,只有org.apache.maven.plugins和org.codehaus.mojo兩個groupId下的插件才支持簡化的命令行調用,即可以運行mvn help:system,但mvn jetty:run就不行了。因為maven-help-plugin的groupId是org.apache.maven.plugins,而jetty-maven-plugin的groupId是org.mortbay.jetty。為了能在命令行直接運行mvn jetty:run,用戶需要配置settings.xml如下:

現在可以運行如下命令啟動jetty-maven-plugin:

jetty-maven-plugin會啟動Jetty,並且默認監聽本地的8080端口,並將當前項目部署到容器中,同時它還會根據用戶配置掃瞄代碼改動。

如果希望使用其他端口,可以添加jetty.port參數。例如:

現在就可以打開瀏覽器通過地址http://localhost:9999/test/測試應用了。要停止Jetty,只需要在命令行輸入Ctrl+C即可。

啟動Jetty之後,用戶可以在IDE中修改各類文件,如JSP、HTML、CSS、JavaScript甚至是Java類。只要不是修改類名、方法名等較大的操作,jetty-maven-plugin都能夠掃瞄到變更並正確地將變化更新至Web容器中,這無疑在很大程度上幫助了用戶實現快速開發和測試。

上面的內容僅僅展示了jetty-maven-plugin最核心的配置點,如果有需要,還可以自定義web.xml的位置、項目class文件的位置、web資源目錄的位置等信息。用戶還能夠以WAR包的方式部署項目,甚至在Maven的生命週期中嵌入jetty-maven-plugin。例如,先啟動Jetty容器並部署項目,然後執行一些集成測試,最後停止容器。有興趣進一步研究的讀者可以訪問該頁面:http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin。