之前写过一篇关于稳定性测试的文章:
01
什么是稳定性测试
稳定性测试,是在一定压力的情况下,对系统或某个模块持续进行长时间的操作(一般遵循7*24小时原则),系统没有出现业务问题、业务异常、内存泄露溢出等性能问题,保证了系统的稳定性,说明稳定性测试是通过的。稳定性测试一般在业务测试、性能测试完成后再进行。
我们可以借助Monkey工具模拟用户操作进行稳定性测试。
02
Money是什么
Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行测试,检测程序多久的时间会发生异常。和MonkeyRunner几乎是完全不同的,MonkeyRunner相当于是搞自动化测试的了
官方介绍: https://developer.android.com/studio/test/monkey.html
03
Monkey的介绍
Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar
Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey
Monkey 命令启动方式:
04
Monkey架构
05
Monkey弱点
Monkey虽然可以根据一个指定的命令脚本发送按键消息,但不支持条件判断,不支持读取待测界面的信息来执行验证操作
06
Monkey的压力测试参数
那么这个option通常又分为4大类:
1、常用选项的参数通常有:
示例Level0: adb shell monkey -p com.swartz.cicada –v 100 说明:缺省值,仅提供启动提示、测试完成和最终结果等少量信息 相应源代码如图所示了,这十分有利于调试了 示例Level1: adb shell monkey -p com.swartz.cicada -v-v 100 说明:提供较为详细的日志,包括每个发送到Activity的事件信息 示例Level2: adb shell monkey -p com.swartz.cicada -v-v-v 100 说明:最详细的日志,包括了测试中选中/未选中的Activity信息
2、时间选项的参数通常有:
示例: Monkey测试1:adb shell monkey -p com.swartz.cicada –s 10 100 Monkey 测试2:adb shell monkey -p com.swartz.cicada –s 10 100
两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;
3、约束选项的参数通常有:
4、调试选项的参数通常有:
工作中为了保证测试数量的完整进行,我们一般不会在发生错误时立刻退出压力测试。
monkey 测试命令如下:
adb shell monkey -p com.swartz.cicada -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 10000 > E:\monkey_log\20170831.txt
例子:
adb shell monkey -p com.tpnet.hlquery --throttle 100--pct-touch50 --pct-motion 50 -v -v -v 1000 >c:\monkeytest.txt
测试com.tpnet.hlquery这个app,间隔100毫秒,50%的触摸事件,50% 的滑动事件,三个-v输出详细的日志,执行1000个事件,日志输出到c:\monkeytest.txt
ps: 命令运行前手机先解锁,win8 以上要用管理员身份打开cmd
07
Monkey的结果与分析
1、初步分析方法:
Monkey: seed=20 count=100 --随机种子和运行次数
:AllowPackage: com.swartz.cicada --指定的测试包 :IncludeCategory: android.intent.category.LAUNCHER --Category包含LAUNCHER :IncludeCategory: android.intent.category.MONKEY --Category包含MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER// + Using main activity com.swartz.cicada.LauncherActivity (from package com.swartz.cicada)// Selecting main activities from category android.intent.category.MONKEY --查询结果列表// Seeded: 20 --随机种子// Event percentages:// 15.0% --事件0 为touch事件,就是相当于按下之后弹起来的一个动作// 10.0% --事件1 为motion,相当于说从起始点到终点有移动了多少步,就是步骤数量 // 2.0% --事件2 为pinchzoom,为两个手指有同时按下去后,都向中间移动后up起来,相当于一个缩放的动作。// 15.0% --事件3 为trackball,为轨迹球事件 // -0.0% --事件4 为rotation 为屏幕旋转百分比隐藏事件// 25.0% --事件5 为nav导航事件,就是上下左右// 15.0% --事件6 为majornav主导航事件,会产生一些窗口的事件// 2.0% --事件7 为系统按键// 2.0% --事件8,app应用的打开就是用的这个事件// 1.0% --事件9,键盘的开,关// 13.0% --事件10,按键按下在弹起等动作 |
---|
日志结尾:
如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;Monkey finished代表执行完成。
(如果Monkey执行中断,在log的最后也能查看到当前已执行的次数。)
2、详细分析:
Monkey测试出现错误之后,一般的分析步骤分为以下几种:
3、查看Monkey里面错误前的一些事件动作,并手动执行该动作
如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间; // Monkey finished代表执行完成。
Monkey执行中断,在log的最后也能查看到当前的已经执行的次数。
08
Monkey测试中内存问题分析
1. 内存泄漏弹出out of memory对话框
09
–hprof 参数报告
adb shell monkey -p com.tpnet.hlquery --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkeytest.txt
如果指定了这个选项,monkey会在发送事件的前后生成app内存快照文件,一般会在设备的/dada/misc目录下生成hprof文件(ps: /data/misc/需要root权限)
拖进AndroidStudio即可查看
10
Monkey Script脚本制作
Monkey script是按照一定语法规则编写有序的用户事件流并且适用于monkey命令工具的脚本,可以用txt写。
脚本编写完毕放入手机的sdcard目录下,cmd中运行命令
adb shell monkey -f/sdcard/脚本名字 运行次数 |
---|
结合monkey的-v和–hhprof输出日志和性能报告
adb shell monkey --hprof -f/sdcard/*.txt -v -v -v 3 > c:\monkey.txt |
---|
一些脚本命令:
模版:
count = 1 // 下面这个 count 选项, monkey 并没有用到,可以忽略它