zoukankan      html  css  js  c++  java
  • (三)monkey稳定性测试

    使用 Monkey 进行压力测试

    Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。

    简单用法

    adb shell monkey -p < packagename > -v 500 表示向 指定的应用程序发送 500 个伪随机事件。
    adb shell monkey –p com.htc.Weather –v 20000
    

    常见命令组合

    1.monkey -p com.package -v 500 :简单的输出测试的信息;
    2.monkey -p com.package -v -v -v 500 :以深度为三级输出测试信息;
    3.monkey -p com.package --port 端口号 -v :为测试分配一个专用的端口号,不过这个命令只能输出跳转的信息及有错误时输出信息;
    4.monkey -p com.package -s 数字 -v 500 :为随机数的事件序列定一个值,若出现问题下次可以重复同样的系列进行排错;
    5.monkey -p com.package -v --throttle 3000 500 : 为每一次执行一次有效的事件后休眠3000毫秒;
    

    Monkey参考命令

    adb shell monkey 
    -p com.tencent.XXX(替换包名) 
    --throttle 500 
    --ignore-crashes 
    --ignore-timeouts 
    --ignore-security-exceptions 
    --ignore-native-crashes 
    --monitor-native-crashes 
    -v -v -v 1000000>d:monkeyScreenLog.log
    

    Monkey参数的约束限制规范:

    1.一个 -p 选项只能用于一个包,指定多个包,需要使用多个 -p 选项;
    
    2.-s <seed> 伪随机数生成器的seed值,如果用相同的seed值再次运行monkey,它将生成相同的事件序列,对9个事件分配相同的百分比;
    Monkey测试1:adb shell monkey -p com.htc.Weather –s 10 100
    Monkey测试2:adb shell monkey -p com.htc.Weather –s 10 100 
    两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列 操作,即一个序列)是一样的。
    操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;
    
    3.-c 用此参数指定一个或多个类别,同样,需要指定多个类别就需要多个-c参数;
    常见的类别有
    Intent.category.LAUNCHER
    Intent.category.MONKEY
    
    4.-v 用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:
    日志级别 Level0
    示例 adb shellmonkey -p com.htc.Weather –v 100 
    说明 缺省值,仅提供启动提示、测试完成和最终结果等少量信息
    日志级别 Level 1
    示例 adb shell monkey -p com.htc.Weather –v -v 100 
    说明 提供较为详细的日志,包括每个发送到Activity的事件信息
    日志级别 Level 2
    示例 adb shell monkey -p com.htc.Weather –v -v –v 100
    说明 最详细的日志,包括了测试中选中/未选中的Activity信息
    
    4.--hprof
    指定了该参数,Monkey会在发送事件序列的前、后,生成性能分析报告。通常会在data/misc目录下生成一个5MB左右大小的文件
    
    5.--ignore-crashes
    通常情况下,monkey会在测试应用程序崩溃或者发生异常后停止运行,若指定了该参数,则monkey将会在产生异常后,继续向系统发送事件,直到指定事件全部运行完毕。
    
    6.--ignore-timeouts
    通常情况下,当应用程序发生任何超时错误(application  not  responding)时,monkey将停止运行。
    若指定了该参数,则monkey将会在产生错误信息后,继续向系统发送事件,直到指定事件全部运行完毕
    
    7.--ignore-security-exceptions    通常情况下,指定应用程序发生许可错误时(如证书许可,网络许可等),monkey将停止运行。
    若指定了该参数,即使应用程序发生许可错误,monkey会继续向系统发送事件,直到指定事件全部运行完毕。
    eg:adb shell monkey  --throttle  3000 --pct-trackball  50  -p  com.tencent.news  --ignore-security-exceptions  100 
    
    8.--throttle
    设定两个事件之间一个固定延迟,可以减缓monkey的执行速度。如果不指定,monkey将不会被延迟,事件将尽可能快地生成和发送消息。单位:毫秒  

    Monkey测试参数建议

    间隔时间:500毫秒;
    种子数:随机;
    遇到错误:不停止;
    执行时长:每机型不小于12小时或点击次数:100万次;
    机型覆盖建议:覆盖高中低端机型
    不同芯片平台(高通、海思、MTK等)
    不同分辨率(480*800以上主流分辨率)
    不同安卓版本(安卓4.0以上主流安卓版本);

    Monkey工具十一个事件

    //Monkey工具随机事件类型(seed值)
    [--pct-touch PERCENT] -0.触摸事件(down-up事件);
    [--pct-motion PERCENT] -1.动作事件(down-up事件和伪随机事件组成);
    [--pct-trackball PERCENT] -2.轨迹事件(随机移动、有时伴随点击);
    [--pct-nav PERCENT] -3.基本导航事件(导航事件来自方向输入设备的up、down、left、right组成);
    [--pct-majornav PERCENT] -4.主要导航事件(引发图形界面动作,如回退、菜单按键);
    [--pct-syskeys PERCENT] -5.系统按键事件(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键);
    [--pct-appswitch PERCENT] -6.调整启动Acticity百分比(在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法,从一个Activity跳转到另一个Activity);
    [--pct-flip PERCENT] -7.调整键盘翻转事件的百分比
    [--pct-anyevent PERCENT]	-8.其它类型事件(它包罗了所有其它类型的事件,如:按键、不常用的设备按钮等)
    
    --pct-touch  

    (空格后加数字)设定触屏事件生成的百分比。触屏事件是一个有手指按下,抬起事件的手势。
    eg:      adb shell monkey   --throttle  3000   --pct-touch  50  -p  com.tencent.news  1000 
    向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定触屏的事件占比为50%。

    --pct-motion

      设定滑动事件生成的百分比。滑动事件是一个先在某一个位置手指按下,滑动一段距离后再抬起手指的手势。
    eg:       adb shell monkey   --throttle  3000 --pct-motion  50  -p  com.tencent.news  1000 
    向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定滑动的事件占比为50%。

    --pct-trackball 

    设定轨迹球事件生成的百分比。轨迹球事件是包含一系列随机移动和单击事件的事件
    eg:adb shell monkey --throttle  3000 --pct-trackball  50  -p  com.tencent.news  100 
    向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定轨迹球的事件占比为50%。

    --pct-nav 

    设定基本导航事件生成的百分比。基本导航事件是模拟方向性在设备上输入向上、向下、向左、向右的事件。
    eg:adb shell monkey --throttle  3000 --pct-nav  40  -p  com.tencent.news  100 
    向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定基本导航事件的占比为40%。

    --pct-majornav 

    设定主要导航事件生成的百分比。主要导航事件通常会导致UI产生回馈信息,如单击Back键、Home键、Menu键等、
    eg:     adb shell monkey  --throttle  3000   --pct-majornav  40  -p  com.tencent.news  100 
    向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定主要导航事件的占比为40%。

    --pct-pinchzoom
    缩放事件:--pct-pinchzoom <percent>,指定缩放事件百分比。缩放事件指的是在屏幕上的两处同时按下,又同时移动,最后同时抬起,模拟我们在手机放大缩小的操作。
    例如adb shell monkey -p com.dsl.newwiki -v --pct-pinchzoom 50 100
    --pct-rotation

    屏幕旋转事件:--pct-rotation <percent>,指定屏幕旋转事件百分比。我们可以模拟手机的横竖屏切换,degree指的是旋转方向,顺时针旋转,0表示旋转90°,1表示旋转180°,2表示旋转270°,3表示旋转360°。例如adb shell monkey -p com.dsl.newwiki -v --pct-rotation 50 100

    --pct-syskeys
    系统按键事件:--pct-syskeys <percent>,指定系统按键百分比。系统按键指的是系统保留的按键事件,比如Home键、返回键、音量调节按键等。例如adb shell monkey -p com.dsl.newwiki -v --pct-syskeys 50 100
    --pct-appswitch
    切换Activity事件:--pct-appswitch <percent>,指定切换Activity事件百分比。
    切换Activity指的是在手机上启动一个Activity的操作,在随机的时间间隔内, Monkey 将执行一个 startActivity() 方法, 作为最大程度上覆盖被测包中全部 Activity 的一种方法。
    如果该事件比例偏低,我们会看到大部分时间的测试都停留在同一个页面上,所以我们可以适当设置该事件的比例。例如adb shell monkey -p com.dsl.newwiki -v --pct-appswitch 50 100
    --pct-flip 
    键盘事件:--pct-flip <percent>,指定键盘事件百分比。键盘事件指的是一些与键盘相关的操作,比如点击输入框、键盘弹起等。例如adb shell monkey -p com.dsl.newwiki -v --pct-flip 50 100
    --pct-anyevent

    其他类型事件:--pct-anyevent <percent>,指定其他类型事件百分比。其他类型事件指的是除了上述事件之外的其他事件,比如其它不常用的设备按钮等。

    一般情况下,我们不用修改上述事件的百分比。如果APP操作触摸事件和滑动事件比较频繁,我们可以提高这两种事件的百分比,但是总量加起来不能大于100。例如adb shell monkey -p com.dsl.newwiki -v --pct-touch 40 --pct-motion 40 100

    调试:--dbg-no-events

    设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不 会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约 束、以及一个保持Monkey运 行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。

    --kill-process-after-error

    通常,当Monkey由于一个错误而停止时,出错的应用程序将继续处于运行状态。当设置了此选项时,将会通知系 统停止发生错误的进程。注意,正常的(成功的)结束,并没有停止启动的进程,设备只是在结束事件之 后,简单地保持在最后的状态。

    --monitor-native-crashes

    监视并报告Android系统中本地代码的崩溃事件。如果设置了--kill-process-after-error, 系统将停止运行。

    --wait-dbg

    停止执行中的Monkey,直到有调试器和它相连接。

    测试可以发现的问题

    Android平台应用程序可能产生以下四种Crash:
    App层(JAVA应用程序):

    1、Force Close Crash :强制关闭,强制退出
    2、ANR Crash :程序无响应
    3、Native层(本地框架):Tombstone Crash(Native Crash) :闪退问题
    4、Kernel层(LINUX内核空间):Kernel Panic:内核崩溃  

    Monkey的日志分析

    1、按关键字进行搜索,ANR、Exception、Crash、Error。 
    2、找到有问题的地方,查看上下文信息。 
    3、注意第一个switch上下文信息。 
    4、查看monkey里面出错前的一些事件动作,可以手动执行该动作。
    5、进行问题复现,可以使用之前执行的monkey命令在执行一遍,注意seed值要一样。

    【测试结果分析】

    (1)、ANR问题(程序无响应):在日志中搜索“ANR"(application no response)
    (2)、闪退问题:在日志中搜索"crash"
    (3)、异常:搜索"exception"
    (4)、强制退出:搜索"force closed" 

    Crash专项

    1、安装可以引起Crash的App
    2、执行压力命令
    3、析取Crash的Exception信息
    案例: 执行压力测试,并且生成monkey_test.log日志文件。
    #adb shell monkey -p cn.besttest.crashtest -v 100 >E:monkeymonkey_test.log 
    #查看E盘文件夹下已经生成了monkey_test.log。 

    ANR专项

    步骤同上
    1、安装可以引起ANR的App
    2、执行压力命令
    3、析取ANR的Exception信息
    4、查看monkey的log 
    5、/data/anr/traces.txt
    6、查看logcat日志 ANR

    Monkey日志定位问题

    1 .典型Monkey测试日志文件输出,如下:


    //主要Log文件说明

    anr目录:从手机/data/anr导出的日志,保存发生anr crash 时的相关信息;
    dontpanic目录:从手机/data/dontpanic/导出的日志,保存发生Kernel Panic时的相关信息;
    Tombstone目录:从手机/data/tombstones/导出的日志,保存发生Tombstone Crash时的错误信息;
    dropbox目录:从手机/data/tombstones/导出的日志,经过dropbox服务截取的部分tombstones错误信息;
    BugReportLog.log:通过adb shell bugreport命令提取的系统各种信息;
    MonkeyScreenLog.Log:保存Monkey测试过程、应用层错误信息,发生Native Crash时,在此文件也会有记录;  

    2 .通过日志定位问题步骤

    (1) 在MonkeyScreen.Log日志文件搜索关键词"Fatal"、"Crash"、"ANR"定位到发生Crash的详细堆栈信息,或分析发生Crash前后的日志事件;

    (2)检查dropbox目录下是否有相关crash日志信息,主要关注是否有以下4类crash错误信息:data_app_wtf,data_app_anr,data_app_crash,system_server_watchdog,如图:

    (3) 检查tombstone目录是否有生成日志,有的话说明发生过native crash,如图:

    (4)通过anr目录中的日志文件或BugReport.log日志文件,进一步分析问题原因;
    (5)通过上述日志信息,结合代码分析或通过搜索引擎寻找对应问题的可能错误,定位解决问题。

    如有ANR还需要将 data/anr 下的trace 文件pull 出来辅助分析ANR原因。

    导出ANR 文件的命令如下:

    adb pull data/anr .

    停止monkey测试的方法

    1.查看monkey进程,然后kill掉

    查看手机monkey进程的命令adb shell ps |findstr monkey, 通过稍等进程 idadb shell kill -9 18333(monkey进程ID)),实现停止monkey测试,适用于debug版本。

    C:UsersAdministrator>adb shell ps |findstr monkey
    shell     18333 273   1627720 34672 binder_thr 759b3b8884 S com.android.commands.monkey
    
    C:UsersAdministrator>adb shell kill -9 18333
    

    2.重启手机

     此种方案简单暴力,原理也是杀掉monkey 进程,适用于user版本 

  • 相关阅读:
    CSS Nginx
    1 HTML入门
    Vue 高级使用
    Ajax快速入门
    JQuery快速入门
    02_Linux
    linux如何修改文件夹所属用户名和用户组
    max7219 八位数码管
    cmake qt hello word
    gcc section 标记
  • 原文地址:https://www.cnblogs.com/lvchengda/p/13161564.html
Copyright © 2011-2022 走看看