Android自動化測試初探(一): 捕獲Activity上的Element

第一部分:前言

Android系統下應用程序的測試現在應該還算是個新的領域,網上關於這方面的資料很多都是基於白盒測試的,一般都是基於JUnit框架和Android SDK中android.test等命名空間下的內容進行,但是有一個前提,那就是必須要有應用程序的源代碼以提供測試接入點,但是這在很多軟件公司中是不現實的。很多測試工程師做的工作是完全黑盒,基本接觸不到源代碼,白盒測試大部分也是由開發自己完成。

                回顧一下Windows下的黑盒測試自動化,先前使用的是微軟提供的基於.net framework的UI Automation自動化測試框架(要求版本在.net framework 3.0以上,即VS.NET 2008 開發環境),對與擅長C#語言的人來說,使用起來確認比較好用。本人也寫了基於UI Automation的輕量級的自動化框架,將在以後的博文中引出。

                那在Android操作系統中能不能做類似於UI Automation的事情呢?不幸的是,Android的權限控制分的非常清楚,不同程序之間的數據訪問只能通過Intent,content provider類似的功能實現。也就是說你開發的運行在Android中的自動化程序想要捕獲當前運行的AUT (Application under Test) 界面上的控件等Element(該術語引自UI Automation,覺得翻譯成元素有點生硬,故不作翻譯)基本不可能,你也拿不到當前active activity的引用(截止本文發帖爲止,個人暫時沒有找到辦法獲得此引用)。

                無路可走了?模擬器裏面不能走,外面能不能走?或許可以。

第二部分:捕獲Activity上的Element

                在Android的SDK中自帶了一個對自動化測試比較有用的工具:hierarchyviewer(位於SDK的tools目錄下)。在模擬器運行的情況下,使用該工具可以將當前的Activity上的Element以對象樹的形式展現出來,每個Element所含的屬性也能一一盡顯。這有點像Windows上運行的UI SPY,唯一遺憾的是不支持事件的觸發。不過沒有關係,可以想辦法繞,當務之急是能在自行編寫的自動化測試代碼裏找到Activity上的Element。

                第一個想到的辦法就是看hierarchyviewer源碼,不巧,網上搜了一下,沒有資源。或許Google的官網上有,但是上不去。看來只能反編譯了,找來XJad,暴力之。雖然反編譯出來的代碼很多地方提示缺少import,但代碼基本上是正確的。看了一下,確實也知道了許多。後來在編寫代碼的過程中,確實也證明了如果想引用hierarchyviewer.jar這個包並調試,還是需要知道里面的一些設置的。

                創建基於hierarchyviewer.jar這個包的調用,需要將它和另外兩個包,ddmlib.jar(在hierarchyviewer.jar同級目錄中有)和org-netbeans-api-visual.jar(需要下載並安裝netbeans,在其安裝目錄中有)一併導入到工程項目中,因爲hierarchyviewer的實現依附於這兩個包。

                想在代碼中獲取Activity上的Element需要進行如下幾個步驟(如果使用過hierarchyviewer這個工具後會發現,自動化代碼所要寫的就是該工具上的使用步驟):

1.       Ensure adb running

2.       Set adb location(因爲hierarchyviewer和模擬器的溝通完全是依靠adb做的,所以設定正確的adb程序的位置至關重要,本人就曾在這個問題上栽了半天多)

3.       Get Active Device (這個等同動作發生在啓動hierarchyviewer工具時)

4.       Start View Server  (等同於工具上Start Server 菜單觸發事件)

5.       Load Scene (等同於工具上Load View Hierarchy菜單觸發事件)

6.       Get Root View Node (獲得對象樹的根節點,這個動作在工具上點擊Load View Hierarchy菜單後會自動加載)

7.       Get Sub View Node (獲得想要查找的View Node,這個動作在工具上點擊Load View Hierarchy菜單後會自動加載)

說明:上述步驟中一些名稱實際上就是hierarchyviewer中所提供的可訪問方法名稱,如startViewServer、loadScene、rootNode等。另外View Node實際上hierarchyviewer中的一個類,表示的對象樹上的一個Element。

現將部分核心代碼粘貼如下:

1.       Set adb location

System.setProperty("hierarchyviewer.adb","E:// //Android//android-sdk-windows//tools");

其中”hierarchyviewer.adb” 這個key是hierarchyviewer.jar中指定的,後面的value是存放Android SDK的路徑。這個目錄必須是當前運行的模擬器所對應的adb的目錄,不能自行使用其他目錄下adb,否則會發生adb進程異常退出的錯誤。

 

2.       Get Active Device

IDevice[] devices = null;

DeviceBridge.terminate();

while(null==devices || 0==devices.length){

DeviceBridge.initDebugBridge() ;

//it must wait for some time, otherwise will throw exception

try {

         Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

devices = DeviceBridge.getDevices() ;

}

return devices;

以上方法返回的是所有當前運行的Device列表

 

3.       Start View Server  

DeviceBridge.startViewServer(device);

 

4.       Load Scene

ViewHierarchyLoader.loadScene(device,Window.FOCUSED_WINDOW) ;

 

5.       Get Root View Node

vhs.getRoot() ;

其中vhsViewHierarchyScene的實例對象

 

6.       Get Sub View Node

public ViewNode findFirstChildrenElement(IDevice device, ViewNode entryViewNode, String elementID){

            ViewNode node=null;

            if(0!=entryViewNode.children.size()){

                  for(int i=0;i<entryViewNode.children.size();i++){

                        node=entryViewNode.children.get(i);

                        if(node.id==elementID)

                              return node;

                        else

                              continue;

                  }

            }

            return node;}

     

雖然上述步驟所涉及的代碼量不多,但是花了一天多的時間才終究研究出來,寫下此文希望對正在研究Android自動化測試的同學們有些幫助。

 

到目前爲止,Element已經得到了,接下去就是實現怎麼去觸發這些Element,click buttonenter text等等,尚需再慢慢研究,等有結果再貼出來分享!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章