一、常规的稳定性测试

测试背景:
这是一个海外的合作项目,被测程序是Android应用(App)。测试希望通过Monkey来模拟用户长时间的随机操作,检查被测应用是否会出现异常(应用崩溃或者无响应)。
测试脚本:
adb shell monkey -p com.xxx.xxx --pct-touch 40 --pct-motion 25 --pct-appswitch
10 --pct-rotation 5 -s 12358 --throttle 400 --ignore-crashes --ignore-timeouts
-v 500000
显而易见,这个Monkey测试的命令相比上一节提到的要复杂得多,主要是对一些操作事件做了限制,从而减少了Monkey伪随机化的无效操作。这体现在以下几个方面。

1)使用-p参数来制定测试应用的包名(Package)

因为被测程序是一个特定的Android应用程序,需要指定被测程序的包名。指定包名后,Monkey会根据包名找到对应的应用,并启动其main activity,然后执行Monkey测试。
技巧
查找应用包名的方法有很多,这里简单列举几个常用方法:
(1)通过pm命令查看。
在命令行窗口输入:
>adb shell
>pm list package
此时将列出手机上所有的应用包名,在列表中找到要测试的应用包名即可。
(2)通过查看APK源码下的AndroidManifest.xml文件。
(3)通过aapt命令查看。
(4)通过adb logcat抓取当前Android机运行的App的包名。

2)使用--pct-xxx参数限制Monkey执行的事件类型和占比

前面已经说了,这个测试的目的是希望模拟用户操作,因此需要让Monkey执行的事件尽可能地接近用户的常规操作,这样才可以最大限度地发现用户使用过程中可能出现的问题。因此需要对Monkey执行的事件百分比做一些调整。
触摸事件和手势事件是用户最常见的操作,所以通过--pct-touch和--pct-motion将这两个事件的占比调整到40%与25%;目标应用包含了多个Activity,为了能覆盖大部分的Activity,所以通过--pct-appswitch将Activity切换的事件占比调整到10%;被测应用之前在测试中出现过不少横竖屏之间切换的问题,这个场景也必须关注,因此通过--pct-rotation把横竖屏切换事件调整到10%。

3)使用-s参数来指定命令执行的seed值

Monkey会根据seed值来生成对应事件流,同一个seed生成的事件流是完全相同的。这里指定了seed值,是为了测试发现问题时,便于进行问题复现。

4)使用--throttle参数来控制Monkey每个操作之间的时间间隔

指定操作之间的时间间隔,一方面是希望能更接近用户的操作场景,正常用户操作都会有一定的时间间隔;另一方面也是不希望因为过于频繁的操作而导致系统崩溃,尤其是在比较低端的手机上执行测试时。因此通过--throttle设置Monkey每个操作固定延迟0.4秒。

5)使用--ignore-crash和--ignore-timeouts参数使Monkey遇到意外时能继续执行

在执行Monkey测试时,会因为应用的崩溃或没有响应而意外终止,所以需要在命令中增加限制参数--ignore-crash和--ignore-timeouts,让Monkey在遇到崩溃或没有响应的时候,能在日志中记录相关信息,并继续执行后续的测试。

6)使用-v指定log的详细级别

Monkey的日志输出有3个级别:默认的是level 0, -v -v日志级别为level 1, -v -v日志级别为level 2。日志的级别越高,其详细程度也越高。为了方便问题的定位,将日志级别设置为level2。
在常规的稳定性测试中,虽然可以自定义各种事件的操作占比,但毕竟是随机事件流。在实际测试过程中,难免会遇到Monkey点了我们不希望它点击的地方,比如误点了工具栏导致网络断开的情况等。当测试过程中Wi-Fi断开时,是否有可能自动重连呢?这在后面会讲到

二、自定义脚本的稳定性测试

常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景(执行固定的事件流)呢?这时候就需要用到自定义脚本了,Monkey支持执行用户自定义脚本的测试,用户只需要按照Monkey脚本的规范编写好脚本,存放到手机上,启动Monkey通过-f scriptfile参数调用脚本即可。
Monkey自定义脚本的编写模板如代码清单4-1所示。
代码清单4-1 Monkey自定义脚本的编写模板
#头文件,控制Monkey发送消息的参数,固定写即可
#脚本类型,一般不用更改
type=raw events
#脚本执行次数,但是由于Monkey命令本身可以指定执行次数,所以这里的设置是不生效的
count=10
#命令执行速率,速率也可以通过Monkey命令设置,这里的设置是不生效的
speed=1.0
#以下为Monkey命令
start data>>
LaunchActivity(pkg_name, cl_name)
DispatchPress(KEYCODE_HOME)
 
