王磊
(棗莊學(xué)院 計算機(jī)科學(xué)系,山東 棗莊,277160)
隨著軟件系統(tǒng)的日趨復(fù)雜以及回歸測試等重復(fù)性測試在整個軟件生命周期中所占的重要地位,我們必須使用自動化測試技術(shù)來提高我們的測試效率。自動化測試技術(shù)能幫助軟件開發(fā)人員和測試人員在更短時間內(nèi)開發(fā)出更高質(zhì)量的產(chǎn)品,通過代替頻繁重復(fù)的手工測試從而節(jié)省了大量的時間和開支。
但是利用捕捉/回放測試工具本身無法提供高效的測試。捕捉產(chǎn)生的腳本對于應(yīng)用的變化過于敏感,以至于測試人員要不停地修改測試腳本。這樣的測試腳本不是我們想要的。我們需要的是一個易于維護(hù)的,可以應(yīng)用于各種不同應(yīng)用的測試模型。
使用傳統(tǒng)自動化測試方式對測試對象各規(guī)則要點進(jìn)行測試的一般流程如圖1所示,具體如下:首先等待測試對象構(gòu)建生成;得到測試對象后,判斷對象該規(guī)則要點的測試是否需要新的測試數(shù)據(jù),例如測試對象“證件號碼”的測試規(guī)則要點為:必須是數(shù)字、長度為4個字符。判斷結(jié)果有兩種情況:(1)如果測試需要新的測試數(shù)據(jù),原來錄制的測試腳本將不能繼續(xù)使用,必須錄制新的腳本以適應(yīng)當(dāng)前測試數(shù)據(jù)的改動,之后再回放測試腳本以驗證測試對象該規(guī)則要點;(2)如果測試不需要新的測試數(shù)據(jù),則直接回放原測試腳本驗證對象規(guī)則。測試對象該規(guī)則要點驗證完畢后,繼續(xù)進(jìn)行下一規(guī)則要點的驗證,直至測試對象各規(guī)則要點驗證完畢。
可見,按照傳統(tǒng)方式進(jìn)行測試具有:比較容易使用,測試人員不需要額外的編程經(jīng)驗;用例生產(chǎn)簡單,需要設(shè)計的工作很少;直觀的一步一步執(zhí)行方式等優(yōu)點。
圖1 傳統(tǒng)測試流程
但是,這種簡單的錄制、回放過程在實際應(yīng)用中存在很多問題,最常見的一個問題是測試腳本難以重用,當(dāng)對程序界面進(jìn)行錄制時,自動化功能測試工具記錄程序執(zhí)行的全部過程,測試邏輯、測試對象、執(zhí)行動作和測試數(shù)據(jù)包含在一個腳本中,一旦測試的執(zhí)行順序或測試對象有任何變動,都可能造成測試用例被破壞,需要手工修改已錄制好的相應(yīng)測試腳本,或者重新進(jìn)行一次錄制。尤其對于測試對象中需要多條驗證的測試規(guī)則,它的改動會引起大量測試工作的返工,所有相關(guān)腳本都會受到影響,造成測試腳本的日常維護(hù)工作量急劇加大,維護(hù)這樣的腳本是十分困難的。
如何解決傳統(tǒng)測試過程中遇到的這些問題呢?只有修改測試腳本的結(jié)構(gòu),才能從根本上解決這個問題:
可以在被測程序和生成的測試腳本之間增加一個模型層,它可以將界面上的所有元素映射成對應(yīng)的邏輯對象,測試針對這些邏輯對象進(jìn)行,界面元素的改變只會影響映射表,而不會影響測試。
把測試執(zhí)行的動作和測試具體實現(xiàn)細(xì)節(jié)分離開來,用關(guān)鍵字描述測試執(zhí)行動作,只說明該步測試執(zhí)行什么動作而不管測試工具具體怎樣執(zhí)行。這樣做是因為測試的實現(xiàn)細(xì)節(jié)通常和特定的測試執(zhí)行工具有著密切的聯(lián)系,比如QTP和RTF。這種分離使得關(guān)鍵字對于實現(xiàn)細(xì)節(jié)不敏感,有利于測試在不同工具間的移植。
最后,可以把測試執(zhí)行過程中所需的測試數(shù)據(jù)從腳本中提取出來,在運行時由測試控制模塊從數(shù)據(jù)庫中讀取預(yù)先定制好的數(shù)據(jù),這樣測試腳本和測試數(shù)據(jù)可以獨立維護(hù)。
采用上述關(guān)鍵字驅(qū)動自動化測試的思想,使執(zhí)行動作、測試對象和測試數(shù)據(jù)相互獨立,最大程度的減少相互之間的影響,徹底解決了使用GUI自動化測試工具產(chǎn)生的問題。
該測試框架從邏輯上自底向上分為4層,如圖2所示,分別是:由測試對象和識別腳本構(gòu)成的模型層,由標(biāo)簽庫和測試數(shù)據(jù)庫構(gòu)成的數(shù)據(jù)層,由控制文件構(gòu)成的控制層以及由用例描述原語(ASL)構(gòu)成的應(yīng)用層。本文以自動化測試工具QTP為例,搭建具體的測試框架。
圖2 軟件自動化測試框架
框架最底部的模型層由測試工具識別的GUI控件對象以及對象的識別腳本構(gòu)成,模型層負(fù)責(zé)將GUI控件對象和識別腳本分別組織并以友好的方式提供給數(shù)據(jù)層的標(biāo)簽庫模塊使用。
(1) 對象識別腳本
在使用QTP錄制時,QTP自動記錄GUI對象并生成測試腳本。該測試腳本包含了對GUI對象的識別、執(zhí)行動作和測試數(shù)據(jù),使得測試腳本難以重用和維護(hù)。本文在測試框架模型層中只保留對GUI對象的識別腳本,而把測試數(shù)據(jù)放到數(shù)據(jù)層、執(zhí)行動作放到控制層管理,從而實現(xiàn)了相互之間的分離。
(2) GUI控件對象
在測試框架模型層中,通過對界面元素的分析(UI分析)并和QTP對象識別機(jī)制相映射來組織GUI控件對象。UI分析是從被測系統(tǒng)界面入手,記錄頁面層次并把該頁面中的GUI對象以要素的形式記錄到數(shù)據(jù)庫中,如圖3所示,以達(dá)到結(jié)構(gòu)化、層次化管理對象的目的。
圖3 GUI控件對象映射
數(shù)據(jù)層由標(biāo)簽庫和測試數(shù)據(jù)庫構(gòu)成,標(biāo)簽庫保存要素名和識別腳本的映射關(guān)系,測試數(shù)據(jù)庫保存具體的測試數(shù)據(jù)。
(1) 標(biāo)簽庫
標(biāo)簽庫是針對某一個應(yīng)用建立的,它可以通過學(xué)習(xí)而擴(kuò)展,其中包含了圖形用戶界面交互的完整細(xì)節(jié),包括GUI界面和對象。本文通過打標(biāo)的方式來對具體交互細(xì)節(jié)進(jìn)行封裝:首先利用QTP錄制待測系統(tǒng)的執(zhí)行過程,獲取各測試對象的腳本;然后對錄制腳本進(jìn)行打標(biāo),實現(xiàn)要素名和測試對象的對應(yīng);最后對打標(biāo)后的腳本進(jìn)行分解并提取識別腳本和標(biāo)簽,生成標(biāo)簽庫。例如表1中測試腳本中的“開戶.客戶姓名”即為識別腳本Browser("系統(tǒng)-框架頁面").Page("系統(tǒng)-框架面).Frame("Frame").WebEdit("textfield422")的標(biāo)簽。
表1 腳本標(biāo)記實例
通過對QTP腳本的分析,腳本可以分解為下述范式,生成標(biāo)簽庫程序按照相應(yīng)范式對其分解、保存。
●browser.form.object.event value
該范式為B/S結(jié)構(gòu),其中browser指瀏覽器定位(URL),form指B/S結(jié)構(gòu)中的頁(page),object指用戶界面的對象,event指用戶操作事件,value指數(shù)據(jù)輸入值。表2為B/S結(jié)構(gòu)范式時的實例。
表2 B/S結(jié)構(gòu)范式實例
●form.object.event value
當(dāng)browser為空時,該范式退化C/S結(jié)構(gòu),其中form指C/S結(jié)構(gòu)中的窗口表單(form),object指界面的對象,event指用戶操作事件,value指數(shù)據(jù)輸入值。表3為C/S結(jié)構(gòu)范式時的實例。
表3 C/S結(jié)構(gòu)范式實例
●object.event value
當(dāng)form取特殊值時,該范式退化為字符仿真終端。在該范式中,關(guān)鍵字對應(yīng)于event,輸入?yún)?shù)對應(yīng)于value。
本文設(shè)計的標(biāo)簽庫以標(biāo)準(zhǔn)XML的形式存儲,將要素名與QTP識別的圖形界面和對象進(jìn)行映射,以供ASL腳本解析時使用。標(biāo)簽庫利用XML元素層次關(guān)系的表達(dá),清楚定義了業(yè)務(wù)要素所屬的場景。一個業(yè)務(wù)系統(tǒng)生成一個標(biāo)簽庫,不同系統(tǒng)的標(biāo)簽庫不能混用。標(biāo)簽庫實例如表4所示。
表4 標(biāo)簽庫實例
(2) 測試數(shù)據(jù)庫
測試數(shù)據(jù)庫提供具體的測試數(shù)據(jù),其中測試數(shù)據(jù)與UI分析得到的測試對象相對應(yīng),每個測試對象根據(jù)系統(tǒng)需要,有不同的業(yè)務(wù)規(guī)則,如果業(yè)務(wù)規(guī)則比較復(fù)雜,則把業(yè)務(wù)規(guī)則分解成最小化的規(guī)則,也即測試點。針對每一個測試點,測試人員至少要準(zhǔn)備2條測試數(shù)據(jù),分別為正例和反例。正例是指符合該測試點測試數(shù)據(jù);反例是指不符合該測試點的測試數(shù)據(jù)。執(zhí)行測試時必須保證正例能通過而反例不能通過,否則就說明該處存在BUG,測試數(shù)據(jù)庫實例如圖4所示。
控制層為自動化測試框架提供了一個控制入口,測試工程師利用控制層實現(xiàn)具體的測試意圖:測試工程師可以對測試的執(zhí)行順序根據(jù)需要進(jìn)行調(diào)整,使得測試不必按錄制順序回放;可以通過關(guān)鍵字設(shè)置GUI對象的執(zhí)行動作,實現(xiàn)各種操作;可以通過要素名匹配測試數(shù)據(jù)??刂莆募鐖D5所示。
圖4 測試數(shù)據(jù)庫實例
其中“說明”部分為生成測試報告做準(zhǔn)備,“開始”部分設(shè)置具體測試邏輯;本例中“key”為動作關(guān)鍵字,框架識別該關(guān)鍵字并生成具體測試工具的腳本實現(xiàn)UI對象的輸入,還可以設(shè)置其他關(guān)鍵字,比如“click”為單擊,“select”為選擇下拉框,“mywait”為等待一段時間等;<MZ671_2.賬號輸入>為“MZ671_2”頁面下的“賬號輸入”對象,程序通過標(biāo)簽庫調(diào)用識別腳本和對象進(jìn)行匹配,確定特定測試對象;“$賬號$”為測試數(shù)據(jù)標(biāo)志,通過測試數(shù)據(jù)庫的匹配找到確定的測試數(shù)據(jù)。
圖5 控制文件實例
應(yīng)用層通過用例描述原語(ASL)具體實現(xiàn)測試的執(zhí)行:ASL首先獲取測試案例的某一控制文件,得到該測試邏輯并解析出測試數(shù)據(jù)標(biāo)志和標(biāo)簽;然后通過要素標(biāo)簽在標(biāo)簽庫中查找相應(yīng)腳本,匹配測試數(shù)據(jù)庫中測試數(shù)據(jù),組合生成測試工具QTP可以執(zhí)行的腳本;最后調(diào)用測試工具QTP實施自動化測試。
本文以1個應(yīng)用來分析下如何在實際中實施關(guān)鍵字驅(qū)動的自動化測試。在某銀行開戶流程的測試中,要求對所有對象進(jìn)行驗證,以保證軟件質(zhì)量。假設(shè)每個測試對象僅需要測試1個正例和1個反例,n個對象的測試組合就是2n次,利用本測試框架,只在測試開始時建立框架體系,對控件對象識別、打標(biāo)并生成標(biāo)簽庫,對測試規(guī)則分析設(shè)計出測試用例。通過這種方式使測試邏輯、測試腳本和測試數(shù)據(jù)相互脫離,在回歸測試中僅通過對控制文件的修改就可以對相同功能、不同數(shù)據(jù)的用例進(jìn)行測試,同時,測試腳本不關(guān)心測試用例,測試的數(shù)據(jù)和業(yè)務(wù)邏輯都集成在測試數(shù)據(jù)表格之中,測試的設(shè)計就簡化為測試數(shù)據(jù)表格的設(shè)計,程序運行實例如圖6所示。
圖6 測試框架工具運行實例
由上述測試實例可以看出,應(yīng)用關(guān)鍵字驅(qū)動技術(shù)進(jìn)行自動化測試,可以把測試工程師從繁瑣的重復(fù)性勞動中解放出來,也為軟件產(chǎn)品提供更為高效的、更為精準(zhǔn)的測試,提高產(chǎn)品的競爭力。
[1]王磊,羅省賢.業(yè)務(wù)流程路徑覆蓋方法的研究與實現(xiàn) [J].電子測試 ,2009(01):15-19, 52.
[2]陳越,劉強(qiáng),陳玉健.基于GUI的面向?qū)ο筌浖貧w測試技術(shù)研究[J].計算機(jī)應(yīng)用研究, 2006, 23(5): 49-51.
[3]蔡維德,白曉穎,陳以農(nóng).淺談深析面向服務(wù)的軟件工程[M].北京:清華大學(xué)出版社, 2008: 3-11.
[4]Chen Y N, Tsai W T. Distributed Service-Oriented SoftwareDevelopment [M]. Dubuque: Kendall/Hunt Publishing,2008: 11 - 30, 271- 274.
[5]MENDEL JM, ROBERT I J, LIU Feilong. Interval type-2fuzzy logic systemsmade simple[J]. IEEE Transactions on Fuzzy Systems, 2006, 14(6): 808-821.
[6]陳薇,孫增圻.二型模糊系統(tǒng)研究與應(yīng)用[J].模糊系統(tǒng)與數(shù)學(xué), 2005, 19(1): 126-135.
[7]姚實穎,肖沙里.軟件測試自動化建立可維護(hù)腳本[J].計算機(jī)工程, 2003 ,7 (11).
[8]黃隴,于洪敏.基于UML的軟件測試自動化研究[J].計算機(jī)應(yīng)用, 2004, 7 (7 ).
[9]黃茂生.三層腳本的自動化測試實現(xiàn)[J].軟件可靠性與測評, 2005,12 (12).
[10]姚實穎,肖沙里,譚霞,唐躍林. 軟件測試自動化中建立可維護(hù)腳本的技術(shù)[J].計算機(jī)工程, 2003,(11).