劉偉,郭秋月,胡志剛
(1.湖南中醫藥大學信息科學與工程學院,湖南長沙,410208;2.中南大學軟件學院,湖南長沙,410075)
軟件自動化測試技術是近年來軟件工程的熱點研究領域之一。軟件自動化測試是通過測試工具和方法,將測試人員的人力勞動從非技術、重復且冗長的測試工作中解放出來的測試行為,包括實現機器執行測試、與預期結果進行對比,最后生成相應的測試報告等自動化的功能。自動化測試以縮短測試周期、節約測試成本、達到更高效地測試和軟件質量為目標[1]。
Web自動化測試是軟件自動化測試的重要組成部分,目前在業界已經取得了一定的研究成果。Selenium是Thought Works公司開發的一套適用于各種不一樣的Web應用的功能測試工具集,主要用于Web應用自動化測試,它不僅能支持多種瀏覽器和多種開發語言,而且還有很好的擴展性[2]。Selenium為諸多自動化Web測試框架提供了基礎,近年來已有一些基于Selenium的Web自動化測試框架的研究工作相繼報道[3-6]。
目前很多Web自動化測試框架都是基于Selenium實現的,主要是對Selenium框架的二次封裝。已有的基于Selenium實現的Web自動化測試框架存在測試腳本維護成本高、穩定性低、測試腳本不能自動生成等問題。在本文中將對基于Selenium的Web自動化測試框架開展優化,設計并實現了一套名為MultiUI的自動化測試框架,并在真實項目中予以應用,在一定程度上提高自動化測試的效率和穩定性,并進一步提升測試框架的跨平臺性。
隨著CPU主頻的升高和多核計算機的普及,利用多線程來并發執行測試任務,可以更加充分利用計算機資源,進而縮短測試時間。為此,為了提高執行效率,對Selenium進行并發化,將獨立的測試用例對象化進行多線程并發執行。使用線程的時候就創建一個線程,這樣實現較為方便。但是如果并發的線程數很多,并且每個線程都是在執行一個短時間時的任務被創建,執行結束后就被銷毀,這樣就會頻繁的創建和銷毀線程而產生大量的時間消耗,導致系統的效率大大降低。為了使線程執行完任務不被銷毀,本自動化測試框架采用線程池達到線程復用的效果。創建線程池后,線程池中沒有任何線程,當有任務提交(submit)給線程池后,就會創建線程去執行任務,當線程池中的線程數目達到核心池的大小(corePoolSize)后,就會把到達的任務放到緩存隊列(workQueue)中,直到所有任務緩存隊列中的任務都執行完后才終止(shutdown)。通過并行化優化可極大提高自動測試效率,縮短測試時間。
為了進一步提升自動化測試的執行效率和穩定性,我們將原框架采用真實瀏覽器模擬用戶操作的方式,改為采用無界面的瀏覽器實現。通過驅動無界面瀏覽器PhantomJS來實現自動化測試,PhantomJS 支持JavaScript API的無界面、運行在服務端的WebKit的環境,不需要瀏覽器支持,速度快,主要用于頁面自動化、網絡監測、頁面截圖和無界面測試。采用PhantomJS使Web自動化以無界面的方式運行,解決測試過程中加載瀏覽器元素導致測試速度慢和受網絡不穩定影響的問題;同時由于PhantomJS無界面的實現也擴展了自動化執行的平臺,使得自動化測試的執行能在無界面的Linux服務器上運行,并進一步提高了執行效率。PhantomJS重要應用場景之一就是實現對Web產品的無界面測試,它不是自動化測試框架,主要是通過測試腳本驅動相應的測試框架。PhantomJS是運行在WebKit環境中,可以對網頁進行截圖,除了能將網頁轉化為HTML、CSS等格式外,還支持GIF、PNG等圖片格式,為網頁截屏提供了更多的選擇。在本文中,基本設計思路為將PhantomJS封裝為WebDriver提供給Selenium調用,并且封裝PhantomJS實現的網頁截圖。
為了進一步提高自動化框架測試效率,必須提供更好的服務設施。Linux服務器會比Windows服務器性能優勢更大,所以為了使自動化測試框架能在Linux上運行,對自動化測試框架進行打JAR包的操作,在Linux上通過命令的方式運行自動化框架。
在我們的優化工作中采用了Maven Assembly插件打包方法,該方法適用于導入第三方JAR包的項目。Maven Assembly是能創建一個包含所有運行時所依賴外部JAR包、腳本和配置文件JAR包的插件,針對目的包需要包含第三方依賴包的情況,相比mvn package打包命令更簡易。Maven Assembly打包方法主要是通過pom.xml文件進行配置。本自動化框架pom.xml打包配置如下:
<artifactId>multiUI</artifactId>
<version>1.0.1.0506</version>
<packaging>JAR</packaging>
<!-- multiUI:為打包項目名;1.0.1.0506為定義的打包版本號,可以由用戶自定義;JAR為pom打包類型-->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<!-- mainClass:指定打JAR包后運行的主函數類名-->
<mainClass>com.qihoo.webtest.execute.ExecSchedule</mainClass>
</manifest>
</archive>
<descriptorRefs>
<!-- descriptorRef:JAR-with-dependencies 會把第三方依賴的JAR包打進最終的JAR包-->
<descriptorRef>
JAR-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
在pom.xml文件中配置以上信息后,通過cmd在進入項目的根目錄下運行mvn assembly:assembly命令打包即可,打包成功后會在項目target目錄下生產一個JAR包,如圖1所示。

