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