◆版權聲明:本文出自胖喵~的博客,轉載必須註明出處。html
轉載請註明出處:http://www.cnblogs.com/by-dream/p/4872244.htmljava
前言android
在App的測試中,除了單元測試來保證Android應用程序的各個組件(例如activities、services和content providers),測試用戶在應用程序界面的行爲也是很是重要的一部分。UI測試(UI Testing)可確保用戶在一系列操做過程當中(例如鍵盤輸入、點擊菜單、彈出對話框、圖像顯示以及其餘UI控件的改變),你的應用程序作出正確的UI響應。shell
谷歌UI測試(UI Testing)文檔:http://android.toolib.net/tools/testing/testing_ui.html 併發
UI測試(功能測試、黑盒測試)不須要測試者瞭解應用程序的內部實現細節,只須要知道當執行了某些特定的動做後是否會獲得其預期的輸出。這種測試方法,在團隊合做中能夠更好地分離的開發和測試角色。框架
常見的UI測試的方法是手動去執行,而後去驗證程序是否達到的預期的效果,很顯然這種方法耗時、繁瑣而且很容易出錯。所以咱們須要一種可靠的方法來進行UI測試,經過測試框架,咱們能夠完成針對具體使用場景的測試用例,而後能夠循環的、自動的來運行咱們的測試case。ide
概述工具
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測試所需的步驟的簡短概述:
一、安裝待測應用到手機,經過uiautomatorviewer分析應用程序界面的控件,並確保應用程序的控件能夠被自動化框架訪問。
二、建立自動化測試用例來模擬你和應用程序之間交互的步驟。
三、將測試用例編譯成一個JAR文件,並發動到應用程序安裝的那臺測試設備上。
四、運行測試,查看測試結果。
五、修改測試過程當中發現的bug。
分析控件
在你開始寫測試用例以前,使用uiautomatorviewer能夠幫助你熟悉你的UI組件(包括視圖和控件)。你可使用它對當前鏈接到你電腦上的手機屏幕進行一個快照,而後能夠看到手機當前頁面的層級關係和每一個控件的屬性。利用這些信息,你能夠寫出針對特定UI控件的測試用例。
在 ..\sdk\tools\ 目錄下打開 uiautomatorviewer.bat (打開前請手機鏈接電腦)
想必你們看了上面的動態圖,基本上已經瞭解了一些用法了吧,我再進一步說明一下:
一、獲取快照:
當你要分析一個頁面時,首先將手機的頁面停留在你要分析的頁面,而後用數據線鏈接電腦。而後點擊uiautomatorviewer左上角的第二個圖標按鈕 Device Screenshot,點擊以後會將當前手機界面的快照更新到這裏來。
二、頁面層級:
右上方的整個區域,就是當前頁面佈局的層級關係。若是對Android五大布局比較熟悉的話,理解這一層應該不是問題。
三、不可用區域:
右上方的整個區域中的第二個按鈕Toggle NAF Nodes,按下後出現的黃色區域表明,這些控件是不被Uiautomator工具識別,沒法獲取到這些控件的實例。以QQ首頁爲例。
咱們能夠看到,當按下該按鈕的時候,下方的三個tab出現黃色區域,這就表明這三個區域的控件,若是你想經過Uiautomator提供的API來得到他們的屬性,或者對其進行點擊操做,是作不到的,由於你沒辦法拿到這些控件的實例。
四、屬性詳情:
右下方的整個區域,是當前選中的頁面或者是控件的屬性信息。這部分比較重要,咱們之後寫代碼的時候就是須要經過查看屬性中的控件的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
一、在Eclipse中創建一個Java的工程。
二、右鍵選中你創建的工程,在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版本的。
三、導入成功以後,就能夠寫代碼了。代碼的格式參考下面:
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 { // 測試代碼 } }
四、使用 android create uitest-project -n %工程名% -t 5 -p %工程目錄% 來生存build.xml文件。
須要注意的就是 這裏的 -t 後面的 5 就是Android list後對應的你當初引入兩個jar包的sdk版本對應的id。個人是 id: 5 or "android-19",因此我這裏是5
五、生成的build.xml 用ant工具進行編譯。編譯後會生成「工程名.jar」包(注意這裏須要使用 ant build命令來打包,這樣有錯誤能夠看到);
六、將該jar包push到手機的 /data/local/tmp 目錄下
七、在adb shell 中執行: uiautomator runtest 工程名.jar -c 包名.類名
執行以後就能夠,看到自動執行的效果了。下節將重點講解如何寫Uiautomator的代碼。