朱煥亮ZHU Huan-liang(中航工業(yè)信息技術(shù)中心 金航數(shù)碼科技有限責(zé)任公司,北京 100028)
基于自動(dòng)化測試框架的用例研究與實(shí)現(xiàn)
朱煥亮
ZHU Huan-liang
(中航工業(yè)信息技術(shù)中心 金航數(shù)碼科技有限責(zé)任公司,北京 100028)
針對(duì)軟件自動(dòng)化測試框架開發(fā)自動(dòng)化測試用例效率不高的現(xiàn)狀,分析問題產(chǎn)生原因,提出通過設(shè)計(jì)自動(dòng)生成工具來改善測試用例的開發(fā)方式,并給出提高自動(dòng)化測試用例開發(fā)效率的具體實(shí)現(xiàn)。
自動(dòng)化測試框架;測試用例自動(dòng)生成
隨著軟件系統(tǒng)的日趨復(fù)雜以及回歸測試等重復(fù)性測試在整個(gè)軟件生命周期中所占的重要地位,我們必須使用自動(dòng)化測試技術(shù)來提高我們的測試效率。自動(dòng)化測試技術(shù)能幫助軟件開發(fā)人員和測試人員在更短時(shí)間內(nèi)開發(fā)出更高質(zhì)量的產(chǎn)品,通過代替頻繁重復(fù)的手工測試從而節(jié)省了大量的時(shí)間和開支。但是利用捕捉/回放測試工具本身無法提供高效的測試。捕捉產(chǎn)生的腳本對(duì)于應(yīng)用的變化過于敏感,以至于測試人員要不停地修改測試腳本。這樣的測試腳本不是我們想要的。我們需要的是一個(gè)易于維護(hù)的,可以應(yīng)用于各種不同應(yīng)用的測試模型。這樣,計(jì)算機(jī)就比人更適合完成測試任務(wù)。另一方面,手工測試也存在一些局限性:手工測試無法做到覆蓋所有代碼路徑;如果有大量(幾千)的測試用例,需要在短時(shí)間內(nèi)(1天)完成,手工測試幾乎不可能做到。自動(dòng)化所能帶來的核心價(jià)值就是“效率”。本文通過介紹基于金航數(shù)碼自動(dòng)化測試框架的自動(dòng)化測試用例的實(shí)現(xiàn)方式,闡述如何提高自動(dòng)化測試用例開發(fā)效率。
自動(dòng)化測試有別于手工測試,其特點(diǎn)在于需要開發(fā)自動(dòng)化測試用例(編寫測試代碼),類似于TestNG[1](一個(gè)常用的自動(dòng)化測試執(zhí)行框架),這些框架過分注重“框架”的功能,強(qiáng)調(diào)框架即應(yīng)用程序的代碼開發(fā)架構(gòu),開發(fā)工作就是向其中填入業(yè)務(wù)代碼。業(yè)內(nèi)常見的測試框架良莠不齊,很多框架都是封裝5~6個(gè)類似TestNG這樣的工具,這些底層工具提供不同的功能,而框架的頂層規(guī)范了一種自身的測試用例的寫法,這樣開發(fā)人員無需了解底層框架的接口,只需掌握框架的用例編寫方式,即可完成測試用例的開發(fā)實(shí)現(xiàn)。這種自動(dòng)化測試開發(fā)的模式,大多只注重了自動(dòng)化測試執(zhí)行的實(shí)現(xiàn),并沒有關(guān)注自動(dòng)化測試開發(fā),導(dǎo)致在自動(dòng)化測試用例開發(fā)階段的工作效率較低,主要體現(xiàn)在以下三方面:
第一,開發(fā)代碼時(shí),界面元素定位花費(fèi)時(shí)間較多。界面元素定位過程是一個(gè)需要通過工具查看,分析出元素在界面中所處位置結(jié)構(gòu)(像Web項(xiàng)目需要用“開發(fā)者工具”查看HTML結(jié)構(gòu)),描述元素屬性特征,最終通過用代碼的形式使計(jì)算機(jī)識(shí)別并進(jìn)行操作,這個(gè)過程不僅需要觀察和經(jīng)驗(yàn),更需要反復(fù)嘗試。
第二,開發(fā)人員需要手工寫入大量的測試代碼。在定位好元素的描述信息和操作后,測試用例開發(fā)人員需要根據(jù)框架對(duì)腳本的規(guī)則編寫測試用例,編寫過程中即便有IDE等工具的幫助,也無法保證手工編寫的代碼沒有錯(cuò)誤。另外,學(xué)習(xí)使用這些規(guī)則和編程技術(shù)有一定難度。
第三,在一個(gè)測試用例開發(fā)完成的時(shí)候,不能對(duì)測試流程進(jìn)行可執(zhí)行性驗(yàn)證。無論是JAVA代碼,還是不需要編譯的腳本語言,在開發(fā)測試用例的時(shí)候,很難通過及時(shí)的回放,驗(yàn)證開發(fā)出來的測試代碼是否符合測試目標(biāo)。這種開發(fā)模式需要完成一整段代碼后對(duì)腳本進(jìn)行回放,如果在代碼段中出現(xiàn)一段錯(cuò)誤,就需要修改并重新執(zhí)行之前的代碼,導(dǎo)致開發(fā)時(shí)間不必要的延長。
2.1自動(dòng)化測試框架概述
金航數(shù)碼自動(dòng)化測試框架提供一組抽象構(gòu)件與構(gòu)件實(shí)例間交互的方法,以及一套測試自動(dòng)化相關(guān)問題的解決方案。自動(dòng)化測試框架由自動(dòng)化測試開發(fā)系統(tǒng)和自動(dòng)化測試管理端兩部分組成。自動(dòng)化測試開發(fā)系統(tǒng)通過“錄制-回放”的方式開發(fā)自動(dòng)化測試用例,錄制是以通過記錄用戶鼠標(biāo)、鍵盤操作的方式自動(dòng)生成測試代碼,生成過程不需要手工編寫程序,自動(dòng)生成的測試用例可以在本地回放,也可上傳到Web管理端遠(yuǎn)程測試執(zhí)行。Web管理端是自動(dòng)化測試各環(huán)節(jié)的全程可視化管理工具,能夠在無人值守的情況下,完成測試環(huán)境準(zhǔn)備、測試用例分發(fā)部署、測試結(jié)果收集并自動(dòng)生成測試報(bào)告,能夠加速測試效率,縮短測試周期。金航數(shù)碼自動(dòng)化測試框架如圖1所示。
圖1 測試框架
2.2自動(dòng)化測試用例開發(fā)的基礎(chǔ)-界面元素定位
界面元素定位被認(rèn)為是自動(dòng)化測試用例開發(fā)的基礎(chǔ),通過設(shè)計(jì)開發(fā)元素定位的工具,能夠抓取到特定的瀏覽器或被測程序界面的元素結(jié)構(gòu),并通過記錄用戶鼠標(biāo)、鍵盤的操作行為[2],即鍵盤、鼠標(biāo)所觸發(fā)的事件,自動(dòng)給出元素的定位方式和信息。元素的定位信息具有唯一性,在監(jiān)聽到事件并由框架自動(dòng)生成出元素的定位信息后,如果框架自動(dòng)檢查的結(jié)果是多個(gè)界面元素,通過添加自身屬性或從其父類元素屬性,然后再次進(jìn)行驗(yàn)證,重復(fù)這一過程,直至獲得一個(gè)最簡潔的且是唯一的界面元素。元素定位信息可以設(shè)定屬性偏好,每個(gè)被測系統(tǒng)的開發(fā)風(fēng)格不一致,比如用EasyUI開發(fā)的Web前端HTML的格式十分固定,但I(xiàn)d屬性的意義不明顯,常規(guī)的Xpath表達(dá)式(像FireFox的FirePath生成的Xpath表達(dá)式)生成工具[4]不能解決這個(gè)問題。金航數(shù)碼的開發(fā)工具會(huì)自動(dòng)記錄屬性偏好,可以把這種模式預(yù)先保存到框架中,在識(shí)別到這種結(jié)構(gòu)時(shí)給出預(yù)先設(shè)定,尤其在用戶主動(dòng)糾正某個(gè)Xpath表達(dá)式之后。
2.3測試用例自動(dòng)生成
準(zhǔn)備好界面元素定位信息和測試數(shù)據(jù)后,就可以生成測試用例了。測試用例由測試數(shù)據(jù)和測試腳本組成。測試數(shù)據(jù)包括界面元素定位信息和測試過程中用到的數(shù)據(jù)。測試腳本是使用Java語言編寫的代碼,按照關(guān)鍵字驅(qū)動(dòng)[3]規(guī)則編寫,描述了測試執(zhí)行的流程。測試數(shù)據(jù)與測試腳本分離的設(shè)計(jì),使測試用例形成一個(gè)較小粒度的測試程序,在HP ALM中叫做應(yīng)用程序空間[5]。測試腳本調(diào)試的最大困難在于,如何使每一行代碼,都能像一個(gè)獨(dú)立的應(yīng)用程序一樣執(zhí)行。測試執(zhí)行依賴于被測程序,被測程序的運(yùn)行依賴于瀏覽器、模擬器,所以即便開發(fā)出來的代碼正確,執(zhí)行成功與否也要取決于被測程序的狀態(tài)(例如:界面和時(shí)效),框架會(huì)為這個(gè)被測程序創(chuàng)建一個(gè)session連接,通過這個(gè)鏈接與被測程序產(chǎn)生關(guān)聯(lián),這個(gè)session在記錄被測程序鼠標(biāo)事件外,還可以通過回放部分已生成的測試代碼來進(jìn)行調(diào)試。調(diào)試時(shí),只需通過手動(dòng)調(diào)整被測程序,再通過session來操來執(zhí)行測試。因?yàn)樵O(shè)計(jì)框架之初采用Java作為腳本語言,所以在測試腳本調(diào)試時(shí)就需要設(shè)計(jì)一個(gè)這樣的流程:把要執(zhí)行的代碼存放在一個(gè)Class中→通過JDK 編譯成class文件→使用自定義類加載器加載到虛擬機(jī)中→實(shí)例化執(zhí)行對(duì)象并注入環(huán)境變量→建立與被測程序的連接session。
用例自動(dòng)生成程序會(huì)根據(jù)記錄用戶操作的流程和其他測試資源寫入不同的數(shù)據(jù)庫中。在遠(yuǎn)程測試執(zhí)行的時(shí)候,遠(yuǎn)程測試機(jī)根據(jù)需要把這些資源下載到本地,編譯執(zhí)行。
由于采用自動(dòng)定位的方式,使得記錄一個(gè)元素操作從首次定位、多次迭代到測試腳本的生成過程,處理時(shí)間壓縮到3秒鐘以內(nèi)(即便處理復(fù)雜的多frame頁面),只需鼠標(biāo)點(diǎn)擊界面操作,更重要的是這些定位信息和代碼都通過了測試驗(yàn)證,由于驗(yàn)證程序和測試執(zhí)行程序使用同一段代碼邏輯,避免了生成的定位信息和代碼執(zhí)行時(shí)不匹配的現(xiàn)象,較好的保持了從開發(fā)用例到用例執(zhí)行的一致性。自主研發(fā)框架的定位功能還有一個(gè)優(yōu)勢就是根據(jù)行業(yè)產(chǎn)品的特征,可以定制自己的偏好,生成符合產(chǎn)品風(fēng)格的定位信息。
測試用例自動(dòng)生成的直觀好處可降低開發(fā)用例人員的投入成本,開發(fā)者無需了解框架底層工具的具體實(shí)現(xiàn),更不用掌握具體測試用例的編寫規(guī)則以及編程技術(shù),從而更關(guān)注測試用例的設(shè)計(jì)本身。在自動(dòng)生成測試用例的同時(shí)把測試腳本與測試數(shù)據(jù)分離儲(chǔ)存,通過同步測試管理系統(tǒng),使遠(yuǎn)程測試部署執(zhí)行,用例維護(hù)起來更加便捷。
測試腳本動(dòng)態(tài)的調(diào)試,使每一行測試代碼都可以作為單獨(dú)的測試程序運(yùn)行,這個(gè)測試程序包含了測試數(shù)據(jù)、定位信息等,這也正是快速迭代開發(fā)用例的方式,拋棄舊的調(diào)試流程(即:開發(fā)一個(gè)完整流程的測試用例→整段代碼調(diào)試→修改錯(cuò)誤→恢復(fù)被測程序場景→再次執(zhí)行),改為以極小的代碼段進(jìn)行調(diào)試執(zhí)行,使測試用例開發(fā)時(shí)間縮短為之前的1/4左右。
元素自動(dòng)定位、代碼自動(dòng)生成以及腳本動(dòng)態(tài)調(diào)試等這些工具所共同構(gòu)成的用例開發(fā)方式,可以明顯降低開發(fā)自動(dòng)化測試用例的時(shí)間,并且一定程度上降低了自動(dòng)化測試框架的使用門檻,從而快速反饋軟件質(zhì)量。
[1] Beust.C,Suleiman.H .Next generation Java testing:TestNG and advanced concepts[M].2007.
[2] 姚礪,束永安.基于Java的捕獲/回放測試工具的實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2003(15).
[3] 管小娟,周誠,錢炫宇,劉時(shí)敏.基于驅(qū)動(dòng)的自動(dòng)化測試研究與應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2014(02).
[4] 劉斌,張曉婧.Web信息抽取系統(tǒng)的設(shè)計(jì)[J].微型電腦應(yīng)用,2013(03).
[5] 王振華.復(fù)雜工作流軟件自動(dòng)化測試方法的研究[D].復(fù)旦大學(xué),2009.
Research and implementation of test case based on automated testing framework
TP311.1
A
1009-0134(2016)06-0147-02
2016-04-19
朱煥亮(1974 -),男,高級(jí)工程師,碩士,主要從事工業(yè)軟件研發(fā)工作。