一、簡(jiǎn)介
monkey testing,也有人叫做搞怪測(cè)試。就是用一些稀奇古怪的操作方式去測(cè)試被測(cè)試系統(tǒng),以測(cè)試系統(tǒng)的穩(wěn)定性。monkey test,一般指這樣的測(cè)試活動(dòng),用毫無(wú)規(guī)律的指令或操作使用被測(cè)系統(tǒng),觀察系統(tǒng)的穩(wěn)定性和容錯(cuò)性能。
二、原理
Monkey測(cè)試是Android自動(dòng)化測(cè)試的一種手段,Monkey測(cè)試本身非常簡(jiǎn)單,就是模擬用戶的按鍵輸入,觸摸屏輸入,手勢(shì)輸入等,看設(shè)備多長(zhǎng)時(shí)間會(huì)出異常。
當(dāng)Monkey程序在模擬器或設(shè)備運(yùn)行的時(shí)候,如果用戶觸發(fā)了比如點(diǎn)擊,觸摸,手勢(shì)或一些系統(tǒng)級(jí)別的事件的時(shí)候,它就會(huì)產(chǎn)生隨機(jī)脈沖,所以可以用Monkey用隨機(jī)重復(fù)的方法去負(fù)荷測(cè)試你開發(fā)的軟件.
三、特點(diǎn)
- 基于Android測(cè)試開發(fā)環(huán)境
- 需要獲取對(duì)應(yīng)程序包
- 一般是產(chǎn)品穩(wěn)定后,或者首輪功能測(cè)試完成后進(jìn)行Monkey測(cè)試
- Monkey測(cè)試的操作事件是隨機(jī)進(jìn)行,而不是刻意指定
- 主要測(cè)試產(chǎn)品是否存在崩潰問(wèn)題和ANR問(wèn)題
四、獲取包名的方法
向開發(fā)人員索取應(yīng)用程序包名
-
adb命令獲取包名
直接獲取當(dāng)前開啟應(yīng)用的包名
adb shell dumpsys activity | find "mFocusedActivity"
結(jié)果:
mFocusedActivity: ActivityRecord{15300bd2 u0 com.tencent.mm/.ui.LauncherUI t3}
注意:改命令在Android 8.0之下可以使用,8.0以上會(huì)存在問(wèn)題,修改命令如下即可:
adb shell dumpsys activity | find "mResumeActivity"
- adb logcat獲取包名,命令如下:
adb shell "logcat | grep START"
如果,無(wú)法獲取,首先,檢查設(shè)備是否連接成功,然后命令進(jìn)入shell,再獲取包名
adb shell
接著,輸入命令:
# logcat | grep START
然后,在手機(jī)或者模擬器中打開想要獲取的應(yīng)用程序,接著在adb命令行中會(huì)自動(dòng)獲取到對(duì)應(yīng)的程序包名。

- 從data數(shù)據(jù)中獲取包名
首先,是進(jìn)行shell
adb shell
然后,再找到shell中的data文件夾
root@shamu:/ # cd data
root@shamu:/data # ls
再找到data文件夾下的data文件
root@shamu:/data # cd data
root@shamu:/data/data # ls
結(jié)果,就可以查看到手機(jī)中安裝的所有應(yīng)用程序包名:

