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