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