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