蔡維婷 黎偉健 范 敏
(中移互聯(lián)網(wǎng)有限公司品質(zhì)管理部 廣東 廣州 510640)
由于產(chǎn)品敏捷開發(fā)和版本快速迭代的需要,在移動互聯(lián)網(wǎng)應(yīng)用的開發(fā)過程中,必然存在大量重復(fù)的測試工作。目前,已有多種支持產(chǎn)品開發(fā)的測試工具,但存在測試流程不夠連貫、測試工具不相關(guān)聯(lián)的問題。因此,有必要在產(chǎn)品持續(xù)集成的基礎(chǔ)上實施進一步的自動化措施,以系統(tǒng)化方式管理產(chǎn)品開發(fā)過程,提高產(chǎn)品開發(fā)質(zhì)量和效率。本文以Android客戶端開發(fā)為例,闡述一種產(chǎn)品開發(fā)過程中“一鍵式”自動化測試工具鏈的設(shè)計和解決方案。
與產(chǎn)品開發(fā)相關(guān)的測試一般包括單元測試、代碼規(guī)范檢查和功能測試等[1-2]。在持續(xù)集成的開發(fā)環(huán)境中,部署自動化測試流程是保障開發(fā)質(zhì)量和效率的重要措施[3-4]。對于Android應(yīng)用開發(fā),業(yè)界已有開源的持續(xù)集成平臺[5-6]、開發(fā)構(gòu)建工具[7]和自動化測試框架[8-10]。開發(fā)人員可基于JUnit單元測試框架驗證代碼內(nèi)部邏輯[11-12],使用Findbugs、Checkstyle、PMD等代碼規(guī)范檢查工具評審代碼質(zhì)量[13],運用自動化測試框架對產(chǎn)品功能進行黑盒測試[14-15]。
開發(fā)過程需要經(jīng)過反復(fù)的測試驗證。然而,目前所使用的測試工具之間相互獨立,測試環(huán)節(jié)仍然需要由開發(fā)人員控制操作,對開發(fā)效率而言存在一定的局限性;并且,代碼質(zhì)量由開發(fā)人員自行把控,代碼提交前沒有經(jīng)過統(tǒng)一、規(guī)范的自動化檢測流程,不利于版本的穩(wěn)定迭代。為此,本文提出一種應(yīng)用于開發(fā)過程的自動化測試工具鏈,便于開發(fā)人員在開發(fā)過程中實現(xiàn)多項測試需求。開發(fā)人員只需一鍵觸發(fā)即可在持續(xù)集成的開發(fā)環(huán)境下,完成項目構(gòu)建、單元測試、靜態(tài)代碼檢查、功能測試、版本管理等功能。
本文提出的測試工具鏈系統(tǒng)主要由以下各部分構(gòu)成:
(1) 持續(xù)集成平臺(Jenkins):系統(tǒng)核心,控制自動化流程的執(zhí)行;
(2) 構(gòu)建工具(Ant):在Jenkins平臺執(zhí)行Ant指令集,調(diào)用代碼編譯、單元測試、代碼規(guī)范檢查、功能測試等構(gòu)建任務(wù)腳本;
(3) 單元測試框架(JUnit):源代碼中嵌入的測試用例,被Ant構(gòu)建工具調(diào)用;
(4) 代碼規(guī)范檢查插件(Fingbugs/Findsecbugs、Checkstyle、PMD):被Ant構(gòu)建工具調(diào)用,以檢查源代碼與設(shè)定代碼規(guī)范間的差異;
(5) 自動化測試框架(Robotium):使用其Solo類創(chuàng)建的自動化測試應(yīng)用,被Ant指令調(diào)用執(zhí)行;
(6) 版本管理工具(SVN):包括SVN服務(wù)器VisualSVN Server,用于分配版本倉庫和配置用戶權(quán)限;以及SVN客戶端TortoiseSVN,用于開發(fā)版本的更新和同步。
系統(tǒng)架構(gòu)如圖1所示。
圖1 產(chǎn)品開發(fā)過程自動化測試系統(tǒng)架構(gòu)
當(dāng)Android開發(fā)人員將代碼提交至SVN服務(wù)器,系統(tǒng)即以自動化方式執(zhí)行測試流程:SVN服務(wù)器即時遠(yuǎn)程觸發(fā)Jenkins持續(xù)集成平臺對開發(fā)項目的構(gòu)建;通過調(diào)用Ant工具進行項目代碼編譯,生成開發(fā)應(yīng)用;調(diào)用JUnit單元測試及Fingbugs/Checkstyle/PMD代碼規(guī)范檢查工具,生成檢測報告;構(gòu)建成功后,平臺將開發(fā)代碼及代碼檢測結(jié)果增量提交至SVN服務(wù)器,并將被測應(yīng)用部署在測試環(huán)境;同時激活已開啟的手機模擬器或測試終端,啟動關(guān)鍵功能的Robotium自動化測試,并將測試代碼及功能測試結(jié)果增量提交至SVN服務(wù)器。
自動化流程以任務(wù)流方式部署在Jenkins平臺,分別完成代碼檢測及其結(jié)果入庫、功能測試及其結(jié)果入庫四項任務(wù),流程如圖2所示。其中:將代碼檢測結(jié)果提交任務(wù)和功能測試任務(wù)設(shè)定為代碼檢測項目的下游任務(wù),即當(dāng)代碼檢測任務(wù)成功完成后,將并行觸發(fā)代碼檢測結(jié)果提交和功能測試;將功能測試結(jié)果提交任務(wù)設(shè)定為功能測試任務(wù)的下游任務(wù)。
圖2 自動化測試工具鏈流程
(1) 代碼檢測任務(wù):當(dāng)開發(fā)人員提交代碼更新,代碼檢測任務(wù)被遠(yuǎn)程觸發(fā)。首先檢測流程狀態(tài)標(biāo)識,若該流程當(dāng)前有被其他開發(fā)人員提交的任務(wù)在運行,則將新觸發(fā)的任務(wù)置于等待狀態(tài),以避免運行相同的流程造成Jenkins工作空間沖突。當(dāng)輪詢檢測到流程處于可執(zhí)行狀態(tài)時立即依次執(zhí)行代碼構(gòu)建、單元測試和代碼掃描。如果構(gòu)建失敗,Jenkins系統(tǒng)發(fā)送郵件通知開發(fā)人員,流程結(jié)束;如果構(gòu)建成功,將觸發(fā)代碼檢測結(jié)果提交入庫,并觸發(fā)自動化測試任務(wù)。代碼檢測任務(wù)使用參數(shù)方式將構(gòu)建號分別傳遞給代碼檢測提交和功能測試任務(wù),以便為代碼檢測任務(wù)的構(gòu)建日志入庫做準(zhǔn)備。
(2) 代碼檢測結(jié)果提交:當(dāng)代碼檢測任務(wù)完成后,開發(fā)代碼及其檢測結(jié)果將被提交入庫。根據(jù)Jenkins日志存儲路徑以及從上游代碼檢測任務(wù)傳遞的構(gòu)建號參數(shù)作為子目錄,獲取任務(wù)構(gòu)建日志。將工作空間中的代碼、生成的報告、構(gòu)建日志等內(nèi)容增量提交至SVN,以開發(fā)項目名稱及構(gòu)建號作為提交備注。
(3) 功能測試任務(wù):當(dāng)代碼檢測任務(wù)完成后,與代碼檢測結(jié)果提交任務(wù)并行的功能測試任務(wù)被觸發(fā)。啟動Android測試設(shè)備或模擬器,安裝被測應(yīng)用,開始自動化功能測試。若檢測到測試設(shè)備未能正常連接,Jenkins系統(tǒng)發(fā)送功能測試失敗的郵件通知,流程結(jié)束。功能測試任務(wù)使用參數(shù)方式將構(gòu)建號傳遞給功能測試結(jié)果提交任務(wù),以便為功能測試任務(wù)的構(gòu)建日志入庫做準(zhǔn)備。
(4) 功能測試結(jié)果提交:當(dāng)功能測試任務(wù)完成后,測試結(jié)果被提交入庫。根據(jù)Jenkins日志存儲路徑以及從上游功能測試任務(wù)傳遞的構(gòu)建號參數(shù)作為子目錄,獲取任務(wù)執(zhí)行日志。將工作空間中的功能測試代碼、生成的測試報告、運行日志等內(nèi)容增量提交至SVN服務(wù)器,以自動化測試項目名稱及構(gòu)建號作為提交備注。將流程狀態(tài)標(biāo)識設(shè)置為結(jié)束狀態(tài),流程結(jié)束。系統(tǒng)最后將流程結(jié)束郵件發(fā)送給開發(fā)人員。
本方案的自動化測試工具鏈系統(tǒng)實現(xiàn)Jenkins+ SVN+Ant+JUnit+Fingbugs(Findsecbugs)/Checkstyle/PMD+Robotium測試平臺和工具的連接,連接圖如圖3所示。工具鏈經(jīng)部署連接后,將在服務(wù)器后臺運行,無需人工干預(yù)。開發(fā)人員可通過Jenkins平臺實時查看流程運行狀態(tài),也可在收到系統(tǒng)發(fā)出的測試結(jié)束郵件通知后查看測試結(jié)果。
圖3 工具鏈連接圖
開發(fā)人員通過TortoiseSVN客戶端,將本地開發(fā)項目的遠(yuǎn)程路徑定位至VisualSVN服務(wù)器,用于開發(fā)代碼的同步和提交。
在SVN服務(wù)器的開發(fā)項目存儲庫上配置post-commit鉤子腳本,指明當(dāng)有代碼提交時將發(fā)起Jenkins平臺上工具鏈項目對應(yīng)鏈接的訪問,如http://Jenkins_IP_Address:Port/job/Project/build?token=token_id。在Jenkins平臺的工具鏈項目配置中,設(shè)定以遠(yuǎn)程觸發(fā)作為項目構(gòu)建條件,設(shè)置身份驗證令牌,使SVN服務(wù)器的鉤子腳本可以訪問Jenkins平臺工具鏈項目的構(gòu)建執(zhí)行頁面,以啟動對代碼提交任務(wù)的自動化測試流程。
Jenkins平臺對自動化流程中各任務(wù)的執(zhí)行主要以批處理命令的方式調(diào)用Ant指令集腳本。一般情況下,構(gòu)建腳本文件build.xml位于開發(fā)項目的根目錄,為了使自動化流程覆蓋代碼檢測功能,對Jenkins平臺以及Android SDK安裝路徑下的build.xml文件作以下改動:
(1) 在Jenkins平臺項目路徑下部署開發(fā)項目的構(gòu)建文件(命名為build_android.xml),作為通用的項目構(gòu)建腳本文件。在build_android.xml文件初始的項目定義部分,聲明項目在Jenkins平臺工作空間路徑basedir及Android SDK的安裝路徑sdk.dir。
(2) 在Android SDK安裝目錄下的Ant構(gòu)建文件 oolsantuild_ant.xml中,在輸入、輸出路徑部分各子目錄前添加basedir,使Ant構(gòu)建腳本能自動適配到需要執(zhí)行構(gòu)建的項目路徑,即:
補充為:
(3) 在Jenkins控制臺任務(wù)腳本的Ant命令行中,添加構(gòu)建文件參數(shù)“-buildfile”及構(gòu)建文件所在路徑,使Ant工具調(diào)用指定的腳本文件執(zhí)行構(gòu)建。
在構(gòu)建腳本文件build_android.xml中,增加對JUnit單元測試子任務(wù)junit的定義,說明Android SDK中JUnit插件的路徑,指定所生成檢測報告的文件類型。Jenkins控制臺在完成項目編譯后,通過使用Ant工具執(zhí)行“ant junit”命令,即可執(zhí)行代碼單元測試,并生成測試報告。截取部分代碼如下:
location="${sdk.dir} oolslibjunit.jar"/>
將代碼規(guī)范檢查插件Findbugs(Findsecbugs)、Checkstyle和PMD置于Jenkins平臺Ant工具庫目錄下。在構(gòu)建腳本文件build_android.xml中,分別添加各代碼規(guī)范檢查插件對應(yīng)子任務(wù)findbugs(包括fingsecbugs)、checkstyle和pmd的定義,說明插件的路徑及其classname、代碼規(guī)范集文件路徑以及需要生成測試報告的文件類型。Jenkins控制臺在完成項目編譯后,通過使用Ant工具執(zhí)行“ant findbugs checkstyle pmd”命令,即可執(zhí)行代碼規(guī)范檢查,并生成相應(yīng)的測試報告。截取部分代碼如下:
dir= "${ant.library.dir}/findbugs-3.0.1/lib">
classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/> outputFile="${findbugs_result_folder}/findbugs_result.xml"/> path="${sdk.dir}platformsandroid-21android.jar"/> classpathref="checkstyle.path" classname="com.puppycrawl.tools.checkstyle.ant.CheckstyleAntTask"/> dir="${ant.library.dir}/pmd-bin-4.2.6/lib"/> classname="net.sourceforge.pmd.ant.PMDTask" classpathref="pmd.classpath"/> 當(dāng)完成代碼構(gòu)建和代碼規(guī)范檢測任務(wù)后,工具鏈進入自動化功能測試環(huán)節(jié)。測試程序由基于Robotium框架的測試項目產(chǎn)生。采用Robotium的主要原因是相比其他測試框架,Robotium在調(diào)用過程中,包括啟動和運行可以完全不用人工干預(yù),有利于在自動化工具鏈中使用。Jenkins控制臺通過“adb devices”命令驗證存在已連接的測試手機或模擬器,對其發(fā)送keyevent指令進行測試終端的解鎖激活。為了獲取在終端上運行的測試日志和結(jié)果,Jenkins控制臺通過執(zhí)行“adb logcat-d”指令,使運行在終端上的測試數(shù)據(jù)同步傳輸?shù)絁enkins平臺上。以Robotium測試項目設(shè)定的關(guān)鍵字作為篩選條件,對數(shù)據(jù)作過濾處理,將測試日志和結(jié)果在Jenkins平臺上予以展示和保存。 在Robotium測試代碼構(gòu)建文件build_robotium.xml初始的項目定義部分,聲明項目在Jenkins平臺工作空間路徑basedir以及Android SDK的安裝路徑sdk.dir,使構(gòu)建腳本通用于開發(fā)項目不同開發(fā)人員的使用。測試代碼編譯后生成Test.apk。Jenkins控制臺使用Ant工具運行“ant uninstall installd”,將被測應(yīng)用App.apk重新安裝在真機或模擬器上。在Jenkins控制臺運行Ant工具命令“ant uninstall clean debug install test”,依次生成和安裝Test.apk,并運行Robotium自動化測試。 測試任務(wù)執(zhí)行完畢后,Jenkins平臺向SVN服務(wù)器發(fā)起對增量代碼、日志和測試結(jié)果的提交。Jenkins平臺首先調(diào)用“svn update”命令使項目空間與SVN服務(wù)器同步;調(diào)用“svn delete”和“svn add”命令發(fā)現(xiàn)在工具鏈運行過程中產(chǎn)生的文件變動;通過“svn status”命令檢測提交狀態(tài),如有代碼沖突,由Jenkins平臺中斷自動化流程,系統(tǒng)發(fā)出告警郵件;調(diào)用“svn commit”命令進行代碼提交,使用“-m”參數(shù)注明提交備注。 在已部署自動化測試工具鏈的系統(tǒng)上,對一個Android開發(fā)應(yīng)用的開發(fā)過程實施自動化測試流程。經(jīng)實踐驗證,當(dāng)開發(fā)人員向SVN服務(wù)器提交代碼更新,立即觸發(fā)Jenkins平臺運行自動化測試,包括代碼構(gòu)建、單元測試、代碼規(guī)范檢查、功能測試和版本控制,并輸出運行日志和測試報告。Jenkins平臺按任務(wù)腳本設(shè)定,在流程運行過程中實時顯示和記錄自動化測試的運行信息。截取部分運行結(jié)果如下: Total time: 30 seconds [CHECKSTYLE] checkstyle_report.xml with 117 unique warnings and 0 duplicates. [FINDBUGS] findbugs_result.xml with 8 unique warnings and 0 duplicates. [PMD] pmd_result.xml with 2 unique warnings and 0 duplicates. Triggering a new build of robotiumTest Email was triggered for: Always Finished: SUCCESS 當(dāng)工具鏈運行出現(xiàn)異常情況,如測試終端未連接、代碼編譯構(gòu)建失敗、代碼提交發(fā)現(xiàn)沖突等,系統(tǒng)向開發(fā)人員發(fā)送運行失敗通知郵件,提供錯誤日志信息。當(dāng)測試任務(wù)遇到異常超時,系統(tǒng)中的超時保護機制能中止當(dāng)前流程,并由Jenkins平臺發(fā)送告警郵件通知開發(fā)人員,提供出錯信息。當(dāng)測試正常運行結(jié)束后,系統(tǒng)向開發(fā)人員發(fā)送郵件,說明工具鏈對應(yīng)的開發(fā)項目名稱、系統(tǒng)鏈接、本次測試序號和最終運行結(jié)果。 最終生成的測試報告,含文本和XML格式,包括JUnit單元檢測報告、Fingbugs(Findsecbugs)、Checkstyle、PMD靜態(tài)代碼掃描檢測報告以及自動化功能測試報告。其中,XML格式的代碼檢測報告可在Jenkins平臺以圖表方式展示,包含代碼缺陷描述、代碼行定位和代碼更替參考。截取Checkstyle檢測報告如圖4所示。 圖4 Checkstyle檢測報告 對于流程主要環(huán)節(jié),工具鏈的測試結(jié)果提交子任務(wù)將自動保存測試運行日志,以便追溯版本測試信息。日志提交結(jié)果截圖如圖5所示。 圖5 測試日志提交記錄 為避免因項目并發(fā)提交造成的沖突,自動化流程中設(shè)置的運行狀態(tài)保護機制能使被觸發(fā)的測試任務(wù)根據(jù)流程當(dāng)前的狀態(tài)被啟動運行或被置于隊列中等待。因此,部署的工具鏈系統(tǒng)可用于開發(fā)團隊的開發(fā)人員共同使用。同樣,工具鏈也可用于多個開發(fā)項目的自動化測試,只要SVN服務(wù)器上的開發(fā)項目和Jenkins平臺上部署的自動化流程對應(yīng),以便調(diào)用相應(yīng)的工具鏈。 本文提出了一種Android應(yīng)用開發(fā)中自動化測試工具鏈的解決方案。運用自動化流程實現(xiàn)產(chǎn)品持續(xù)集成過程中所執(zhí)行的代碼構(gòu)建、單元測試、代碼規(guī)范檢查和功能測試,并配備版本控制、日志管理等功能,有助于系統(tǒng)管理開發(fā)過程,規(guī)范代碼質(zhì)量,提高產(chǎn)品開發(fā)和測試效率。3.6 Jenkins平臺與Robotium測試框架間的連接
3.7 Ant構(gòu)建與Robotium自動化測試框架間的連接
3.8 Jenkins平臺向SVN服務(wù)器發(fā)起提交的連接
4 實施驗證
5 結(jié) 語