測試是應用開發流程中的重要環節。 對於 Android,這尤為重要,因為 Android 裝置彼此之間差異很大,主要體現在以下幾個方面:
螢幕尺寸和解析度
Android 版本
外形
處理器的指令集
是否有自拍、NFC、外置鍵盤等。您應在多台裝置上對 Android 應用進行測試。
應用測試流程包括多種測試。 讓我們來瞭解一下手動功能測試。 測試者需要認真檢查所有功能並將裝置重設為初始狀態。 測試者在每個應用和每部裝置上重複上述操作。 該流程是手動完成的,因此非常耗時。
自動功能測試可按計劃執行而無需額外成本。 例如,測試一個 build,每天晚上在所有裝置上進行測試,早上分析結果並修複漏洞。
在本文中,我們將回顧幾種適用於自動功能測試的工具。 我僅對 Android SDK 中包括的或在開源許可協議下發布的工具進行介紹。
自動化的測試的概念我們的目標是將手動執行的操作自動化,以實現最大精度。 讓我們瞭解一下這些操作。 我們將使用多個應用和多部 Android 裝置。
對於每個應用和每部裝置,我們應按照下列步驟來操作:
在裝置上安裝應用
啟動應用
使用指定方法測試應用
卸載應用
將裝置重設為初始階段在每個步驟中,您需要收集和分析資料,如日誌和截屏。 在下文中,我們將討論將這些步驟自動化的工具。
控制 Android 裝置首先,您需要選擇用於運行自動化測試的電腦,並在該電腦上安裝 Android SDK。 我將以運行 Linux* 系統的台式電腦為例。 您需要在每台裝置上禁用鎖屏並將“進入睡眠模式的時間”調整到最大值。對於一些方法 您需要禁用螢幕方向調整。
Android SDK 中有兩種公用程式可以控制 Android 裝置: ADB 和 monkeyrunner*。 下面,我將具體介紹如何將手動測試中的操作自動化。
使用 ADB 控制 Android 裝置ADB (Android Debug Bridge)是控制 Android 裝置的命令列工具。 ADB 首頁是: http://developer.android.com/tools/help/adb.html
ADB 工具位於 /platform-tools/ 目錄下。您需要將該目錄存放到 PATH 環境變數下。
檢查 ADB 安裝
安裝並設定 Android SDK,然後將 Android 裝置串連至您的電腦並運行下列命令:
adb devices
該命令將出現在所有插入的 Android 裝置上。 如果裝置列表不是空白,那麼 ADB 便可正常運行。
在多台裝置上運行
您需要使用“-s”參數指定 ADB 應使用哪台裝置。
adb -s [serial_number] [command]
例如:
adb -s [serial_number] logcat
裝置的序號可通過輸入 ?adb devices? 命令後產生的輸出中獲得。 參數 -s 支援您同時使用多台互聯裝置。
基本的 ADB 命令
在裝置上開啟控制台:
adb shell
在裝置上運行命令:
adb shell [command]
Android 中包含許多標準的 Linux 公用程式: ls、cat、dmesg ...
從 apk 檔案安裝應用:
adb install example.apk
卸載應用:
adb uninstall [package]
從 apk 檔案擷取程式包名稱:aapt dump badging example.apk | grep "Package"
從裝置將檔案下載至電腦:
adb pull [path-on-device] [file]
從裝置將檔案上傳至電腦:
adb push [file] [path-on-device]
註:
Android 裝置上的大多數目錄僅支援讀取存取。 /sdcard (但是您無法從該目錄下運行程式)和 /data/local/tmp 支援寫入訪問。
啟動應用:
adb shell am start -n [package]/[activity]
運行指定活動。
您可以從 apk 檔案抽取活動名稱:
aapt dump badging example.apk | grep "launchable-activity"
讀取日誌
Logcat 是從 Android 裝置讀取日誌的命令。
Logcat 首頁:http://developer.android.com/tools/help/logcat.html
從裝置讀取日誌(按下 Ctrl-C 解除阻止):
adb logcat
清除裝置上的日誌緩衝:
adb logcat -c
將日誌緩衝轉儲到裝置上(顯示當前的緩衝內容,未阻止):
adb logcat -d
樣本:
1 |
adb logcat -c # clear the buffer log |
3 |
adb logcat -d > file.log # save the current contents of the log buffer to file.log |
使用 screencap 截取螢幕
screencap 公用程式將當前的螢幕內容儲存為圖形檔案:
1 |
adb shell screencap /sdcard/screen.png |
2 |
adb pull /sdcard/screen.png screen.png |
3 |
adb shell rm /sdcard /screen.png |
screencap 公用程式可在安裝了 Android 4.x 和更高版本的手機上使用。 在低於 Android 4.x 的版本上,您可以使用 monkeyrunner 來截取螢幕。
使用 ADB 運行 BASH 指令碼來測試應用
指令碼: app_test.sh
使用 MonkeyRunner 控制 Android 裝置monkeyrunner 工具可為指令碼提供控制 Android 裝置的 API。 您可以使用 monkeyrunner 編寫 Python* 指令碼來安裝、啟動 Android 應用,類比使用者操作,擷取並將其儲存至電腦。 Monkeyrunner 使用 Jython* 運行指令碼。
monkeyrunner 首頁和 API 參考: http://developer.android.com/tools/help/monkeyrunner_concepts.html
使用 monkeyrunner 讀取日誌
File log.py:
02 |
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice |
05 |
msg = device.shell('logcat -d') |
06 |
f_log = open(fn, 'at') |
09 |
f_log.write(msg.encode('utf-8')) |
11 |
device.shell('logcat -c') |
13 |
if __name__ == '__main__': |
14 |
device = MonkeyRunner.waitForConnection() |
15 |
device.shell('logcat -c') # Clear logs buffer |
17 |
log('example.log', device) # Write logs |
開始:
monkeyrunner log.py
指令碼將會把日誌寫入目前的目錄下名為“檔案樣本.log”的檔案。
使用 MonkeyRunner 捕捉
File screen.py:
2 |
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice |
4 |
if __name__ == '__main__': |
5 |
device = MonkeyRunner.waitForConnection() |
6 |
image = device.takeSnapshot() |
7 |
image.writeToFile('screenshot.png','png') |
開始:
monkeyrunner screen.py
指令碼捕捉並在目前的目錄下將其儲存為名為 filescreenshot.png 檔案。
樣本:使用 monkeyrunner 控制裝置
指令碼: monkeyrunner_test.py
開始:
monkeyrunner monkeyrunner_test.py
自動化的測試方法使用 Monkey* 進行測試試想將正在測試的裝置交給一隻非常敏捷且極富創造力的猴子 — Monkey(猴子)工具的設計便是類比這種情形。Monkey 工具是 Android SDK 的組成部分,可發送一連串的隨機使用者事件。命令列參數可指定使用者操作次數、每類事件的比率和程式包的名稱(因此,Monkey 的操作不會超出所測試應用的限度,且不會向地址簿中的任何連絡人發送 SMS)。
Monkey 首頁上提供了諸多樣本和參數列表: http://developer.android.com/tools/help/monkey.html
Monkey 工具的主要優點是零維護成本。 而且,壓力測試還可檢測出 non-trivial 漏洞。
使用 Monkey 工具進行測試的缺點: