android-Monkey压力测试

简介:

Monkey是一个运行在你的模拟器或设备上,并生成伪随机的用户事件流,如点击,触摸或手势,以及一些系统级事件的程序。你可以使用Monkey以随机但可重复的方式对您正在开发的应用程序进行压力测试。

选项

Monkey命令选项主要分为下面4个类别

  • 基本配置选项,例如设置要尝试的事件数量。
  • 操作上的限制,比如将测试限制在一个包中。
  • 事件类型和频率。
  • 调试选项。

基本使用

1
adb shell monkey [options] <event-count>

例如:adb shell monkey -p your.package.name -v 500

停止Monkey

1
2
adb shell ps | grep monkey
adb shell kill -9 (monkey进程id)

这里我们做一个简单的demo,故意在执行某些按钮时出错,然后执行Monkey命令,我们看一下log

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
:Monkey: seed=1521909354914 count=500
:AllowPackage: com.test.testmonkey
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: -0.0%
// 6: 25.0%
// 7: 15.0%
// 8: 2.0%
// 9: 2.0%
// 10: 1.0%
// 11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.test.testmonkey/.MainActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.test.testmonkey/.MainActivity } in package com.test.testmonkey
:Sending Trackball (ACTION_MOVE): 0:(-5.0,2.0)
:Sending Touch (ACTION_DOWN): 0:(663.0,1398.0)
:Sending Touch (ACTION_UP): 0:(675.4298,1380.5249)
:Sending Touch (ACTION_DOWN): 0:(131.0,904.0)
:Sending Touch (ACTION_UP): 0:(132.98947,909.7895)
:Sending Touch (ACTION_DOWN): 0:(1151.0,926.0)
:Sending Touch (ACTION_UP): 0:(1200.0,860.2331)
:Sending Touch (ACTION_DOWN): 0:(922.0,1108.0)
:Sending Touch (ACTION_UP): 0:(1042.3059,1175.9828)
:Sending Touch (ACTION_DOWN): 0:(1010.0,1630.0)
:Sending Touch (ACTION_UP): 0:(1008.4201,1648.7831)
:Sending Touch (ACTION_DOWN): 0:(403.0,295.0)
:Sending Touch (ACTION_UP): 0:(394.41992,296.91928)
:Sending Trackball (ACTION_MOVE): 0:(3.0,-5.0)
// CRASH: com.test.testmonkey (pid 14561)
// Short Msg: android.content.ActivityNotFoundException
// Long Msg: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.test.testmonkey/com.test.testmonkey.TestActivity}; have you declared this activity in your AndroidManifest.xml?
// Build Label: HUAWEI/M2/HWMozart:6.0/HUAWEIM2-803L/C233B216:user/release-keys
// Build Changelist: C233B216
// Build Time: 1491840570000
// android.content.ActivityNotFoundException: Unable to find explicit activity class {com.test.testmonkey/com.test.testmonkey.TestActivity}; have you declared this activity in your AndroidManifest.xml?
// at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805)
// at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
// at android.app.Activity.startActivityForResult(Activity.java:4030)
// at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
// at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
// at android.app.Activity.startActivityForResult(Activity.java:3984)
// at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:720)
// at android.app.Activity.startActivity(Activity.java:4314)
// at android.app.Activity.startActivity(Activity.java:4282)
// at com.test.testmonkey.MainActivity$1.onClick(MainActivity.java:17)
// at android.view.View.performClick(View.java:5264)
// at android.view.View$PerformClick.run(View.java:21297)
// at android.os.Handler.handleCallback(Handler.java:743)
// at android.os.Handler.dispatchMessage(Handler.java:95)
// at android.os.Looper.loop(Looper.java:150)
// at android.app.ActivityThread.main(ActivityThread.java:5546)
// at java.lang.reflect.Method.invoke(Native Method)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:682)
//
** Monkey aborted due to error.
Events injected: 82
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=812ms (0ms mobile, 0ms wifi, 812ms not connected)
** System appears to have crashed at event 82 of 500 using seed 1521909354914

这里我们可以看到Monkey遇到程序出错时会自动停下来,并且显示错误信息

命令选项

类别 选项 描述
一般      –help 打印使用帮助
-v 每一个 -v都增加输出信息的详细级别 默认级别为0
事件      -s 设置种子值,如果种子值相同,将会生成相同的事件 
–throttle 在事件之间增加延迟 
–pct-touch 调整触摸事件的百分比             
–pct-motion 调整滑动事件的百分比              
–pct-trackball 调整轨迹球事件的百分比。
–pct-nav 调整“基本”导航事件的百分比。
–pct-majornav 调整“主要”导航事件的百分比。
–pct-syskeys 调整“系统”关键事件的百分比。
–pct-appswitch 调整活动启动的百分比。
–pct-anyevent 调整其他类型事件的百分比。
约束      -p 指定一个或多个允许运行的软件包         
-c 指定类别                   
调试      –dbg-no-events Monkey将执行启动到测试活动中,不会生成任何其他事件
–hprof 将在Monkey事件序列之前和之后立即生成分析报告,谨慎使用
–ignore-crashes Monkey将执行完所有次数,即使碰到crash也不停止 
–ignore-timeouts 碰到应用响应超时也不停止            
–ignore-security-exceptions 忽略权限错误            
–kill-process-after-error 杀掉发生错误的进程          
–monitor-native-crashes 观察并报告Android系统发生的崩溃,如果设置了–kill-process-after-error,系统将停止
–wait-dbg     停止执行Monkey,直到调试器连接到它。