◆版權聲明:本文出自胖喵~的博客,轉載必須注明出處。
轉載請注明出處:http://www.cnblogs.com/by-dream/p/4872244.html
前言
在App的測試中,除了單元測試來保證Android應用程序的各個組件(例如activities、services和content providers),測試用戶在應用程序界面的行為也是非常重要的一部分。UI測試(UI Testing)可確保用戶在一系列操作過程中(例如鍵盤輸入、點擊菜單、彈出對話框、圖像顯示以及其他UI控件的改變),你的應用程序做出正確的UI響應。
谷歌UI測試(UI Testing)文檔:http://android.toolib.net/tools/testing/testing_ui.html
UI測試(功能測試、黑盒測試)不需要測試者了解應用程序的內部實現細節,只需要知道當執行了某些特定的動作后是否會得到其預期的輸出。這種測試方法,在團隊合作中可以更好地分離的開發和測試角色。
常見的UI測試的方法是手動去執行,然后去驗證程序是否達到的預期的效果,很顯然這種方法耗時、繁瑣並且很容易出錯。因此我們需要一種可靠的方法來進行UI測試,通過測試框架,我們可以完成針對具體使用場景的測試用例,然后可以循環的、自動的來運行我們的測試case。
概述
Android的SDk提供了以下的工具來支持我們進行UI自動化測試:
uiautomatorviewer:一個用來掃描和分析Android應用程序的UI控件的GUI工具。
uiautomator:一個包含創建測試、執行自動化測試API的java庫。(照例送上谷歌Uiautomator文檔:http://android.toolib.net/tools/help/uiautomator/index.html )
要使用這些工具,你必須安裝Android開發工具以下版本:
Android SDK Tools:API 21 版本或者21以上版本;
Android SDK Platform:API 16 版本或者16以上版本.
Uiautomator測試框架的工作流程
下面是自動UI測試所需的步驟的簡短概述:
1、安裝待測應用到手機,通過uiautomatorviewer分析應用程序界面的控件,並確保應用程序的控件可以被自動化框架訪問。
2、創建自動化測試用例來模擬你和應用程序之間交互的步驟。
3、將測試用例編譯成一個JAR文件,並發動到應用程序安裝的那台測試設備上。
4、運行測試,查看測試結果。
5、修改測試過程中發現的bug。
分析控件
在你開始寫測試用例之前,使用uiautomatorviewer可以幫助你熟悉你的UI組件(包括視圖和控件)。你可以使用它對當前連接到你電腦上的手機屏幕進行一個快照,然后可以看到手機當前頁面的層級關系和每個控件的屬性。利用這些信息,你可以寫出針對特定UI控件的測試用例。
在 ..\sdk\tools\ 目錄下打開 uiautomatorviewer.bat (打開前請手機連接電腦)
想必大家看了上面的動態圖,基本上已經了解了一些用法了吧,我再進一步說明一下:
1、獲取快照:
當你要分析一個頁面時,首先將手機的頁面停留在你要分析的頁面,然后用數據線連接電腦。然后點擊uiautomatorviewer左上角的第二個圖標按鈕 Device Screenshot,點擊之后會將當前手機界面的快照更新到這里來。
2、頁面層級:
右上方的整個區域,就是當前頁面布局的層級關系。如果對Android五大布局比較熟悉的話,理解這一層應該不是問題。
3、不可用區域:
右上方的整個區域中的第二個按鈕Toggle NAF Nodes,按下后出現的黃色區域代表,這些控件是不被Uiautomator工具識別,無法獲取到這些控件的實例。以QQ首頁為例。
我們可以看到,當按下該按鈕的時候,下方的三個tab出現黃色區域,這就代表這三個區域的控件,如果你想通過Uiautomator提供的API來獲得他們的屬性,或者對其進行點擊操作,是做不到的,因為你沒辦法拿到這些控件的實例。
4、屬性詳情:
右下方的整個區域,是當前選中的頁面或者是控件的屬性信息。這部分比較重要,我們以后寫代碼的時候就是需要通過查看屬性中的控件的id或者是text等來獲取控件的實例,然后點擊操作它。
以QQ左上角的頭像控件為例:
點擊左上角的頭像控件之后,右下方區域就會顯示這個控件的詳細信息。比如這里我們可以得知它的resource-id就是com.tencent.mobileqq:id/conversation_head。
然后利用Uiautomator的API方法就可以得到該控件的實例。
// 通過id來創建出UiSelector 對象 UiSelector = new UiSelector().resourceId("com.tencent.mobileqq:id/conversation_head"); // 通過UiSelector 對象 創建出 UiObject 對象 UiObject switcher = new UiObject(uiSelector ); // 判斷該控件是否存在 if (switcher.exists()) { //點擊該控件 switcher.click(); }
上面的方法就是知道了該控件的id之后,模擬點擊該控件的過程,當然Uiautomator還提供了根據text來獲取控件。
這種點擊的方法比起Monkeyrunner來說它的好處就是:Monkeyrunner是坐標點擊,當一個腳本寫好后,換一個分辨率的手機去執行,點擊的位置可能就會出錯,而Uiautomator點擊是先找到該控件,然后再點擊該控件,因此可移植性比Monkeyrunner要好;另外代碼的易讀性也更好一些。
環境搭建
網上關於環境搭建的內容很多,也非常的詳細,這里我就簡單的說下大體流程和注意事項吧。 隨手找了一個別人寫的環境搭建的文章。直接參考即可: http://www.testwo.com/blog/7057
1、在Eclipse中建立一個Java的工程。
2、右鍵選中你建立的工程,在Properties > Java Build Path中:
a、點擊 Add Library > JUnit 添加JUnit3/4;
b、點擊Add External JARs... 導入 uiautomator.jar
and android.jar
這兩個jar包。
這里需要注意,導入這兩個jar包的時候,注意Android的版本號,后面生成build.xml的時候需要知道你導入的這兩個jar是哪個sdk版本的。
3、導入成功之后,就可以寫代碼了。代碼的格式參考下面:
package com.uia.example.my; // Import the uiautomator libraries import com.android.uiautomator.core.UiObject; import com.android.uiautomator.core.UiObjectNotFoundException; import com.android.uiautomator.core.UiScrollable; import com.android.uiautomator.core.UiSelector; import com.android.uiautomator.testrunner.UiAutomatorTestCase; public class yourclass extends UiAutomatorTestCase { public void testDemo() throws UiObjectNotFoundException { // 測試代碼 } }
4、使用 android create uitest-project -n %工程名% -t 5 -p %工程目錄% 來生存build.xml文件。
需要注意的就是 這里的 -t 后面的 5 就是Android list后對應的你當初引入兩個jar包的sdk版本對應的id。我的是 id: 5 or "android-19",所以我這里是5
5、生成的build.xml 用ant工具進行編譯。編譯后會生成“工程名.jar”包(注意這里需要使用 ant build命令來打包,這樣有錯誤可以看到);
6、將該jar包push到手機的 /data/local/tmp 目錄下
7、在adb shell 中執行: uiautomator runtest 工程名.jar -c 包名.類名
執行之后就可以,看到自動執行的效果了。下節將重點講解如何寫Uiautomator的代碼。