.1、環境配置
MONKEY測試使用的是ADB命令,因此只需要配置ADB環境即可。
2、測試准備與執行
在Monkey測試前,必須進行以下准備
Ø 手機屏幕超時設置為30分鍾或者永不超時,防止手機進入鎖屏狀態。
Ø 插入SIM卡和存儲卡后將手機開機,開啟開發者模式,開啟ADB模式,連接到PC(存儲卡剩余空間盡量留大,建議1G以上)
Ø 在PC上執行 運行—>CMD,在彈出的命令窗口中,輸入adb devices,檢查設備是否連接
這一步很多人會遇到連接不上設備,解決方法如下:
一、檢查開發者選項USB調試是否開啟
二、重新插拔USB看是否有授權提示
三、重啟adb
-
-
adb kill-server
-
adb start-server
-
四、添加設備ID至電腦文件中adb_usb.ini
- adb_usb.ini文件位置:Win(C:\Users\Administrator\.android\)、Mac(/Users/user/.android/)、linux(/root/.android/)
- Win獲取(USB連接設備以后查看控制面板->系統->設備管理器->Android Phone->設備名稱->詳細信息->硬件ID->VID)
Ø 在彈出的命令窗口中,輸入adb shell,進入Linux Shell
Ø 輸入常用的 Monkey命令。如下:
問題: 如何獲取APP的package?
1.CMD命令模式下,切到目錄(build-tools下),
以本人的為例 D:\AndroidTest\android-sdk_r24.4.1-windows\android-sdk-windows\build-tools\28.0.0
2.執行: aapt dump badging E:\apk\app-release.apk
3.從獲取的信息中copy (一個是啟動的activity,安卓編程初始化用到,一個是packageName ,monkey用到):
launchable-activity: name='com.XXXXX.hamapp.MainActivity'
package: name='com.XXXXXX.hamapp.test' versionCode='100' versionName='1.0.0' platformBuildVersionName='8.1.0'
monkey -p com.XXXXXX.hamapp.test --ignore-crashes --ignore-timeouts --ignore-native-crashes --pct-touch 20 -s 1 -v -v --throttle 200 100000 2>/sdcard/error.txt 1>/sdcard/info.txt |
|
參數 |
描述 |
-p com.lenovo.ideafriend |
只僅針對特定包名進行測試 |
--ignore-crashes |
忽略應用程序崩潰(Force & Close錯誤),繼續發送執行事件,直到事件數執行完成 |
--ignore-timeouts |
忽略應用程序發生ANR(Application No Responding)錯誤時,直到事件數執行完成 |
--ignore-native-crashes |
忽略本地應用程序發生奔潰,直到事件數執行完成 |
--pct-touch 20 |
調整觸摸事件為30%。即整個事件過程中觸摸事件占20% |
-s 1 |
偽隨機數生成器seed值。Seed值為1。相同的seed值再次執行monkey,將產生相同的事件序列。 |
-v -v |
日志級別為Leve1 1。將提供較為詳細的日志,包括每個發送到Activity的事件信息 |
--throttle 200 |
事件之間延時200毫秒。可以控制monkey的執行速度,如果不指定該選項,monkey事件間將不會延時。 |
10000 |
執行事件數為1萬次 |
2>/sdcard/error.txt |
Leve1 2日志保存到sdcard上的error.txt中 |
1>/sdcard/info.txt |
Leve1 1日志保存到sdcard上的info.txt中 |
3、結果檢查與分析
測試結束后,需要將手機連接PC,拷貝以下文件:
Ø info.txt:此文件在手機上的SDCARD中,主要記錄了MONKEY測試時發送的各種事件,如觸摸事件的位置等等。
Ø error.txt:此文件在手機上的SDCARD中,主要記錄了MONKEY測試時產生的一些ANR、強制關閉等異常。
Ø LOG文件:此文件在手機上的LOG文件夾中中,主要主要記錄程序對MONKEY測試時的響應情況。
Ø 將手機里面的monkey log文件拉取到電腦
adb pull /sdcard/error.txt E:\monkeyLog\error1.txt
adb pull /sdcard/info.txt E:\monkeyLog\info1.txt
我們需要對這2個文件進行分析整理,以便提交開發人員處理。
如何分析?
1. 在error.txt 文件里面搜索關鍵字----ANR, crash, Exception 然后將相關的上下文內容copy到BUG描述,如下:
// CRASH: com.luojilab.player (pid 13876)
// Short Msg: java.lang.IllegalStateException
// Long Msg: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.luojilab.player.action.INIT cmp=com.luojilab.player/com.luojilab.base.application.LauncherService }: app is in background uid UidRecord{e2c6761 u0a147 RCVR idle procs:1 seq(0,0,0)}
// Build Label: HUAWEI/FLA-AL10/HWFLA-H:8.0.0/HUAWEIFLA-AL10/131(C00):user/release-keys
// Build Changelist: 131(C00)
// Build Time: 1522683921000
// java.lang.RuntimeException: Unable to create application com.luojilab.base.application.LuojiLabApplication: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.luojilab.player.action.INIT cmp=com.luojilab.player/com.luojilab.base.application.LauncherService }: app is in background uid UidRecord{e2c6761 u0a147 RCVR idle procs:1 seq(0,0,0)}
// at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6532)
// at android.app.ActivityThread.-wrap2(Unknown Source:0)
// at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1963)
// at android.os.Handler.dispatchMessage(Handler.java:108)
// at android.os.Looper.loop(Looper.java:166)
// at android.app.ActivityThread.main(ActivityThread.java:7425)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
// Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { act=com.luojilab.player.action.INIT cmp=com.luojilab.player/com.luojilab.base.application.LauncherService }: app is in background uid UidRecord{e2c6761 u0a147 RCVR idle procs:1 seq(0,0,0)}
// at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1701)
// at android.app.ContextImpl.startService(ContextImpl.java:1657)
// at android.content.ContextWrapper.startService(ContextWrapper.java:644)
// at com.luojilab.base.application.LauncherService.start(SourceFile:48)
// at com.luojilab.business.welcome.a.a(SourceFile:129)
// at com.luojilab.base.application.LuojiLabApplication.onCreate(SourceFile:112)
// at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1122)
// at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6517)
// ... 8 more
2. 在info.text 里面搜exception ,然后搜索上下文的switch(兩個switch之間是一個操作組,如果出現了exception證明出現了崩潰),如下:
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.XXXXXe.hamapp.test/com.evergrande.hamapp.MainActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.evergrande.hamapp.test/com.evergrande.hamapp.MainActivity } in package com.XXXXX.hamapp.test
:Sending Flip keyboardOpen=false
Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed
Sleeping for 200 milliseconds
4、殺monkey進程與其他
如果想中斷運行中的monkey CTRL+C
adb shell ps | grep monkey 返回進程號
adb shell kill [剛才查到的進程號]
app包名查看:
a.手機安裝包名查看器'
b.aapt命令 aapt dump badging *.apk
c、源碼下的AndroidManifest.xml文件查看
d.adb logcat抓取當前Android機運行的app的包名( I/ActivityManager(數字): Displayed 包名/類
名: +ms )
命令行輸入 adb logcat >e:\bag.txt
手機操控app,ctrl+c停止
去e:\bag.txt這個文件下搜索關鍵字如Displayed ,一般都能找到
參考資料:
【1】Monkey官網
http://developer.android.com/tools/help/monkey.html
【2】百度文庫 Monkey測試介紹
http://wenku.baidu.com/view/476c79b8fd0a79563c1e72b6.html
【3】 monkey 自動化開源工具:
-
swiftmonkey
https://github.com/zalando/SwiftMonkey
因其直接使用了 蘋果的私有api 如XCEventGenerator.tapAtTouchLocations 故執行速度極快。同時也用類似android monkey的事件生成機制,自身源源不斷的產生如 tap,swipe,pinchIn等事件使其對被測app產生了極大的壓力
缺點:需要插樁 -
XCTestWD
https://github.com/macacajs/XCTestWD
類似facebook wda的方式,在xcode中執行xcuitest時啟動一個監聽server,可通過外部發送命令來創建待測app對應session並啟動app,同時也實現了dump tree 和依據xpath,id等來定位某個控件並操作這些控件 -
Fastmonkey
Xcode9.0(https://github.com/zhangzhao4444/Fastmonkey)
Xcode8.3(https://github.com/zhangzhao4444/Fastmonkey/tree/xcode8.3)
結合兩者優點並改造兩者,在XCTestWD基礎上實現一個server路由,外部命令時可引導啟動app 並執行monkey