monkey脚本常见API
 
技巧
Monkey脚本只能通过坐标的方式来定位点击和移动事件的屏幕位置,这里就需要提前获取坐标信息。获取坐标信息的方法很多,最简单的方法就是打开手机中的开发人员选项,打开“显示指针位置”。随后,在屏幕上的每次操作,在导航栏上都会显示坐标信息
 
下面来看一个简单的例子:
这里要测试的是应用宝App,测试的操作是打开应用宝,点击输入框,输入“yyb”,点击搜索。搜索完成后,点击返回键返回应用宝首页。
首先,将在本地编写需要的测试脚本命名为monkey.script(文件格式无要求),脚本内容如代码清单4-2所示。
代码清单4-2 Monkey自定义脚本实现进入应用宝进行搜索
 
#启动测试
type = user
count = 49
speed = 1.0
start data >>
#启动应用宝
LaunchActivity(com.tencent.android.qqdownloader, com.tencent.assistant.activity.
SplashActivity)
UserWait(2000)
#点击搜索框
Tap(463,150,1000)
UserWait(2000)
#输入字母“yyb”
DispatchString(yyb)
UserWait(2000)
#点击搜索
Tap(960,150,1000)
UserWait(2000)
#点击返回键返回首页
DispatchPress(KEYCODE_BACK)
其次,将文件push到手机或模拟器的sdcard中:
>adb push monkey.script /sdcard/
最后,执行脚本:
>adb shell monkey -f /sdcard/monkey.script -v 1
 
如果需要重复执行某个脚本,只要在monkey启动命令中修改执行次数即可。例如
>adb shell monkey -f /sdcard/monkey.script -v 10
 

三、结合辅助命令,获取更多信息

常规测试只要记录下Monkey日志,再分析Monkey日志检查是否有异常即可。但是,很多时候,测试除了想知道执行过程是否有异常,还需要能获取执行过程中的一些详细信息或性能数据,比如想知道Monkey执行过程中是否存在内存泄漏,需要获取内存信息。这时候就需要借助一些辅助的命令来获取更多信息了。下面列举了几种Monkey测试中常用的辅助命令,使用方法也非常简单,只要在执行Monkey的同时,另起一个CMD命令行窗口输入对应命令执行即可。
❑ 获取logcat日志信息:
adb shell logcat -v time>log.txt
❑ 获取内存信息:
adb shell dumpsys meminfo <进程名>
❑ 获取CPU消耗信息:
adb shell top -n 1 |find“进程名”
❑ 获取电量信息:
adb shell dumpsys battery
❑ 获取GPU信息:
GPU信息命令:adb shell dumpsys gfxinfo <进程名>
❑ 获取流量信息:
adb shell cat/proc/uid_stat/<被测应用的uid>/tcp_rcv
技巧
如何获取被测应用的UID
步骤1:查看被测应用的进程ID(PID)
adb shell ps | grep <被测应用包名>
步骤2:查看被测应用的用户ID(UID)
adb shell cat /proc/$pid/status

四、Monkey测试策略制定思路

前面介绍了几种常见的Monkey测试方法,但在实际项目中,选择哪种Monkey测试策略,则需要根据实际项目的情况来做判断。主要是看测试目的及被测应用自身的特点。假如我们想测试浏览器的双指缩放功能是否有异常,那就需要选择--pct-pinchzoom参数,调大双指缩放事件的占比进行Monkey测试;假如我们想验证ROM的横竖屏切换功能是否正常,那就需要选择--pct-rotation参数,调大横竖屏切换事件的占比进行Monkey测试;假如我们想验证重复某种特定操作时,应用是否会存在异常,那可以选择-f参数,自定义Monkey脚本进行验证;假如我们想验证长时间操作时应用是否会存在内存泄漏,那就需要结合-hprof参数和dumpsys meminfo <进程名>进行Monkey测试。
总之,Monkey测试策略是需要依据测试目的和被测程序的特点来制定的。
 

