Android UI 自動化測試實現過程
介紹
Android測試支援庫包含 UI自動化模組 ,它可以對Android應用進行自動黑盒測試。在API Level 18中引入了自動化模組,它允許開發者在組成應用UI的控制元件上模仿使用者行為。
在這個教程中,我將展示如何使用此模組來建立和執行一個基本的UI測試,選擇預設的計算器模組進行測試。
先決條件
在使用前,需要具備以下條件:
- 最新版本的 Android Studio
- 執行Android 4.3或者更高版本的裝置或者虛擬器
- 理解 JUnit
1. 安裝依賴庫
工程中使用UI自動化模組,需要編輯你的工程下 app 目錄下的檔案 build.gradle ,新增如下信任:
androidTestCompile 'com.android.support.test:runner:0.2' androidTestCompile 'com.android.support.test:rules:0.2' androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.0'
現在螢幕上應該有 Sync Now 按鈕了,但點選它時,會看到如下錯誤資訊:
點選 Install Repository and sync project 連結來安裝 Android Support Repository。
如果使用的是庫 appcompat-v7 且其版本號是 22.1.1 ,你需要新增如下依賴以確保應用本身和測試應用都使用相同版本的com.android.support:support-annotations:
androidTestCompile 'com.android.support:support-annotations:22.1.1'
接下來,由於Android Studio自身的一個bug,你需要通過packagingOptions執行一個名為 LICENSE.txt 的檔案。這個執行失敗的話,在執行測試時將引起如下錯誤:
Execution failed for task ':app:packageDebugAndroidTest'. Duplicate files copied in APK LICENSE.txt File 1: ~/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.1/860340562250678d1a344907ac75754e259cdb14/hamcrest-core-1.1.jar File 2: ~/.gradle/caches/modules-2/files-2.1/junit/junit-dep/4.10/64417b3bafdecd366afa514bd5beeae6c1f85ece/junit-dep-4.10.jar
在你的 build.gradle 檔案底部增加如下程式碼段:
android { packagingOptions { exclude 'LICENSE.txt' } }
2、建立測試類
建立一個新的測試類,CalculatorTester,通過在 androidTest 目錄下建立名為 CalculatorTester.java 的檔案實現。建立的UI自動化測試用例,必須繼承自InstrumentationTestCase。
按 Alt+Insert後選擇 SetUp Method 來重寫setUp
方法。
再次按 Alt+Insert 後選擇 Test Method 來生成新的測試方法,命名為testAdd
。到此CalculatorTester
類定義如下:
public class CalculatorTester extends InstrumentationTestCase{ @Override public void setUp() throws Exception { } public void testAdd() throws Exception { } }
3、檢視Launcher UI
連線你的Android裝置到電腦商,點選home按鍵,進入主介面。
返回到你的電腦,使用檔案管理或者終端瀏覽你安裝Android SDK的目錄,進入到 tools 目錄下,點選 uiautomatorviewer 。這個會啟動 UI Automater Viewer ,你將看到如下介面:
點選上方手機圖示來獲取Android裝置截圖。注意到此時獲取到的截圖是可互動的。點選下面的Apps圖示。在右方的 Node Detail 區域,你就可以看到根據選擇圖示的不同顯示不同的詳細資訊,如下圖所示:
與螢幕上的應用互動,UI自動化測試需要能唯一識別它們。在這個教程中,可以使用應用的text
、content-desc
或者class
欄位來唯一的區分。
從上圖可以看到Apps圖示沒有text欄位,但有content-desc。記下它的值,後面將用到這個值。
拿起Android裝置,觸控Apps圖示,進入裝置安裝的所有應用介面。使用 UI Automater Viewe 獲取另外一張螢幕截圖。因為要寫一個計算器應用的測試,點選計算器圖示檢視詳細介面。
這次content-desc是空的,但是text的值為Calculator,同樣記住這個值。
如果你的Android裝置執行不同的主介面或者不同的Android版本,介面和顯示的細節會有所不同。這意味著後續程式碼中需要做一些修改,以匹配你的作業系統。
4、準備測試環境
返回到Android Studio,給setUp方法中新增程式碼。如同其名字,setUp方法是用來準備測試環境的。換句話說,這個方法是在真正測試之前指定具體需要執行什麼動作的。
現在需要寫程式碼來模擬剛才在Android裝置上執行的幾個動作:
1、按home鍵進入主介面
2、按Apps圖示進入應用介面
3、點選計算器圖示啟動它
在你的類中宣告型別為UiDevice的變數device。它代表你的Android裝置,後續使用它來模擬使用者行為。
private UiDevice device;
在setUp方法中,通過呼叫UiDevice.getInstance method來初始化device,傳遞Instrumentation例項,如下所示:
device = UiDevice.getInstance(getInstrumentation());
模擬點選裝置home鍵,需要呼叫pressHome方法。
device.pressHome();
接下來,需要模擬點選Apps圖示的動作。不能立即做這個動作,因為Android裝置需要一個反應時間來載入介面。如果在螢幕顯示出來之前執行這個動作就會引起執行時異常。
等待一些事情發生時,需要呼叫UiDevice例項的wait方法。等待Apps圖示顯示到螢幕,使用Until.hasObject方法。
識別Apps圖示需要使用By.desc方法並傳遞值為 Apps 的引數。你還需要指定最長等待時間,單位為毫秒。此處設定為3000。
至此形成如下程式碼段:
// Wait for the Apps icon to show up on the screen device.wait(Until.hasObject(By.desc("Apps")), 3000);
要獲取Apps圖示的引用,需要使用findObject方法。一旦有了Apps圖示的引用,就可以呼叫click方法來模擬點選動作了。
UiObject2 appsButton = device.findObject(By.desc("Apps")); appsButton.click();
和前面一樣,我們需要等待一些時間,保證計算器圖示顯示到螢幕上。在之前的步驟中,我們看到可以通過text欄位唯一的識別計算器圖示。我們呼叫By.text方法來找到圖示,傳遞引數為Calculator。
// Wait for the Calculator icon to show up on the screen device.wait(Until.hasObject(By.text("Calculator")), 3000);
5、檢查計算器UI
在你的Android裝置上啟動計算器應用,使用 UI Automater Viewer 來檢視顯示。獲取到一個截圖後,點選不同的按鈕來觀察使用何值可以唯一的區分它們。
在本次測試用例中,使用計算器計算 9+9= 的值並確認結果是否為 18 。這意味著你需要知道怎麼區分按鍵 9 、 + 和 = 。
在我的裝置上,如下是我收集到的資訊:
- 數字按鍵匹配text值
- + 和 = 使用content-desc值,分別對應 plus 和 equals
- 返回值顯示在EditText控制元件中
如果你使用不同版本的計算器應用,請注意這些值有可能不一樣。
6、建立測試類
在前面幾步操作中,你已經學會了使用findObject方法通過By.text或者By.desc來獲取螢幕上不同物件的引用。還學會了通過click方法來模擬點選物件的動作。下面的程式碼使用這些方法來模擬 9+9= 。新增這些到類CalculatorTester的方法testAdd中。
// Wait till the Calculator's buttons are on the screen device.wait(Until.hasObject(By.text("9")), 3000); // Select the button for 9 UiObject2 buttonNine = device.findObject(By.text("9")); buttonNine.click(); // Select the button for + UiObject2 buttonPlus = device.findObject(By.desc("plus")); buttonPlus.click(); // Press 9 again as we are calculating 9+9 buttonNine.click(); // Select the button for = UiObject2 buttonEquals = device.findObject(By.desc("equals")); buttonEquals.click();
現在就等待執行結果。此處不能使用Until.hasObject,因為包含計算結果的EditText已經顯示在螢幕上了。取而代之,我們使用waitForIdle方法來等待計算完成。同樣,最長等待時間是3000毫秒。
device.waitForIdle(3000);
使用findObject和By.clazz methods方法獲取EditText物件的引用。一旦有了此引用,就可以呼叫getText方法來確定計算結果是否正確。
UiObject2 resultText = device.findObject(By.clazz("android.widget.EditText")); String result = resultText.getText();
最後,使用assertTrue來檢驗範圍值是否為 18 。
assertTrue(result.equals("18"));
測試到此結束。
6、執行測試
執行測試,需要在Android Studio的工具欄中選擇CalculatorTester,點選它右方的 play 按鈕。
一旦編譯結束,測試就成功執行完整。當測試執行時,在你的Android裝置上就會看到UI自動化執行介面。
總結
在這篇教程中,我們學會了如何使用UI自動化測試模組和 UI Automater Viewer 來建立使用者介面測試。你也看到了使用Android Studio執行測試是如此簡單。雖然我們測試了一個相對簡單的應用,但可以將從中學到的概念用到幾乎所有Android應用的測試中。
相關文章
- Postman實現UI自動化測試PostmanUI
- UI自動化測試實戰UI
- 自動化測試系列 —— UI自動化測試UI
- APP自動化測試過程概述APP
- UI自動化測試工程實踐UI
- android 5個自動化測試Ui框架AndroidUI框架
- 如何學習自動化測試?從手工測試到自動化測試的過程…
- 自動化測試系列(三)|UI測試UI
- Android自動化測試工具實現簡述Android
- 全副武裝!Android UI 自動化測試在 RxImagePicker 中的實踐歷程AndroidUI
- Android使用Espresso進行UI自動化測試AndroidEspressoUI
- UI自動化測試之AirtestUIAI
- UI 自動化測試平臺UI
- Junit測試Android自動化測試Android
- 如何實現高度自動化測試?
- UI自動化測試框架Cypress初探UI框架
- 自動化測試進階課程——Selenium自動化測試通關實戰班
- android自動化測試_uiautomator方案實現要點AndroidUI
- API自動化測試平臺,高效實現對API的自動化測試API
- [android]android自動化測試Android
- 使用 Postman 實現 API 自動化測試PostmanAPI
- postman實現介面的自動化測試Postman
- 關於Web端-UI自動化測試WebUI
- APP UI自動化測試思路總結APPUI
- UI自動化測試-web元素選擇UIWeb
- 前端ui自動化測試sdk封裝前端UI封裝
- 「UI 測試自動化selenium」彙總UI
- 前端自動化UI測試的完整方案前端UI
- 試著使用 jmeter 實現介面自動化測試JMeter
- 移動端 UI 自動化測試框架對比UI框架
- 解放雙手 - Android 開發應該嘗試的 UI 自動化測試AndroidUI
- Selenium Web Driver自動化測試(java版)系列下半部分(37) - 關鍵字驅動自動化測試框架(2)-測試過程...WebJava框架
- ui自動化測試,頁面方法的使用UI
- 關於 ui 自動化測試 driver 疑問?UI
- 基於PhantomFlow的自動化UI測試UI
- [原創]淺談Web UI自動化測試WebUI
- 搭建 WPF 上的 UI 自動化測試框架UI框架
- UI自動化測試介紹及入門UI