zoukankan      html  css  js  c++  java
  • Monkey框架(测试方法篇)

    一、常规的稳定性测试          

    测试背景:
    这是一个海外的合作项目,被测程序是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测试策略是需要依据测试目的和被测程序的特点来制定的。
     
  • 相关阅读:
    同余方程
    倒酒
    机器翻译
    vue 锚点定位
    解决vuex刷新页面数据丢失
    h5 input失去焦点软键盘把页面顶起
    js 监听ios手机键盘弹起和收起的事件
    js 将数组中的每一项安装奇偶重新组合成一个数组对象
    moment.js获取本周本月本年的开始日期和结束日期
    vue 所有的路由跳转加一个统一参数
  • 原文地址:https://www.cnblogs.com/Chilam007/p/10941064.html
Copyright © 2011-2022 走看看