基于事件處理器的Android自動(dòng)化測(cè)試工具及測(cè)試方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及軟件測(cè)試領(lǐng)域,特別是一種基于事件處理器的Android自動(dòng)化測(cè)試工具及測(cè)試方法。
【背景技術(shù)】
[0002]目前國(guó)內(nèi)外對(duì)AndroidApp測(cè)試的研究主要集中在事件輸入的生成。根據(jù)研究探索方式的不同,現(xiàn)有工作主要分為兩類(lèi):模糊測(cè)試(fuzzing testing)和基于⑶I模型測(cè)試。模糊測(cè)試又稱(chēng)為隨機(jī)測(cè)試,其核心思想是自動(dòng)或半自動(dòng)地生成隨機(jī)數(shù)據(jù)輸入到程序中,監(jiān)視程序的異常情況,如崩潰,斷言失敗等,以發(fā)現(xiàn)程序中可能的錯(cuò)誤?;贕UI模型的測(cè)試是指基于App的GUI模型,測(cè)試工具去系統(tǒng)地探索App,觸發(fā)App中的事件;這類(lèi)測(cè)試方法首先生成App的⑶I模型,GUI模型反映了App中狀態(tài)之間的聯(lián)系,直觀地表達(dá)狀態(tài)的傳遞關(guān)系;基于App的GUI模型,測(cè)試工具使用狀態(tài)覆蓋作為測(cè)試準(zhǔn)則,探索GUI模型中的所有狀態(tài)。
[0003]上述兩類(lèi)測(cè)試方法各有其優(yōu)點(diǎn),如模糊測(cè)試適合壓力測(cè)試,基于GUI模擬的測(cè)試能夠系統(tǒng)地探索App,達(dá)到較高的覆蓋率。然而這兩類(lèi)測(cè)試方法也都存在各自的不足:模糊測(cè)試無(wú)法生成特殊的測(cè)試輸入,并且無(wú)法保證測(cè)試的完整性;基于GUI模型的測(cè)試依賴(lài)完整的GUI模型,現(xiàn)有的GUI模型獲取方式,無(wú)論是靜態(tài)分析獲取還是動(dòng)態(tài)執(zhí)行獲取都無(wú)法保證模型的完整性。
[0004]另外,上述工具都是基于UI測(cè)試的工具,都沒(méi)有考慮系統(tǒng)事件和Inter-App事件。因此,Android測(cè)試的難點(diǎn)總結(jié)為以下兩點(diǎn):一是包含豐富的事件輸入,如UI事件、系統(tǒng)事件和Inter-App事件,部分事件難以模擬;二是缺少系統(tǒng)的探索方法。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于提供一種基于事件處理器的Android自動(dòng)化測(cè)試工具及測(cè)試方法。
[0006]實(shí)現(xiàn)本發(fā)明目的的技術(shù)方案為:一種基于事件處理器的Android自動(dòng)化測(cè)試工具,包括事件插粧模塊、代碼分析工具Soot和App探索模塊;
[0007]事件插粧模塊包括XML解析器、識(shí)別器、分發(fā)器、語(yǔ)句構(gòu)造器和語(yǔ)句管理器;
[0008]XML解析器用于收集在XML中定義的事件,解析器的輸入是Apk的XML文件,包括App的資源文件和AndroidManifest.xml,資源文件包含UI事件,AndroidManifest.xml包含系統(tǒng)事件和Inter-App事件;XML解析器的輸出是在資源文件和AndroidManif est.xml中定義的UI事件、系統(tǒng)事件和Inter-App事件;
[0009]識(shí)別器用于識(shí)別在代碼中定義的事件,識(shí)別器的輸入是Apk的Dex文件,Dex文件包含App所有的源代碼,識(shí)別器采用程序靜態(tài)分析方法,查找在代碼中定義的UI事件和系統(tǒng)事件;識(shí)別器的輸出是在代碼中定義的UI事件和系統(tǒng)事件;
[0010]分發(fā)器用于將XML解析器和識(shí)別器收集到的事件分發(fā)給事件所屬的活動(dòng);
[0011]語(yǔ)句構(gòu)造器用于構(gòu)造事件處理器的調(diào)用語(yǔ)句;語(yǔ)句構(gòu)造器的輸入是收集的事件,輸出是事件處理器調(diào)用語(yǔ)句,調(diào)用語(yǔ)句用于驗(yàn)證事件處理器的正確性;
[0012]語(yǔ)句管理器用于管理事件處理器調(diào)用語(yǔ)句,語(yǔ)句管理器的輸入是事件處理器調(diào)用語(yǔ)句,輸出是“Test”事件,“Test”事件的事件處理器封裝所有事件處理器的調(diào)用語(yǔ)句;
[0013]代碼分析工具Soot將插粧的調(diào)用語(yǔ)句、“Test”事件和Apk的原代碼重新打包成一個(gè)新的Apk文件;
[0014]App探索模塊對(duì)重新打包后的Apk文件進(jìn)行自動(dòng)化測(cè)試。
[0015]一種基于事件處理器的Android自動(dòng)化測(cè)試工具的測(cè)試方法,包括以下步驟:
[0016]步驟1、解壓縮Apk文件,獲得Apk中的XML文件和Dex文件;
[0017]步驟2、使用XML解析器解析XML文件,查找并獲取在XML中定義的UI事件、系統(tǒng)事件和 Inter-App 事件;
[0018]步驟3、使用識(shí)別器分析Dex文件,查找在代碼中定義的UI事件和系統(tǒng)事件;
[0019]步驟4、分發(fā)器對(duì)XML解析器和識(shí)別器收集到的事件統(tǒng)一處理,獲取事件的事件源和事件處理器,將事件信息分發(fā)給各自的活動(dòng);
[0020]步驟5、活動(dòng)獲得事件處理器后,語(yǔ)句構(gòu)造器構(gòu)造事件處理器的調(diào)用語(yǔ)句;
[0021]步驟6、語(yǔ)句管理器創(chuàng)建“Test”事件,將調(diào)用語(yǔ)句插粧在“Test”事件的事件處理器中;
[0022]步驟7、代碼分析工具Soot將插粧的調(diào)用語(yǔ)句、“Test”事件和Apk的原代碼重新打包成一個(gè)新的Apk文件;
[0023]步驟8、App探索模塊啟動(dòng)App,執(zhí)行自動(dòng)化測(cè)試;
[0024]步驟9、測(cè)試結(jié)束后,輸出測(cè)試結(jié)果,包括本次測(cè)試的耗時(shí)、代碼覆蓋率、發(fā)現(xiàn)的bug數(shù)目和bug類(lèi)型。
[0025]本發(fā)明與現(xiàn)有技術(shù)相比,其顯著優(yōu)點(diǎn)為:
[0026](I)高代碼覆蓋率:本發(fā)明能夠觸發(fā)的Android的UI事件、系統(tǒng)事件和Inter-App事件,比傳統(tǒng)的只能觸發(fā)UI事件的測(cè)試工具要更全面,代碼覆蓋率更高;
[0027](2)高效率:本發(fā)明直接調(diào)用事件處理器調(diào)用語(yǔ)句,比傳統(tǒng)的測(cè)試方法需要生成事件去驗(yàn)證事件處理器的正確性速度要快;
[0028](3)Bug發(fā)現(xiàn)能力:由于考慮更全面的事件輸入,本發(fā)明不僅可以發(fā)現(xiàn)UI中的Bug,還可以發(fā)現(xiàn)系統(tǒng)和Inter-App事件中Bug。
【附圖說(shuō)明】
[0029]圖1為本發(fā)明的基于事件處理器的Android自動(dòng)化測(cè)試工具總體架構(gòu)圖。
【具體實(shí)施方式】
[0030]結(jié)合圖1,本發(fā)明的一種基于事件處理器的Android自動(dòng)化測(cè)試工具,包括事件插粧模塊、代碼分析工具Soot和App探索模塊;
[0031]事件插粧模塊包括XML解析器、識(shí)別器、分發(fā)器、語(yǔ)句構(gòu)造器和語(yǔ)句管理器;
[0032]XML解析器用于收集在XML中定義的事件,解析器的輸入是Apk的XML文件,包括App的資源文件和AndroidManifest.xml,資源文件包含UI事件,AndroidManifest.xml包含系統(tǒng)事件和Inter-App事件;XML解析器的輸出是在資源文件和AndroidManif est.xml中定義的UI事件、系統(tǒng)事件和Inter-App事件;具體實(shí)現(xiàn)如下:
[0033](I)角軍析Androi dManifest.xml,獲取包含 Intent-Filter 的所有 Activity、Servi ce和 Receiver; Servi ce和 Receiver對(duì)應(yīng)系統(tǒng)事件,Activity對(duì)應(yīng)Inter-App 事件;輸出是二兀組〈source ,handler〉,source表不Activity、Service和Receiver ,handler表不Intent-Filter;
[0034](2)解析資源文件,獲取包含屬性“android: onClick=m”的所有UI事件;輸出是二元組〈source, cal lback〉,source表示UI事件的事件源,cal Iback表示事件處理器的回調(diào)函數(shù)。
[0035]識(shí)別器用于識(shí)別在代碼中定義的事件,識(shí)別器的輸入是Apk的Dex文件,Dex文件包含App所有的源代碼,識(shí)別器采用程序靜態(tài)分析方法,查找在代碼中定義的UI事件和系統(tǒng)事件;識(shí)別器的輸出是在代碼中定義的UI事件和系統(tǒng)事件;具體實(shí)現(xiàn)如下:
[0036](I)使用代碼分析工具Soot獲得Dex文件中源碼;
[0037](2)遍歷源碼中的所有類(lèi),遍歷每個(gè)類(lèi)中的所有方法;
[0038](3)如果方法的名字是onListItemClick() ,performClick(),onTouchevent(),perf ormLongCl i ck O,onKeyUp ()或onKeyDown (),獲取方法名;否則,遍歷該方法中的每條語(yǔ)句,判斷該語(yǔ)句是否是 s.setOnXXListener(l)、s.registerReceiver(l)或s.addXXLi stener (I)形式的注冊(cè)語(yǔ)句,若是則記錄source、注冊(cè)方法和handler,記為三元組〈S,rm,h>,s表示事件源,rm表示注冊(cè)方法,h表示事件處理器,否則跳轉(zhuǎn)到(2)。
[0039]分發(fā)器用于將XML解析器和識(shí)別器收集到的事件分發(fā)給事件所屬的活動(dòng);具體實(shí)現(xiàn)如下:
[0040]根據(jù)獲取事件的類(lèi)型,確定分發(fā)方式,如果事件類(lèi)型是UI事件,則調(diào)用android.view.View的方法getContent()獲取UI事件所在的活動(dòng);如果是系統(tǒng)事件或Inter-App事件,則將事件MainActivity作為系統(tǒng)事件或Inter-App事件所在的活動(dòng)。
[0041]語(yǔ)句構(gòu)造器用于構(gòu)造事件處理器的調(diào)用語(yǔ)句;語(yǔ)句構(gòu)造器的輸入是收集的事件,輸出是事件處理器調(diào)用語(yǔ)句,調(diào)用語(yǔ)句用于驗(yàn)證事件處理器的正確性;具體實(shí)現(xiàn)如下:
[0042](I)獲得XML解析器輸出二元組〈source ,handler〉和〈source , cal lback〉;對(duì)于〈source , handler〉,獲得handIer 的回調(diào)函數(shù)cal lback;對(duì)于〈source,cal lback〉,獲得cal lback 所在的handler,輸出三元組〈source ,handler,callback〉;
[0043](2)獲得識(shí)別器的輸出三元組<s,rm,h>,獲得rm方法對(duì)應(yīng)的cal lback,輸出三元組〈source, handler, callback);
[0044](3)獲得上