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