APP开发过程中,开人员往往自己做一些功能测试和稳定性测试,使用MonkeyTest做压力测试是常用方法,及时修复ANR、CRASH提高项目组整体的开发效率。

一、Monkey简介

Monkey是一种命令行工具,向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),这个工具存在于Android系统/system/framework/monkey.jar,Android设备/模拟器连接到PC后通过adb shell使用此工具,monkey测试流程如下。

monkey架构

因此两种方式使用monkey,第一种在PC端直接运行命令行:

1
adb shell monkey --[params]

第二种进入shell中使用:

1
2
3
adb shell

> shell@android: monkey --[params]

二、基本使用

使用如下命令进行monkey测试:

1
adb shell monkey -p org.blackist.modulize --throttle 100 -v -v 100 > test.log
  • -p org.blackist.modulize:测试包名为org.blackist.modulize
  • –throttle 100:每100ms发送一次事件
  • -v -v:指定日志级别
  • > test.log:输出日志到文件

如下是monkey日志中测试到的ANR和CRASH:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sleeping for 100 milliseconds
:Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
// CRASH: cn.edu.zstu.sdmp (pid 17698)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException: Attempt to invoke virtual method 'com.wuhenzhizao.titlebar.widget.CommonTitleBar cn.edu.zstu.sdmp.manage.view.ManageActivity.getCommonTitle()' on a null object reference
// Build Label: vivo/PD1603/PD1603:5.1.1/LMY47V/compiler07131528:user/release-keys
// Build Changelist: eng.compiler.20180713.152451
// Build Time: 1531466945000
// java.lang.NullPointerException: Attempt to invoke virtual method 'com.wuhenzhizao.titlebar.widget.CommonTitleBar cn.edu.zstu.sdmp.manage.view.ManageActivity.getCommonTitle()' on a null object reference
// at cn.edu.zstu.sdmp.manage.view.repair.RepairDetailFragment.initView(RepairDetailFragment.java:153)
// at cn.edu.zstu.sdmp.manage.view.repair.RepairDetailFragment.initViewAndData(RepairDetailFragment.java:113)
// at cn.edu.zstu.sdmp.common.base.BaseFragment.onCreateView(BaseFragment.java:135)
// at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
// at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
// at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
// at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
// at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
// at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
// at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
// at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
// at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
// at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
// at android.os.Handler.handleCallback(Handler.java:739)
// at android.os.Handler.dispatchMessage(Handler.java:95)
// at android.os.Looper.loop(Looper.java:135)
// at android.app.ActivityThread.main(ActivityThread.java:5418)
// at java.lang.reflect.Method.invoke(Native Method)
// at java.lang.reflect.Method.invoke(Method.java:372)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
//
// NOT RESPONDING: cn.edu.zstu.sdmp (pid 17698)
ANR in cn.edu.zstu.sdmp (cn.edu.zstu.sdmp/.manage.view.ManageActivity)
PID: 17698
Reason: Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it. Outbound queue length: 0. Wait queue length: 1.)

可以清楚分析出错误所在的地方,所以monkey是个物美价廉的测试工具啊~

三、参数说明

monkey工具参数如下(图片来源):

monkey参数

3.1 基础参数

-p <允许的包名列表>

用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果不指定包, monkey将允许系统启动设备中的所有app。

指定一个包:adb shell monkey -p org.blackist.modulize 100

指定多个包:adb shell monkey -p org.blackist.modulize –p org.blackist.brouter 100

-v

用亍指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下:

Level 0 : adb shell monkey -p org.blackist.modulize -v 100 // 缺省值,仅提供启动提示、测试完成和最终结果等少量信息

Level 1 : adb shell monkey -p org.blackist.modulize -v -v 100 // 提供较为详细的日志,包括每个发送到Activity的事件信息

Level 2 : adb shell monkey -p org.blackist.modulize -v -v -v 100 // 最详细的日志,包括了测试中选中/未选中的Activity信息

一般来说,使用Level0即可。

-s (随机数种子)

用亍指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。 示例:

monkey测试1:adb shell monkey -p org.blackist.modulize –s 101 100

monkey测试2:adb shell monkey -p org.blackist.modulize –s 101 100

这个参数其实比较重要,比如我们只看日志不容易确定错误位置,需要结合monkey的UI测试过程,这时需要执行相同的随机序列复现步骤。

–throttle (延时ms)

用亍指定用户操作(即事件)间的时延,单位是毫秒;如果不指定这个参数,monkey会尽可能快地生成和发送消息。 示例:

adb shell monkey -p org.blackist.modulize –throttle 3000 100

3.2 发送的事件类型

–pct-touch (点击事件)

参数percent为此事件的百分比,比如要求monkey完成10次点击事件:

1
adb shell monkey -p org.blackist.modulize -v --pct-touch 100 10

可以看到如下日志,Event percentages是事件百分比,点击事件100%,其余都是0:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
:Monkey: seed=1552849997195 count=10
:AllowPackage: cn.edu.zstu.sdmp
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 100.0%
// 1: 0.0%
// 2: 0.0%
// 3: 0.0%
// 4: -0.0%
// 5: 0.0%
// 6: 0.0%
// 7: 0.0%
// 8: 0.0%
// 9: 0.0%
// 10: 0.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=cn.edu.zstu.sdmp/.main.view.SplashActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=cn.edu.zstu.sdmp/.main.view.SplashActivity } in package cn.edu.zstu.sdmp

–pct-motion (动作事件)

–pct-trackball (轨迹球事件)

–pct-nav (基本导航事件,输入设备的上、下、左、右)

–pct-majornav (主要导航事件,兼容中间键,返回键,菜单按键)

–pct-syskeys (系统导航事件,HOME、BACK及拨号音量键)

–pct-appswitch (启动App事件)

–pct-anyevent (不常用事件)

–ignore-crashes (忽略崩溃事件 CRASH)

–ignore-timeouts (忽略超时事件 ANR)

日志分析

monkey test 执行后分析保存的日志,可以搜索CRASH、ANR、Exception等关键字查看错误信息,详细的日志分析参考http://www.cnblogs.com/wfh1988/archive/2010/11/16/1878224.html

参考

https://yuti.site/2019/03/02/MonkeyTesting/?tdsourcetag=s_pctim_aiomsg

https://www.cnblogs.com/TankXiao/p/4815134.html

https://blog.csdn.net/gzh0222/article/details/6631988

https://blog.csdn.net/viewsky11/article/details/53889143

https://www.cnblogs.com/TankXiao/p/4815134.html

https://blog.csdn.net/MTbaby/article/details/78792215

(完)