最近项目组要开展稳定性测试,找了一些monkey的资料学习,在这里做个笔记吧。
Monkey是Android系统自带的一款测试工具,通过它可以产生一些随机事件(例如,触摸、滑动、 按键等)来对设备中的apk测试稳定性、健壮性,以此来检测程序是否会发生异常(Crash、ANR)。
可以通过官网来学习monkey的使用:https://developer.android.com/studio/test/monkey
当然也可以直接通过命令,查看monkey的传参构成:
monkey参数说明
monkey的基本使用:
adb shell monkey -p com.example.test --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
对于上面使用的一些参数进行一下说明:
1.-p com.example.test :指定要测试的包名为com.mvp.demo的apk (-p可以用多次,表示指定测试的apk有多个,如果真的要多个apk,可以使用后面会提及的白名单功能);
2.--throttle 100:指定每次操作间隔100ms ;
3.-s 99999:表示生成一个随机事件的种子,可以指定一个值,使得每次执行的操作都是一样的,用于复现问题,如果不指定,执行的时候会随机分配一个值;
4.-v:表示monkey所产生的的log的信息类别,可以指定1-3个,3个表示log信息最全面;
5.100000:表示要执行的随机事件数。这个参数和前面的--throttle一起决定了执行时间,当然每个随机时间执行肯定还是需要一点耗时的,所以只能计算出最少执行时间,实际的时间只会更长;
6.monkey_test.log:表示将执行过程中的日志输出到这个指定文档中,可以是带目录的,不带目录就是默认目录。
然后说一下黑名单、白名单的使用方式。
当需要对较多apk一起联合测试的时候,可以使用白名单:
--pkg-whitelist-file /sdcard/whitelist.txt:在whitelist.txt中指定需要测试apk的包名,例如:
com.example.test
com.example.test2
whitelist.txt这个文档需要自己push到Android里面,当然直接去android里面键一个文档也是一样的。
当需求是除了某一些apk不参与测试,其他所有apk都要联合参与monkey测试时,可以使用黑名单,比较适合主机厂:
adb shell monkey --pkg-blacklist-file /adcard/blacelist.txt --throttle 100 -s 55555 -v -v -v 10000 > monkey_test.log
--pkg-blacklist-file /sdcard/blacklist.txt:在blacklist.txt中指定不需要测试apk的包名,格式和whitelist.txt一致。
这里需要注意的是,--pkg-whitelist-file和--pkg-blacklist-file不能同时使用。
monkey执行过程中的随机事件其实可以分成几大类,这几个大类是可以通过参数控制在总随机次数中的比例的,参数格式:
--pct-{事件类别} {事件类别百分比}
比如调整屏幕横竖切换的百分比:
adb shell monkey -p com.example.test --pct-rotation 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
比如调整触摸事件的百分比(触摸事件是指屏幕某处按下并抬起的操作):
adb shell monkey -p com.example.test --pct-touch 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
比如调整手势事件的百分比(手势事件是指在屏幕的某处按下、随机移动、抬起的操作,即直线滑动操作):
adb shell monkey -p com.example.test --pct-motion 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
比如调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键):
adb shell monkey -p com.example.test --pct-syskeys 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
比如调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法:
adb shell monkey -p com.example.test --pct-appswitch 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
比如调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击。现在的手机几乎没有轨迹球,但是轨迹球事件包含曲线滑动操作,如果被测程序需要曲线滑动时可以选用此参数):
adb shell monkey -p com.example.test --pct-trackball 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
比如调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成,由于现在很少手机带键盘的,因此用的较少):
adb shell monkey -p com.example.test --pct-nav 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
比如调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)
adb shell monkey -p com.example.test --pct-majornav 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
比如调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等:
adb shell monkey -p com.example.test --pct-anyevent 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
当然这些事件是可以同时指定多个的,例如:
adb shell monkey -p com.example.test --pct-anyevent 10 --pct-appswitch 10 --trottle 100 -s 55555 -v -v -v 10000 > monkey_test.log
只要各事件类型的百分比总数不能超过100就可以了。
还有一些忽略指定错误的命令最好有个了解,因为实际工作中monkey执行事件较久,apk比较容易遇到各种问题,monkey默认是遇到一些错误后不再执行剩下的随机事件的,这样遇到一个问题就处理一次会比较占用时间,最好是所有事件执行完,然后收集所有问题,在排查处理。
比如用于指定当应用程序崩溃时(Force& Close错误),Monkey是否停止运行,当添加这个参数时,即使应用程序崩溃,Monkey依然会发送事件(重新运行app来测试),直到事件计数完成:
adb shell monkey -p com.example.test --trottle 100 --ignore-crashes -s 55555 -v -v -v 10000 > monkey_test.log
比如用于指定当应用程序发生ANR(Application No Responding)错误时,Monkey是否停止运行:
adb shell monkey -p com.example.test --trottle 100 --ignore-timeouts -s 55555 -v -v -v 10000 > monkey_test.log
比如用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行:
adb shell monkey -p com.example.test --trottle 100 --ignore-security-exceptions -s 55555 -v -v -v 10000 > monkey_test.log
还有一些辅助用的参数,可以根据测试需要选择添加。
比如用于指定当应用程序发生错误时,是否停止其运行:
adb shell monkey -p com.example.test --trottle 100 --kill-process-after-error -s 55555 -v -v -v 10000 > monkey_test.log
比如用于指定是否监视并报告应用程序发生崩溃的本地代码:
adb shell monkey -p com.example.test --trottle 100 --monitor-native-crashes -s 55555 -v -v -v 10000 > monkey_test.log
我们平时使用monkey命令,用随机事件比较多,但是也可以通过参数-f来指定脚本来执行固定事件。monkey脚本中的事件都是通过坐标来实现的,所以在指定事件时,需要提前获取坐标信息。对于monkey自定义脚本感兴趣的同学,可以留言或者私信,这里就不展开了,因为用的的确是不多。
monkey还可以通过参数-hprof来查看测试过程中是否存在内存泄漏。不过Android studio的profiler也可以用来测试内存泄漏,在开发阶段其实就可以测试,没必要等到做稳定性测试的时候在去测试内存泄漏的问题。
执行完了monkey一般都会有一份执行日志,先看日志末尾:
//Monkey finished
如果是上面这个结尾,表示是正常结束,此次测试没有检测到异常。
** Monkey aborted due to error.
如果是上面这个结尾,表示出现了异常。
如果能在日志中搜索到CRASH关键字的内容,例如:
...
// CRASH: com.example.test(pid 10086)
...
则表示执行过程中apk遇到了crash。
如果能在日志中搜索到NOT RESPONDING关键字的内容,例如:
...
// NOT RESPONDING: com.example.test(pid 10086)
ANR in com.example.test(com.example.test/com.example.test.activity.MainActivity)
...
则表示执行过程中apk遇到了ANR。