五、基本語(yǔ)法
# -p:packageName
# -v:日志級(jí)別,顯示程序的執(zhí)行測(cè)試反饋信息
# 100:事件數(shù)
adb shell monkey -p 包名 -v 100
六、日志級(jí)別
參數(shù): -v 用于指定反饋信息級(jí)別(信息級(jí)別就是日志的詳細(xì)程度),總共分3個(gè)級(jí)別。
分別對(duì)應(yīng)的參數(shù)如下表所示:
- 日志級(jí)別 Level0
adb shell monkey -p 包名 –v 100
說(shuō)明 缺省值,僅提供啟動(dòng)提示、測(cè)試完成和最終結(jié)果等少量信息
- 日志級(jí)別 Level 1
adb shell monkey -p 包名 –v -v 100
說(shuō)明 提供較為詳細(xì)的日志,包括每個(gè)發(fā)送到Activity的事件信息
- 日志級(jí)別 Level 2
adb shell monkey -p 包名 –v -v –v 100
說(shuō)明 最詳細(xì)的日志,包括了測(cè)試中選中/未選中的Activity信息
七、偽隨機(jī)數(shù)生成器
應(yīng)用場(chǎng)景:在測(cè)試時(shí),發(fā)現(xiàn)程序有bug,那么可以通過(guò)此方法,復(fù)現(xiàn)bug。因?yàn)榧?s后,monkey執(zhí)行的操作將會(huì)固定,若不加-s那么monkey的操作將會(huì)隨機(jī)進(jìn)行。
參數(shù): -s 用于指定偽隨機(jī)數(shù)生成器的seed值,如果seed相同,則兩次Monkey測(cè)試所產(chǎn)生的事件序列也相同的。 示例:
Monkey測(cè)試1:
adb shell monkey -p 包名 –s 10 1000
Monkey 測(cè)試2:
adb shell monkey -p 包名 –s 10 1000
兩次測(cè)試的效果是相同的,因?yàn)槟M的用戶操作序列(每次操作按照一定的先后順序所組成的一系列 操作,即一個(gè)序列)是一樣的。
操作序列雖然是隨機(jī)生成的,但是只要我們指定了相同的Seed值,就可以保證兩次測(cè)試產(chǎn)生的隨機(jī)操作序列是完全相同的,所以這個(gè)操作序列偽隨機(jī)的。
八、事件類型
- --pct-touch:指定觸摸事件的百分比,如:--pct-touch 5
- --pct-motion (滑動(dòng)事件)
- --pct-trackball (軌跡球事件)
- --pct-nav (導(dǎo)航事件 up/down/left/right)
- --pct-majornav (主要導(dǎo)航事件 back key 、 menu key)
- --pct-syskeys (系統(tǒng)按鍵事件 Home 、Back 、startCall 、 endCall 、 volumeControl)
- --pct-appswitch (activity之間的切換)
- --pct-anyevent (任意事件)
九、ANR日志導(dǎo)出
Android系統(tǒng)的ANR日志存放在/data/anr/traces.txt中,其中包含應(yīng)用程序每個(gè)線程堆棧信息。測(cè)試人員或者開發(fā)人員可以根據(jù)這個(gè)信息定位bug。ANR日志文件traces.txt導(dǎo)出手機(jī)操作如下:
- 首先進(jìn)入shell
adb shell
- 然后,復(fù)制ANR日志文件traces.txt至具有讀寫操作的文件中
cp /data/anr/traces.txt /sdcard/traces.txt
- 最后,pull命令導(dǎo)出至計(jì)算機(jī)
adb pull /sdcard/traces.txt
十、Crash日志導(dǎo)出
執(zhí)行壓力測(cè)試,并且生成monkey_test.log日志文件。
adb shell monkey -p cn.besttest.crashtest -v 100 >D:\monkey\monkey_crash.log
查看E盤文件夾下已經(jīng)生成了monkey_crash.log。
十一、結(jié)果分析
- 按關(guān)鍵字進(jìn)行搜索,ANR、Exception、Crash、Error。
ANR問(wèn)題(程序無(wú)響應(yīng)):在日志中搜索“ANR"(application no response)
閃退問(wèn)題:在日志中搜索"crash"
異常:搜索"exception"
強(qiáng)制退出:搜索"force closed"
- 找到有問(wèn)題的地方,查看上下文信息。注意第一個(gè)switch上下文信息。
- 查看monkey里面出錯(cuò)前的一些事件動(dòng)作,可以手動(dòng)執(zhí)行該動(dòng)作。
- 進(jìn)行問(wèn)題復(fù)現(xiàn),可以使用之前執(zhí)行的monkey命令在執(zhí)行一遍,注意seed值要一樣。