仲林霖
摘要:本文主要介紹了一個可以執(zhí)行安卓自動化測試的方法,使用adb命令調(diào)試手機。通過adb命令獲取手機界面元素,發(fā)送動作指令給手機。
關(guān)鍵詞:安卓 adb 自動化
1. 引言
Android系統(tǒng)已經(jīng)占據(jù)智能移動設(shè)備市場80%以上的份額,所以相應的對于app的測試也尤為重要,而自動化測試又是一個效率高、及其節(jié)省人力的方法。現(xiàn)在市場上的測試框架用的比較多的是Appium。雖然Appium框架功能相對比較齊全,但是Appium的框架比較重,相關(guān)的文檔指導比較少,所以使用起來,學習成本也高。本文所描述框架,主要是簡化測試框架、提高執(zhí)行效率。
2. 關(guān)于adb的基礎(chǔ)
Android 調(diào)試橋 (adb) 是一個通用命令行工具,其允許您與模擬器實例或連接的 Android 設(shè)備進行通信。它可為各種設(shè)備操作提供便利,如安裝和調(diào)試應用,并提供對 Unix shell(可用來在模擬器或連接的設(shè)備上運行各種命令)的訪問。該工具作為一個客戶端-服務(wù)器程序,包括三個組件:
客戶端,該組件發(fā)送命令。客戶端在開發(fā)計算機上運行。您可以通過發(fā)出 adb 命令從命令行終端調(diào)用客戶端。
后臺程序,該組件在設(shè)備上運行命令。后臺程序在每個模擬器或設(shè)備實例上作為后臺進程運行。
服務(wù)器,該組件管理客戶端和后臺程序之間的通信。服務(wù)器在開發(fā)計算機上作為后臺進程運行。
3. 自動化框架
此框架只支持測試安卓app,是基于adb命令功能的封裝,在執(zhí)行效率上有了很大提升。
1)尋找目標控件
控件屬性包含:text、resource-id、class、package、content-desc、checkable、checked、clickable、enable、focusable、focused、scrollable、long-clickable、password、selected、bounds。尋找的條件可以是上面列出屬性的其中一個,或者多個組合。用java代碼舉例:
Map
condition.put("text", "valueText");
condition.put("resource-id", "valueResourceid");
condition.put("content-desc", "valueContentDesc");
根據(jù)條件尋找控件,這里首先把手機界面的結(jié)構(gòu)dump出來,在進行XML解析,然后再逐個和尋找目標條件比對。
2)點擊目標控件,輸入文本,返回、home、menu
a. 獲取目標控件的信息后,取得位置,然后使用adb發(fā)送點擊位置的指令。用java代碼舉例:
String bounds = targetElement.attributeValue("bounds");
ArrayList
String number = "";
for (int i = 0; i < bounds.length(); i++) {
if (Character.isDigit(bounds.charAt(i))) {
number += bounds.charAt(i);
} else {
if (!number.equalsIgnoreCase("")) {
listInt.add(Integer.valueOf(number));
number = "";
}
}
}
int left = listInt.get(0);
int top = listInt.get(1);
int right = listInt.get(2);
int bottom = listInt.get(3);
String cmd = "adb shell input tap " + String.valueOf(right - left) + " " + String.valueOf(bottom - top);
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd});
b. 往控件里面輸入文本,需要輸入框首先獲取光標,然后再使用adb命令發(fā)送輸入文本指令。用java代碼舉例:
String cmd = "adb shell input text " + text;
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd})
c. 輸入返回、Home、Menu實體按鍵,使用adb命令發(fā)送按鍵指令。用java代碼舉例:
返回鍵:
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "adb shell input keyevent 4"});
Home鍵:
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", adb shell input keyevent 3});
Menu鍵:
Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", adb shell input keyevent 1});
4. 實例分析
自動化框架的點擊、輸入文本、實體按鍵直接封裝成方便方法,比如需要點擊某個resource-id為“abc”的控件,可以使用方法“clickByResId("abc")”來實現(xiàn)功能,一行代碼就足夠,可以使大大減少自動化腳本的編輯成本。
在運行自動化腳本的過程中,會存在要操作的控件還沒有出現(xiàn)在安卓手機上,這時候需要有一個循環(huán)等待的機制來解決這個問題,在控件沒有找到的時候,就一直等待,直到目標控件。這種循環(huán)等待機制會大大增加腳本的魯棒性。
在測試安卓手機的過程中,會出現(xiàn)很多權(quán)限請求的彈窗,影響腳本繼續(xù)往下執(zhí)行,即使有循環(huán)等待機制,也會因為彈窗不處理而無限等待下午。針對這個問題,可以在執(zhí)行測試腳本的同時,新開一個線程輪訓地去檢查安卓手機界面是否有彈窗,一旦發(fā)現(xiàn)彈窗就點擊授權(quán)跳過。因為主測試進程沒有找到目標控件會一直等待,所以彈窗點擊授權(quán)之后,就可以繼續(xù)進行測試。以java代碼舉例:
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (hasObject("權(quán)限請求"){
clickByText("允許");
}
Thread.sleep(1000);
}
}
}).start();
5. 結(jié)語
通過自動化框架,可以提高編輯腳本的效率,降低腳本出錯的概率,幫助缺少開發(fā)經(jīng)驗的軟件測試人員更容易地書寫測試腳本,推進自動化測試。
參考文獻
[1] 鄭婷婷,黃英持,Android應用的多設(shè)備自動化測試實現(xiàn)[J].軟件導刊,2016(02)