來自:http://university.utest.com 做者: 譯者:Elaine00html
Android UI 測試有兩種測試類型, 其中一種白盒測試須要測試人員瞭解到應用的源碼。白盒測試,測試人員可使用爲Android應用設計測試用例。第二類被稱爲黑盒測試,其中測試人員沒有訪問應用程序的源代碼,可是你須要測試應用程序的行爲,當它運行在一臺設備。java
在Android用戶界面測試,你要測試的應用程序如何與一個真實的用戶交互。UI測試確保應用程序返回響應用戶一系列操做的正確的UI輸出,如鍵盤輸入或按工具欄,菜單,對話框,圖像,和其餘用戶界面控件。爲了實現這一目標,你有兩個選擇。一是在真實的應用中來使用這個應用,而且嘗試各類途徑來發現應用的異常表現和Bugs。這種作法顯然是費時,容易出錯,你能夠嘗試有限的狀況下。linux
另外一種方案是自動化測試。自動化測試涉及到建立的程序來完成測試任務(測試用例)覆蓋特定的使用場景,而後使用測試框架來自動地執行測試用例和可重複的方式。android
第一個工具咱們要看到的是uiautomatorviewer,一個用來來掃描和分析Android應用程序的UI組件的GUI工具。爲了使用uiautomatorviewer,你必須首先下載並安裝SDK和根據指示設置ADT束Eclipse IDE。安裝後,該工具存在於/tools/文件夾,您能夠從命令行輸入啓動它:uiautomatorviewer。git
可是這個工具的用途是什麼?使用uiautomatorviewer,你能夠檢查一個應用的UI來查看應用的佈局和組件以及相關的屬性。這是很是重要的,特別是當你想構建自動化測試,經過了解各個部件的應用層次的佈局,你可使用uiautomator(在本課程的一部分API)來建立自動化測試。shell
下面我將一步一步帶教你如何使用uiautomatorviewer來查看Calculator應用的佈局和組件的IDapp
如今你知道了:框架
你如今知道如何使用uiautomator建立一個擁有簡單的功能的用戶界面測試。在下面的部分中,您將構建一個功能性的UI測試,能夠檢查應用程序當您添加數字「7」和「1」如何工做。ide
With uiautomator API, you can create functional UI tests without the need to have access to the source code of the application. The uiautomator is a Java library containing APIs to create customized functional UI tests, and an execution engine to automate and run the tests.工具
使用uiautomator API,您能夠建立功能的UI測試而且不須要訪問應用程序的源代碼。uiautomator 是一個包含java類庫的API,能夠用來建立定製功能的UI測試而且有一個自動化引擎來執行測試。
要運行uiautomator, 你必須:
一樣能夠從 「Properties」 選擇「Java build path」 -> 「Libraries」 -> 「Add external JARs」 ,在platforms目錄下選擇最新的SDK版本和 uiautomator.jar文件,android.jar文件.
注:API中有不少類,但在API中三個最重要的類是:
UiDevice -這類表示測試程序開始的時候必須調用getuidevice()這個方法。當你有一個設備的引用,你能夠作不少事情了。例如,您可使用getuidevice().takescreenshot(storepath)來實現設備的截圖。你能夠使用getUiDevice().pressHome()來點擊「Home」 ;或getUiDevice().sleep()來使得設備休眠了
UiSelector - 經過這個類,你能夠定義你須要測試的佈局元素,篩選屬性例如as text value, content-description, class名字和狀態。例如,獲取帶有文字 「Bluetooth」的控件 , UiObject button = new UiObject(new UiSelector().text(「Bluetooth」)); 你也能夠選擇一個組件經過類名,描述和ID。
UiObject - 這個類表示的是簡單的UI組件,一旦引用,你能夠經過點擊代碼: UiObject seven = new UiObject(new UiSelector().resourceId(「com.android.calculator2:id/digit7″)); seven.click();, 你能夠讀取文字:seven.getText();, 或者你能夠設置文字, 可是須要先清除文字以後再設置 seven.setText();.
在寫完測試場景的代碼以後,你必須按照如下步驟來 編譯你的代碼,建立jar文件,而且把文件導入設備。
1. 查看/sdk/tools/目錄. (例如: cd /home/angelos/Desktop/adt-bundle-linux-x86-20131030/sdk/tools/ )
2. 輸入 /tools/android create uitest-project -n -t 5 -p
(例如: android create uitest-project -n MyFirstTest -t 5 -p /home/angelos/workspace/MyFirstTest/) 注:
爲了尋找參數t的正確值,列出Android目標列表。
3. Windows 輸入: set ANDROID_HOME= <path_to_your_sdk>.
Linux 輸入: export ANDROID_HOME= <path_to_your_sdk>.
(例如: export ANDROID_HOME=/home/angelos/Desktop/adt-bundle-linux-x86-20131030/sdk/ )
4. 找到你項目的目錄 (例如: cd /home/angelos/workspace/MyFirstTest/ )
5. 輸入ant build.
6. 找到 platform-tools目錄. (Example: cd /home/angelos/Desktop/adt-bundle-linux-x86-20131030/sdk/platform-tools )
7.把jar導入你的設備(Example: adb push /home/angelos/workspace/MyFirstTest/bin/MyFirstTest.jar /data/local/tmp/ )
爲了能夠正常運行測試代碼,須要先在控制檯: adb shell uiautomator runtest MyFirstTest.jar -c nak.test.CalculatorTest. 注: 名字須要與項目名和類名相同 MyFirstTest.jar和nak.test.CalculatorTest. Voila! 接着測試執行過程當中能夠查看7和1的按鈕是發生什麼變化的。
如今,你要注意下應用的測試或測試的極端條件下的應用程序的不良表現。你能夠寫一個你所能夠想到的測試場景。
package nak.test; //Import the uiautomator libraries import com.android.uiautomator.core.UiObject; import com.android.uiautomator.testrunner.UiAutomatorTestCase; import com.android.uiautomator.core.UiSelector; import com.android.uiautomator.core.UiObjectNotFoundException; import com.android.uiautomator.core.UiScrollable; public class CalculatorTest extends UiAutomatorTestCase { public void testingCalculator() throws UiObjectNotFoundException { // First we testing the press of the HOME button. getUiDevice().pressHome(); // using the uiautomatorviewer tool we found that the button for the "applications" has //the value 「Apps」 (screen9) // so we use this property to create a UiSelector to find the button. UiObject Applications = new UiObject(new UiSelector().description("Apps")); // testing the click to bring up the All Apps screen. Applications.clickAndWaitForNewWindow(); // In the All Apps screen, the "Calculator" application is located in // the Apps tab. So, we create a UiSelector to find a tab with the text // label 「Apps」. UiObject apps = new UiObject(new UiSelector().text("Apps")); // and then testing the click to this tab in order to enter the Apps tab. apps.click(); // All the applications are in a scrollable list // so first we need to get a reference to that list UiScrollable ListOfapplications = new UiScrollable(new UiSelector().scrollable(true)); // and then trying to find the application // with the name Calculator UiObject Calculator = ListOfapplications.getChildByText(new UiSelector().className(android.widget.TextView.class.getName()),"Calculator"); Calculator.clickAndWaitForNewWindow(); // now the Calculator app is open // so we can test the press of button "7" using the ID "com.android.calculator2:id/digit7" //we found by using uiautomatorviewer UiObject seven = new UiObject(new UiSelector().resourceId("com.android.calculator2:id/digit7")); seven.click(); // now we test the press of button "+" UiObject plus = new UiObject(new UiSelector().resourceId("com.android.calculator2:id/plus")); plus.click(); // and then the press of button "1" UiObject one = new UiObject(new UiSelector().resourceId("com.android.calculator2:id/digit1")); one.click(); // we test the press of button "=" UiObject result = new UiObject(new UiSelector().resourceId("com.android.calculator2:id/equal")); result.click(); //and finally we test the press of "Back" button getUiDevice().pressBack(); } }