Monkey框架(测试方法篇) - monkey测试实例的更多相关文章

  1. Monkey框架(测试方法篇) - monkey日志分析

    Monkey日志分析是Monkey测试中非常重要的一个环节,通过日志分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题.介绍日志 ...

  2. Monkey框架(基础知识篇) - monkey启动与参数介绍

    一.monkey启动 直接PC启动:> adb shell monkey [options] <count> shell 端启动:> adb shell >monkey ...

  3. 《手把手教你》系列基础篇(七十八)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 中篇(详解教程)

    1.简介 上一篇讲解了依赖测试的各种方法,今天继续讲解依赖测试的方法,这一篇主要是讲解和分享通过xml文件配置组名依赖方法( 主要是测试组的用法).废话不说,直接上干货. 2.实例 测试组:一个组可包 ...

  4. 《手把手教你》系列基础篇(七十七)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 上篇(详解教程)

    1.简介 今天主要是讲解和分享:TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用dependsOnMethods,testNG会自动根据@Test方法名称 ...

  5. 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)

    1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...

  6. 使用Monkey对apk做稳定性测试

    认识Monkey 官方文档:https://developer.android.com/studio/test/monkey.html 什么是Monkey? Monkey是Android中的一个命令行 ...

  7. Monkey小白入门篇

    一.monkey简介 中文名:猴子 职业:压力测试小工具 用途:对待测Android应用程序进行压力测试,测试app是否会crash Android官方描述: The Monkey is a prog ...

  8. JMeter学习篇(一):测试实例讲解

    1.JMeter的下载与安装 Jmeter官方下载地址:http://jmeter.apache.org/download_jmeter.cgi,下载jmeter是一个zip压缩包,解压后,直接运行a ...

  9. Java自动化测试框架-10 - TestNG之测试结果篇

    1.-测试结果 1.1-成功,失败和断言 测试被认为是成功的,如果它不引发任何异常完成,还是它扔的预期异常(请参阅文档expectedExceptions属性上找到的@Test注释). 您的测试方法通 ...

随机推荐

  1. 【开发工具】 - win10设置path变量怎样列表展示?

    如果你的变量值以%开头,打开编辑的时候就会显示一串的变量值,不方便查找编辑. 所以将变量值更改为以盘符开始,就可以解决这个问题,比如:D:\apache-maven-3.6.1\bin\

  2. python通过装饰器检查函数参数的数据类型的代码

    把内容过程中比较常用的一些内容记录起来,下面内容段是关于python通过装饰器检查函数参数的数据类型的内容. def check_accepts(f): assert len(types) == f. ...

  3. Unity shader error: “Too many texture interpolators would be used for ForwardBase pass”

    Unity shader error: "Too many texture interpolators would be used for ForwardBase pass" 解决 ...

  4. ffmpeg 把视频转换为图片

    ffmpeg -i "Tail of Hope.mp4" -r 1 -q:v 2 -f image2 pic-%03d.jpeg

  5. nodejs puppeteer linux(centos)环境部署以及用puppeteer简单截图

    1.安装Node环境 如果有安装Node请忽略第1点 #下载cd /usr/local/srcwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-l ...

  6. DELL R720针对磁盘故障面板信息误报解决

    现象: 面板报警信息显示 PDR1101 fault detected on drive 0. Check drive... 经查资料是磁盘故障的原因,而r720的idrac似乎我们没有安装,我不能通 ...

  7. 【转】移植vsftpd到arm linux

    vsftpd即very secure FTP daemon(非常安全的FTP进程),是一个基于GPL发布的类UNIX类操作系统上运行的服务器的名字(是一种守护进程),可以运行在诸如Linux.BSD. ...

  8. Python入门篇-functools

    Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.reduce方法 reduce方法,顾名思义就是减少 reduce(function,se ...

  9. Kotlin注解深入解析与实例剖析

    在上一次https://www.cnblogs.com/webor2006/p/11522798.html中学习了Kotlin注解相关的东东,这次继续对Kotlin的注解继续学习: 注解也可以拥有自己 ...

  10. steam游戏存档迁移

    之前玩的盗版guacamelee等着打折入正,今天入了,不想重新打了,就把存档从盗版迁移了一下. 盗版的目录是F:\Guacamelee\Profile\ALI213\Saves,该目录下又一个SAV ...