圖1 JAR包生成圖
將由Maven Assembly插件打好的JAR包上傳到Linux服務器,把配置文件、測試數據文件和測試腳本上傳到配置文件中指定的目錄下。然后通過java命令:
java-JARmultiUI-1.0.1.0506-JAR-withdependencies.JAR-configfilesrcmain esourceconfig. yaml運行即可,后面-configfile需要加上配置文件的存放路徑。
通過采用了Maven Assembly插件打包為JAR的形式,可以方便地在Linux系統中使用命令形式運行自動化測試框架,提高了框架的靈活性和跨平臺性。
在優化前自動化框架采用的是真實瀏覽器,并且是單線程運行,但MutilUI采用的是無界面的瀏覽器和多線程并行的運行方式。為了更好地分析優化后的效果,對MutilUI與原自動化測試框架進行對比。優化前后的自動化測試框架運行在相同的軟硬件平臺上,運行環境完全一樣。優化前后自動化測試框架在測試腳本開發、測試腳本執行、測試腳本維護三方面存在差異。在實驗中我們選取一個旅游網站的搜索功能作為測試對象,包括酒店搜索(將用戶對酒店搜索的高頻詞匯作為測試數據,在被測Web應用中進行搜索,對得到的結果類型和內容與預期結果做對比)、景點搜索(將熱門景點名稱作為測試數據,在被測Web應用中搜索,搜索結果是否有正確分類)、推薦菜搜索(將用戶經常搜索的菜名作為測試數據,在被測Web應用中搜索,搜索結果是否有按照應用需求進行分類)。優化前后的具體用時對比如表1所示。

表1 優化前后測試用時對比
根據上面的計算方法得出該測試框架相對原有自動化測試框架的ROI(Return On Investment,投資回報率):
ROI=利益/優化后自動化測試成本=(∑(優化前自動化測試成本)-∑(優化后自動化測試成本))/∑(優化后自動化測試成本)
則自動化測試執行一次的投資回報率是:
ROI(1)=((8+0.15×1+4×1)-(7+0.12×1+2×1))/(7+0.12×1+2×1)=33.22%
同理可以算出多次的投資回報率,具體見表2所示。

表2 測試用時對比
從上面數據可以看出,并且隨著回歸測試次數越多,投資回報率越高。
下面以測試用例個數為單位,給出MutilUI與原自動化測試框架用時對比,如圖2所示。

圖2 原自動化測試框架與MutilUI框架測試用時對比
從測試用時對比的柱狀圖可以看出,在用時增長趨勢上原自動化測試框架明顯比MutilUI快,由此可得出優化后的MutilUI自動化測試框架相對原自動化測試框架在執行效率上有明顯提升。
本文基于Web自動化測試框架Selenium進行合理的優化和改進,設計并實現了一套名為MultiUI的自動化測試框架,在MultiUI框架中采用多線程技術實現測試用例的并發執行,提高了測試效率;同時將PhantomJS封裝為WebDriver的方法驅動無界面瀏覽器,實現了無界面化瀏覽器的自動化測試,在縮短測試時間的同時還提高了測試框架的穩定性;最后采用Maven Assembly插件打包為JAR的形式,可以方便地在Linux系統中使用命令形式運行自動化測試框架,提高了框架的靈活性和跨平臺性。
在真實項目中應用優化后的測試框架并與優化前的框架進行對比分析,結果表明,優化后的框架相對原自動化測試框架在執行效率上有明顯提升,本文的研究工作具有良好的應用價值,有助于提高自動化測試框架的執行效率和穩定性。