基于事件處理器的Android自動化測試工具及測試方法
【技術領域】
[0001]本發明涉及軟件測試領域,特別是一種基于事件處理器的Android自動化測試工具及測試方法。
【背景技術】
[0002]目前國內外對AndroidApp測試的研究主要集中在事件輸入的生成。根據研究探索方式的不同,現有工作主要分為兩類:模糊測試(fuzzing testing)和基于⑶I模型測試。模糊測試又稱為隨機測試,其核心思想是自動或半自動地生成隨機數據輸入到程序中,監視程序的異常情況,如崩潰,斷言失敗等,以發現程序中可能的錯誤。基于GUI模型的測試是指基于App的GUI模型,測試工具去系統地探索App,觸發App中的事件;這類測試方法首先生成App的⑶I模型,GUI模型反映了App中狀態之間的聯系,直觀地表達狀態的傳遞關系;基于App的GUI模型,測試工具使用狀態覆蓋作為測試準則,探索GUI模型中的所有狀態。
[0003]上述兩類測試方法各有其優點,如模糊測試適合壓力測試,基于GUI模擬的測試能夠系統地探索App,達到較高的覆蓋率。然而這兩類測試方法也都存在各自的不足:模糊測試無法生成特殊的測試輸入,并且無法保證測試的完整性;基于GUI模型的測試依賴完整的GUI模型,現有的GUI模型獲取方式,無論是靜態分析獲取還是動態執行獲取都無法保證模型的完整性。
[0004]另外,上述工具都是基于UI測試的工具,都沒有考慮系統事件和Inter-App事件。因此,Android測試的難點總結為以下兩點:一是包含豐富的事件輸入,如UI事件、系統事件和Inter-App事件,部分事件難以模擬;二是缺少系統的探索方法。
【發明內容】
[0005]本發明的目的在于提供一種基于事件處理器的Android自動化測試工具及測試方法。
[0006]實現本發明目的的技術方案為:一種基于事件處理器的Android自動化測試工具,包括事件插粧模塊、代碼分析工具Soot和App探索模塊;
[0007]事件插粧模塊包括XML解析器、識別器、分發器、語句構造器和語句管理器;
[0008]XML解析器用于收集在XML中定義的事件,解析器的輸入是Apk的XML文件,包括App的資源文件和AndroidManifest.xml,資源文件包含UI事件,AndroidManifest.xml包含系統事件和Inter-App事件;XML解析器的輸出是在資源文件和AndroidManif est.xml中定義的UI事件、系統事件和Inter-App事件;
[0009]識別器用于識別在代碼中定義的事件,識別器的輸入是Apk的Dex文件,Dex文件包含App所有的源代碼,識別器采用程序靜態分析方法,查找在代碼中定義的UI事件和系統事件;識別器的輸出是在代碼中定義的UI事件和系統事件;
[0010]分發器用于將XML解析器和識別器收集到的事件分發給事件所屬的活動;
[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事件、系統事件和 Inter-App 事件;
[0018]步驟3、使用識別器分析Dex文件,查找在代碼中定義的UI事件和系統事件;
[0019]步驟4、分發器對XML解析器和識別器收集到的事件統一處理,獲取事件的事件源和事件處理器,將事件信息分發給各自的活動;
[0020]步驟5、活動獲得事件處理器后,語句構造器構造事件處理器的調用語句;
[0021]步驟6、語句管理器創建“Test”事件,將調用語句插粧在“Test”事件的事件處理器中;
[0022]步驟7、代碼分析工具Soot將插粧的調用語句、“Test”事件和Apk的原代碼重新打包成一個新的Apk文件;
[0023]步驟8、App探索模塊啟動App,執行自動化測試;
[0024]步驟9、測試結束后,輸出測試結果,包括本次測試的耗時、代碼覆蓋率、發現的bug數目和bug類型。
[0025]本發明與現有技術相比,其顯著優點為:
[0026](I)高代碼覆蓋率:本發明能夠觸發的Android的UI事件、系統事件和Inter-App事件,比傳統的只能觸發UI事件的測試工具要更全面,代碼覆蓋率更高;
[0027](2)高效率:本發明直接調用事件處理器調用語句,比傳統的測試方法需要生成事件去驗證事件處理器的正確性速度要快;
[0028](3)Bug發現能力:由于考慮更全面的事件輸入,本發明不僅可以發現UI中的Bug,還可以發現系統和Inter-App事件中Bug。
【附圖說明】
[0029]圖1為本發明的基于事件處理器的Android自動化測試工具總體架構圖。
【具體實施方式】
[0030]結合圖1,本發明的一種基于事件處理器的Android自動化測試工具,包括事件插粧模塊、代碼分析工具Soot和App探索模塊;
[0031]事件插粧模塊包括XML解析器、識別器、分發器、語句構造器和語句管理器;
[0032]XML解析器用于收集在XML中定義的事件,解析器的輸入是Apk的XML文件,包括App的資源文件和AndroidManifest.xml,資源文件包含UI事件,AndroidManifest.xml包含系統事件和Inter-App事件;XML解析器的輸出是在資源文件和AndroidManif est.xml中定義的UI事件、系統事件和Inter-App事件;具體實現如下:
[0033](I)角軍析Androi dManifest.xml,獲取包含 Intent-Filter 的所有 Activity、Servi ce和 Receiver; Servi ce和 Receiver對應系統事件,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所有的源代碼,識別器采用程序靜態分析方法,查找在代碼中定義的UI事件和系統事件;識別器的輸出是在代碼中定義的UI事件和系統事件;具體實現如下:
[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]分發器用于將XML解析器和識別器收集到的事件分發給事件所屬的活動;具體實現如下:
[0040]根據獲取事件的類型,確定分發方式,如果事件類型是UI事件,則調用android.view.View的方法getContent()獲取UI事件所在的活動;如果是系統事件或Inter-App事件,則將事件MainActivity作為系統事件或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)獲得上