杜巍
摘要:基于軟件自動(dòng)化測試框架的思想以及軟件測試項(xiàng)目的實(shí)際需求,為提高Android移動(dòng)應(yīng)用軟件自動(dòng)化測試的高效性及靈活性,提出了一種高可復(fù)用的自動(dòng)化混合測試框架。該框架利用uiautomator工具,基于Java反射機(jī)制,結(jié)合模塊化思想和測試庫思想,以數(shù)據(jù)驅(qū)動(dòng)和關(guān)鍵字驅(qū)動(dòng)為核心,使測試用例與測試代碼相關(guān)聯(lián),并將業(yè)務(wù)邏輯、測試數(shù)據(jù)與測試代碼相隔離。該框架可做到測試執(zhí)行與開發(fā)松耦合、自動(dòng)化程度高,便于快速有效地開展Android移動(dòng)應(yīng)用軟件的測試。
關(guān)鍵詞:Android應(yīng)用軟件 自動(dòng)化測試 混合測試框架 Java反射機(jī)制
1 引言
伴隨著移動(dòng)互聯(lián)網(wǎng)的飛速發(fā)展以及智能手機(jī)的普及應(yīng)用,移動(dòng)應(yīng)用程序(APP)層出不窮。移動(dòng)APP具有種類多、更新快、升級(jí)頻繁、應(yīng)用環(huán)境多樣化、穩(wěn)定性要求高及并發(fā)量大等特點(diǎn),如何開展高質(zhì)量的測試來保證移動(dòng)APP的質(zhì)量從而提升用戶體驗(yàn)越來越受到業(yè)界的關(guān)注。
傳統(tǒng)的手工移動(dòng)APP測試工作量大、重復(fù)性工作多,將耗費(fèi)大量人力和時(shí)間,效率低下且純手工測試無法完成高精度的壓力測試、并發(fā)測試、負(fù)載測試及穩(wěn)定性測試等。自動(dòng)化測試可以有效地提高測試執(zhí)行效率并控制測試成本開銷,但一個(gè)設(shè)計(jì)不夠科學(xué)合理的自動(dòng)化測試框架,不僅不能提高效率,反而會(huì)增加構(gòu)建成本,同時(shí)帶來無休止的維護(hù)工作。為了提升測試執(zhí)行的有效性同時(shí)避免測試項(xiàng)目中編寫大量的重復(fù)代碼,如何構(gòu)建一個(gè)強(qiáng)魯棒性、便于維護(hù)、高度可擴(kuò)展的移動(dòng)APP自動(dòng)化測試框架是本文主要研究的內(nèi)容。
2 自動(dòng)化測試框架的思想研究
自動(dòng)化測試框架指測試對(duì)象的識(shí)別方法,基本界面元素的封裝,測試環(huán)境的初始化及清理,錯(cuò)誤的捕獲和處理恢復(fù),還包含測試腳本的組織和管理[1]。為解決一般自動(dòng)化測試過程中遇到的模塊耦合度高、可復(fù)用性差、可配置化低等問題,本文結(jié)合以下幾種自動(dòng)化測試框架的思想,設(shè)計(jì)出一套混合模型的自動(dòng)化測試框架。
本文涉及到的自動(dòng)化測試框架思想主要有以下內(nèi)容:
(1)模塊化思想
模塊化思想利用抽象和封裝將測試代碼的操作隱藏,只對(duì)外提供一個(gè)接口用來執(zhí)行測試,從而框架的設(shè)計(jì)不必關(guān)注具體的應(yīng)用和相關(guān)細(xì)節(jié),同時(shí)可避免其他模塊代碼的變更對(duì)測試項(xiàng)目的執(zhí)行產(chǎn)生不利干擾[3]。本文運(yùn)用模塊化思想將測試功能點(diǎn)中不同測試點(diǎn)加以拆分,并將拆分后的測試點(diǎn)的測試步驟進(jìn)行封裝,形成測試模塊[2]。
(2)測試庫思想
本文利用測試庫思想為應(yīng)用程序的測試創(chuàng)建了包含一系列函數(shù)集合的庫文件[11]。將APP測試常用操作以組件的形式進(jìn)行封裝,結(jié)合模塊化思想,可通過接口去傳遞參數(shù),實(shí)現(xiàn)模塊之間的交互。
(3)數(shù)據(jù)驅(qū)動(dòng)思想
數(shù)據(jù)驅(qū)動(dòng)思想體系如圖1所示,其核心就是把執(zhí)行測試所需的數(shù)據(jù)從測試腳本中抽象出來,存儲(chǔ)在外部數(shù)據(jù)文件中,例如XML文件、數(shù)據(jù)庫、文本文檔、Excel表格等[5]。這種思想規(guī)避了腳本代碼和數(shù)據(jù)的高耦合性,大大提高了測試腳本的可復(fù)用性。
本文利用數(shù)據(jù)庫驅(qū)動(dòng)思想,通過不同的數(shù)據(jù)驅(qū)動(dòng)結(jié)果,用同一個(gè)測試過程對(duì)不同的輸入和輸出組合進(jìn)行測試。測試輸入數(shù)據(jù)和預(yù)期輸出結(jié)果構(gòu)成一張表,表中的每一行代表著每一個(gè)測試步驟,進(jìn)而構(gòu)建一個(gè)自動(dòng)化測試過程。
(4)關(guān)鍵字驅(qū)動(dòng)思想
關(guān)鍵字驅(qū)動(dòng)將實(shí)際的測試用例與程序編碼分離,在對(duì)測試用例進(jìn)行修改時(shí),無需進(jìn)行代碼維護(hù),該思想不僅把測試數(shù)據(jù)從軟件測試腳本代碼中抽離出來,也可分離測試邏輯和測試腳本代碼,使測試設(shè)計(jì)和策略體現(xiàn)在測試數(shù)據(jù)中,而非腳本代碼中。利用本文設(shè)計(jì)的自動(dòng)化測試框架,測試人員通過使用關(guān)鍵字就可以構(gòu)建測試用例,提高了自動(dòng)化測試的可復(fù)用性和靈活性,不同的關(guān)鍵字指令可以驅(qū)動(dòng)不同的測試流向與測試結(jié)果[6]。
綜上所述,為達(dá)到理想的自動(dòng)化測試要求,本文設(shè)計(jì)的自動(dòng)化混合測試框架既包含了腳本模塊化和測試庫思想的設(shè)計(jì),又有數(shù)據(jù)驅(qū)動(dòng)和關(guān)鍵字驅(qū)動(dòng)的能力,發(fā)揮各種思想的優(yōu)勢,使得測試框架可達(dá)到高可用性、高復(fù)用性和靈活性。
3 基于Java反射的混合測試框架的設(shè)計(jì)
與實(shí)現(xiàn)
本文提出的混合測試框架采用uiautomator工具,基于Java反射機(jī)制,以模塊化思想和測試庫思想封裝高可復(fù)用的對(duì)象和操作,以數(shù)據(jù)驅(qū)動(dòng)思想作為測試代碼的輸入,用關(guān)鍵字驅(qū)動(dòng)思想來處理測試邏輯流程。本章節(jié)將以Android系統(tǒng)的“移動(dòng)營業(yè)廳”APP軟件測試為例,詳細(xì)闡述測試框架的設(shè)計(jì)與實(shí)現(xiàn)。
如圖2所示,該測試框架采用分層原則,分為數(shù)據(jù)與關(guān)鍵字層、執(zhí)行接入層、基礎(chǔ)組件層三個(gè)層次。
基礎(chǔ)組件層利用模塊化思想對(duì)測試基礎(chǔ)組件進(jìn)行高度抽象,采用測試庫思想對(duì)基礎(chǔ)組件進(jìn)行封裝,如APP中的控件類(如按鈕、輸入框等)通過uiautomator獲取,同時(shí)通過訪問uiautomator的API庫,實(shí)現(xiàn)對(duì)各個(gè)控件的操作,如單擊、輸入文本、滾動(dòng)等,最后將這些操作及操作的組合封裝成一個(gè)基礎(chǔ)組件。利用uiautomator封裝基礎(chǔ)組件,可降低編寫代碼成本、代碼復(fù)用率高、提高測試準(zhǔn)確率。
執(zhí)行接入層主要采用Java反射技術(shù),該層是數(shù)據(jù)與關(guān)鍵字層和基礎(chǔ)組件層的中介,主要是通過XML解析器讀入配置數(shù)據(jù),如關(guān)鍵字、執(zhí)行參數(shù)和執(zhí)行步驟等,利用Java反射機(jī)制動(dòng)態(tài)調(diào)用基礎(chǔ)組件層的組件執(zhí)行測試。Java反射機(jī)制能在程序運(yùn)行時(shí)通過配置文件(如XML文件)動(dòng)態(tài)地加載類并調(diào)用類方法以及使用類成員變量。將該機(jī)制運(yùn)用到框架中,可增加程序靈活性,避免代碼寫死在程序中,使該框架可以靈活地運(yùn)用在多種APP的測試中。
在數(shù)據(jù)與關(guān)鍵字層中,數(shù)據(jù)表與關(guān)鍵字以XML的方式配置,該層以數(shù)據(jù)驅(qū)動(dòng)為核心,為自動(dòng)化測試代碼提供參數(shù)化的測試數(shù)據(jù)輸入,實(shí)現(xiàn)測試代碼與數(shù)據(jù)的分離。以關(guān)鍵字驅(qū)動(dòng)為核心,實(shí)現(xiàn)測試代碼與用例的關(guān)聯(lián),關(guān)鍵字層次結(jié)構(gòu)如圖3所示。
關(guān)鍵字層次結(jié)構(gòu)分為測試步驟層、測試用例層和測試用例集層。關(guān)鍵字的定義與測試用例集的結(jié)構(gòu)密不可分,一套測試用例集包含了一系列測試用例,測試用例是由各個(gè)測試步驟組合構(gòu)成的。各層次結(jié)構(gòu)具體說明如下:
(1)測試用例集層:一套測試用例集代表一個(gè)被測業(yè)務(wù)的所有功能點(diǎn),可以包含多個(gè)獨(dú)立的功能點(diǎn)的測試。測試項(xiàng)目記作集合B,測試用例集記作集合R,則:
(1)
以“移動(dòng)營業(yè)廳”測試項(xiàng)目為例,對(duì)該測試項(xiàng)目劃分為多個(gè)用例集,如“首頁”、“商城”、“服務(wù)”、“積分”等測試用例集。各用例集包含該功能點(diǎn)下的所有用例的集合,由一系列XML文件組成。
(2)測試用例層:為實(shí)現(xiàn)特定測試功能點(diǎn)的獨(dú)立測試用例,在用例中包括測試輸入所需的數(shù)據(jù)、執(zhí)行邏輯、預(yù)期輸出的處理等。用T來代表測試用例集合,則:
(2)
在示例測試項(xiàng)目中,將獨(dú)立的測試用例編寫成XML文件,保存在相應(yīng)的用例集中。以“首頁”測試用例集為例,該用例集中包含我的賬單、套餐余量、已訂業(yè)務(wù)等測試用例。
(3)測試步驟層:將測試用例拆分成一系列操作步驟,編寫測試用例就是將測試步驟按執(zhí)行順序進(jìn)行邏輯上的連接。用S代表測試步驟集合,則:
Ti=(s1, s2, …, sn), si∈P (3)
以“登錄”測試為例,測試步驟包括輸入手機(jī)號(hào)、輸入密碼、確認(rèn)登錄等。每個(gè)操作步驟中均由步驟ID、測試組件單元、參數(shù)、下一步操作ID以及拋錯(cuò)處理等組成。
測試組件單元即關(guān)鍵字操作指令,是基礎(chǔ)組件層可復(fù)用的代碼組件與具體的業(yè)務(wù)沒有關(guān)系,可被任何測試步驟使用。用u代表組件單元,用U代表組件單元集合,則:
(4)
下面舉例說明移動(dòng)營業(yè)廳測試項(xiàng)目的測試組件單元,具體如表1所示:
表1中,testInputTextByResourceId為通過文本框的ResourceId在文本框中輸入文本的組件;testFlingVerticalByResourceId為通過ResourceId來實(shí)現(xiàn)橫向快速滑動(dòng)的組件,通過參數(shù)method選擇向前還是向后滾動(dòng),通過times指定滾動(dòng)次數(shù)。
根據(jù)測試用例集、測試用例,測試步驟進(jìn)行層次的劃分,可提高自動(dòng)化測試代碼的可復(fù)用性。整個(gè)框架基于以上思想和設(shè)計(jì)將測試數(shù)據(jù)與測試代碼進(jìn)行了封裝。采用uiautomator工具,對(duì)基礎(chǔ)控件進(jìn)一步封裝、驗(yàn)證,通過Java反射機(jī)制實(shí)現(xiàn)測試數(shù)據(jù)與測試代碼之間的隔離。
4 APP自動(dòng)化混合測試框架的實(shí)際應(yīng)用
本章將闡述該APP自動(dòng)化混合測試框架在“移動(dòng)營業(yè)廳”實(shí)際項(xiàng)目中的應(yīng)用,通過比較測試過程及結(jié)果輸出分析該框架在測試效率、質(zhì)量及代碼開發(fā)等方面的優(yōu)勢。
4.1 測試組件庫開發(fā)
根據(jù)測試動(dòng)作與控件屬性信息相結(jié)合的特點(diǎn),對(duì)uiautomator的方法進(jìn)行進(jìn)一步封裝,提煉出一套通用測試組件,如圖4所示。
每類測試動(dòng)作根據(jù)不同屬性可定義一個(gè)或多個(gè)組件,每個(gè)組件對(duì)應(yīng)一個(gè)關(guān)鍵字,如根據(jù)Text屬性的點(diǎn)擊事件的關(guān)鍵字為testClickByText,測試人員使用該關(guān)鍵字即可調(diào)用該組件執(zhí)行相應(yīng)的測試動(dòng)作。
將上述組件庫打包為testApp.jar,為測試人員執(zhí)行測試用例使用。后續(xù)測試人員只需編寫XML測試用例調(diào)用組件庫完成測試執(zhí)行即可。如圖5所示,本文提出的方式在組件庫豐富之后不會(huì)因?yàn)闇y試用例的增加而增加代碼,而采用傳統(tǒng)的編寫自動(dòng)化測試腳本的方式代碼量會(huì)隨著用例數(shù)量的增加而不斷增加,導(dǎo)致測試代碼難以維護(hù)并增加調(diào)試的成本,會(huì)大大降低自動(dòng)化測試的效率和質(zhì)量。
4.2 自動(dòng)化測試用例編寫
測試人員通過編寫XML文檔來完成用例的編寫,一個(gè)XML文檔為一個(gè)用例,每個(gè)用例下包含若干步驟。其內(nèi)容格式為兩級(jí)結(jié)構(gòu),其中父節(jié)點(diǎn)用于定義當(dāng)前用例的相關(guān)信息,如下所示:
其中,startid表示當(dāng)前用例開始執(zhí)行步驟的id編號(hào),nextDoc表示當(dāng)前用例執(zhí)行通過時(shí)下一個(gè)用例的文檔名,errNextDoc表示當(dāng)前用例不通過時(shí)下一個(gè)用例的文檔名(-1表示中斷執(zhí)行),className表示引用的組件庫名稱。
子節(jié)點(diǎn)表示用例中的各操作步驟,其格式定義如下:
其中,id表示當(dāng)前步驟的編號(hào),type表示引用組件的關(guān)鍵字,typeValue為傳遞的數(shù)據(jù)參數(shù),next用于連接當(dāng)前步驟執(zhí)行通過時(shí)要執(zhí)行的下一步驟,errnext用于連接當(dāng)前步驟執(zhí)行不通過時(shí)要執(zhí)行的下一步驟(-1表示中斷當(dāng)前用例的執(zhí)行),errlog用于控制日志輸出。
以上編寫測試用例的方法易于上手,降低了對(duì)測試人員編碼能力的要求,且測試步驟清晰明了,易于測試過程的調(diào)試,方便用例的定位和維護(hù)。
4.3 自動(dòng)化測試用例執(zhí)行
測試用例自動(dòng)化執(zhí)行的流程如圖6所示,將寫好的測試用例和測試組件庫上傳到手機(jī),下發(fā)任務(wù)執(zhí)行測試用例,輸出日志及報(bào)錯(cuò)截圖,測試人員可通過查看日志及截圖定位分析問題。
對(duì)比實(shí)際手工執(zhí)行“移動(dòng)營業(yè)廳”的168個(gè)功能測試用例,從表2中可以看出,采用本文提出的自動(dòng)化測試框架進(jìn)行測試可在很大程度上節(jié)約資源,提高效率,特別是在多部手機(jī)并發(fā)測試的情況下優(yōu)勢更為明顯。
5 結(jié)束語
本文提出了一個(gè)健壯的、易維護(hù)的、易擴(kuò)展的自動(dòng)化混合測試框架,運(yùn)用該框架降低了測試執(zhí)行與開發(fā)的耦合度,將業(yè)務(wù)邏輯、測試數(shù)據(jù)與測試代碼分離,能有效降低移動(dòng)APP自動(dòng)化測試成本,提高測試執(zhí)行的有效性。本文闡述了該自動(dòng)化測試框架在實(shí)際測試項(xiàng)目中的應(yīng)用,并驗(yàn)證了其在效率、質(zhì)量、操作及擴(kuò)展維護(hù)等方面的優(yōu)勢,可為APP自動(dòng)化測試項(xiàng)目提供有力支撐。
參考文獻(xiàn):
[1] 常征. 功能測試中自動(dòng)化測試框架的分析與應(yīng)用[D]. 北京: 北京林業(yè)大學(xué), 2007.
[2] 徐騁. Android應(yīng)用軟件自動(dòng)化測試框架的研究[D]. 大連: 大連海事大學(xué), 2015.
[3] 路靜,王琪. 一種基于功能測試的自動(dòng)化測試框架[J]. 內(nèi)蒙古科技與經(jīng)濟(jì), 2005(23): 25-26.
[4] 曾北溟. 自動(dòng)化測試框架的研究與實(shí)現(xiàn)[D]. 武漢: 武漢大學(xué), 2004.
[5] 步倩倩. 面向GUI軟件的自動(dòng)化測試框架的研究與應(yīng)用[D]. 成都: 電子科技大學(xué), 2010.
[6] 郝義鵬. 基于關(guān)鍵字驅(qū)動(dòng)自動(dòng)化測試平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 哈爾濱: 哈爾濱工業(yè)大學(xué), 2007.
[7] 侯菊敏. 基于Android的關(guān)鍵字驅(qū)動(dòng)自動(dòng)化測試框架研究[D]. 廣州: 中山大學(xué), 2012.
[8] 區(qū)立斌. 基于層次關(guān)鍵字驅(qū)動(dòng)的自動(dòng)化測試框架設(shè)計(jì)與應(yīng)用[D]. 廣州: 中山大學(xué), 2012.
[9] 郝曉曉,張衛(wèi)豐. 基于XML的SDK自動(dòng)化測試框架的設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(jī)技術(shù)與發(fā)展, 2010(4): 101-104.
[10] 謝文哲. 基于模塊化測試框架的單元自動(dòng)化測試框架的設(shè)計(jì)與實(shí)現(xiàn)[D]. 武漢: 華中科技大學(xué), 2007.
[11] 陳健. 基于模型的數(shù)據(jù)處理系統(tǒng)的自動(dòng)化測試框架[D]. 北京: 中國科學(xué)院大學(xué)(工程管理與信息技術(shù)學(xué)院), 2013.★