2018-05-03 Monkey 测试方法

一、Monkey 测试实例

1、常规的稳定性测试

测试背景:
被测程序是 Android 应用( App ),测试希望通过 Monkey 来模拟用户长时间的随机操作,检查被测应用
是否会出现异常(应用崩溃或者无响应):

adb shell monkey -p com.mysteel.android.steelphone --pct-touch 25 --pct-motion 20 --pct-appswitch 25 --pct-syskeys 20  --pct-flip 10   -s 13 --throttle 400 --ignore-crashes --ignore-timeouts -v 100000 >D:\test01.txt

日志:


图片.png

以上代码中,主要是对一些操作事件做了限制,从而减少了 Monkey 伪随机化的无效操作:
(1)使用 -p 参数来制定测试应用的包名( Package ):
因为被测程序是一个特定的 Android 应用程序,需要指定被测程序的包名。指定包名后, Monkey 会根据包名找到对应的应用,并启动其 main activity ,然后执行 Monkey 测试。
注:查找应用包名的方法

  • 在命令行窗口输入:
>adb shell
>pm list package

此时将列出手机上所有的应用包名,在列表中找到要测试的应用包名即可。

  • 通过 adb logcat 抓取当前 Android 机运行的 App 的包名:
    1、打开APP;
    2、执行> adb logcat>D:/log.txt;
    3、乱的对APP做一些操作;
    4、Ctrl+c 结束adb命令;
    5、打开log.txt文件,搜索:Displayed :


    图片.png

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

  • 触摸事件、手势事件、返回事件是用户最常见的操作,所以通过 --pct-touch 、--pct-motion 和--pct-syskeys将这两个事件的占比调整到 一定的百分比(如:25%、20%、20%);
  • 目标应用包含了多个 Activity ,为了能覆盖大部分的 Activity ,所以通过 --pct-appswitch 将 Activity 切换的事件占比调整到25%;
  • 键盘事件调整比例为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 的详细级别

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

常规 Monkey 测试执行的是随机的事件流,但如果只是想让 Monkey 测试某个特定场景(执行固定的事件流)呢?这时候就需要用到自定义脚本了, Monkey 支持执行用户自定义脚本的测试,用户只需要按照 Monkey 脚本的规范编写好脚本,存放到手机上,启动Monkey 通过 -f scriptfile 参数调用脚本即可,例如:
应用宝 App ,测试的操作是打开应用宝,点击输入框,输入 “yyb” ,点击搜索,搜索完成后,点击返回键返回应用宝首页:

# 启动测试
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)

图片.png

图片.png

注:Monkey 脚本只能通过坐标的方式来定位点击和移动事件的屏幕位置,这里就需要提前获取坐标信息。获取坐标信息的方法很多,最简单的方法就是打开手机中的开发人员选项,打开 “ 显示指针位置 ” 。随后,在屏幕上的每次操作,在导航栏上都会显示坐标信息。

完整例子:

qidong.txt:

#启动测试
type = user
count = 49
speed = 1.0
start data >>
#启动我的钢铁手机版
LaunchActivity(com.mysteel.android.steelphone,com.mysteel.android.steelphone.ui.activity.IntroActivity)
UserWait(6000)
#点击报告板块
Tap(430,2500,1000)
UserWait(2000)
#退出手机版
DispatchPress(KEYCODE_BACK)
DispatchPress(KEYCODE_BACK)

图片.png

将文件 push 到手机或模拟器的 sdcard 中:
D:\tomcat>adb push qidong06_boqi.txt /sdcard/
图片.png

执行脚本:

adb shell monkey -f /sdcard/qidong06.txt  -v-v-v 10 >D:\test03.txt

日志:


图片.png

如果需要重复执行某个脚本,只要在 Monkey 启动命令中修改执行次数即可。

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

常规测试只要记录下 Monkey 日志,再分析 Monkey 日志检查是否有异常即可。但是,很多时候,测试除了想知道执行过程是否有异常,还需要能获取执行过程中的一些详细信息或性能数据,比如想知道 Monkey 执行过程中是否存在内存泄漏,需要获取内存信息。这时候就需要借助一些辅助的命令来获取更多信息了。下面列举了几种 Monkey 测试中常用的辅助命令,使用方法也非常简单,只要在执行 Monkey 的同时,另起一个 CMD 命令行窗口输入对应命令执行即可。

1)获取 logcat 日志信息:
adb shell logcat -v time>log.txt
2)获取内存信息:
adb shell dumpsys meminfo "包名"/进程ID
例如:
adb shell dumpsys meminfo "com.mysteel.android.steelphone"
adb shell dumpsys meminfo 14640

图片.png

这里得到的信息非常多,重点关注如下几个字段:
a、Native/Dalvik 的 Heap 信息:
它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。Dalvik Heap就是常说的堆内存,Dalvik Heap不能超过最大限制;超过单个程序内存的最大限制时,就可能出现OOM(内存溢出)。
b、Total 的 PSS 信息:
PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存),这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大。
延伸:
(1)通过系统文件dumpsys来获取,可看到所有进程的内存信息,命令如下:
adb shell dumpsys meminfo
图片.png

(2) 查看指定进程的内存信息,命令如下:

adb shell dumpsys meminfo $pakagename or $Pid
例如:
adb shell dumpsys meminfo "com.mysteel.android.steelphone"
adb shell dumpsys meminfo 14640

(3) 查看内存最大限制命令:

adb shell
cd /system/
cat build.prop | grep heapgrowthlimit
图片.png

如上:dalvik.vm.heapgrowthlimit=256m,即单个程序内存最大限制为256M。

3)获取CPU消耗信息:
adb shell top  –n 1 |find "进程名"

图片.png

注:如何获取被测应用的 UID?
(1)步骤 1 :查看被测应用的进程 ID ( PID )

adb shell ps | grep < 被测应用包名>

(2)步骤 2 :查看被测应用的用户 ID ( UID )

adb shell cat /proc/$pid/status

延伸:
(1)通过系统文件dumpsys来取值,可以看到所有进程的内存信息,命令如下:
adb shell dumpsys cpuinfo

图片.png

如上:测试程序CPU占用率为33%,其中用户(user)占用23%,内核占用9.5%。

(2)查看cpu详细信息,获取文件top信息
如:查看前5个进程的cpu信息:
adb shell top -m 5

图片.png

这主要关注CPU占比,如果比例很高的话则表示有异常.

(3)查看指定程序的cpu信息:
adb shell top -n 1 | findstr com.mysteel.android.steelphone

图片.png

4)获取电量信息:

adb shell dumpsys battery
图片.png
AC powered: false
  USB powered: true
  Wireless powered: false
  status: 1            #电池状态:2:充电状态 ,其他数字为非充电状态           
  health: 2            #电池健康状态:只有数字2表示good
  present: true        #电池是否安装在机身
  level: 55            #电量: 百分比
  scale: 100
  voltage: 3977         #电池电压
  current now: -335232  #电流值,负数表示正在充电
  temperature: 335      #电池温度,单位是0.1摄氏度
  technology: Li-poly    #电池种类=

5)获取 GPU 信息:

adb shell dumpsys gfxinfo 进程名

图片.png

6) 获取流量信息:

Android系统的目录文件/proc/uid_stat/uid/下一般会有两个文件tcp_snd和tcp_rcv。(注意:标红的uid是第二步中获得的Uid数值)。通过adb shell cat /proc/uid_stat/< 被测应用uid>/tcp_snd和adb shell cat /proc/uid_stat/< 被测应用uid>/tcp_rcv即可分别获得上行流量和下行流量:

shell@p1:/ $ ls /proc/uid_stat/10150
ls /proc/uid_stat/10150
tcp_rcv
tcp_snd
shell@p1:/ $

> adb shell cat /proc/uid_stat/10150/tcp_rcv
>adb shell cat /proc/uid_stat/10150/tcp_snd
图片.png

注意:
(1)这里的值的单位是Byte字节,并且是累积量;
(2)有的应用是没有tcp_snd和tcp_rcv这两个文件的,比如某些系统应用;
(3)某些没有流量交换的应用的可能也没有这两个文件,或者这两个文件里没有数据;

4、Monkey内存、CPU测试

(1)监测脚本
内存监测脚本:

内存.bat

@echo off &color 0a&setlocal enabledelayedexpansion&title %~n0
::@mode con lines=18 cols=50

set package1=com.mysteel.android.steelphone


adb shell dumpsys meminfo %package1% | findstr "Pss" > ./info_1.txt

:start
adb shell dumpsys meminfo %package1% | findstr "TOTAL" >> ./info_1.txt


echo.
echo.
ping -n 5 127.1>nul
goto start

CPU监测脚本:

cpu.bat

@echo off &color 0a&setlocal enabledelayedexpansion&title %~n0
::@mode con lines=18 cols=50

set package1=com.mysteel.android.steelphone

adb shell top -n 1 | findstr "PID" > ./cupInfo_1.txt

:start
adb shell top -n 1 | findstr %package1% >> ./cupInfo_1.txt


echo.
echo.
ping -n 5 127.1>nul
goto start

(2)运行性能测试脚本

(3)点击内存.batcpu.bat,生成日志文件info_1.txt、cpuinfo_1.txt

图片.png

info_1.txt


图片.png

cpuinfo_1.txt


图片.png
PID   进程id
PR    优先级
CPU%  当前瞬时CPU占用率
S     进程状态:D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程
#THR  程序当前所用的线程数
VSS   Virtual Set Size  虚拟耗用内存(包含共享库占用的内存)
RSS   Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY   调度策略优先级,SP_BACKGROUND/SP_FOREGROUND
UID   进程所有者的用户id
Name  进程的名称

(4)生成Excel图表


内存

图片.png

5、Andriod应用性能测试-流量、电量

APP性能测试时除了需要监控CPU,内存数据,还需要获取该app的流量和电量数据,测试该数据是否在可接受的范围内,避免app出现过分消耗流量和电量的现象。
电量、流量测试方法:
(1)CPU空闲时,停留在主界面不退出,打开网络然后锁屏,12小时后查看电量、流量变化;
(2)APP在操作运行时(此过程可借助使用monkey进行压力测试),1小时后查看电量、流量变化;
(3)另一个第三方APP进行步骤1、2相同的场景测试;
(4)对比两个APP的耗电量和耗流量;
期望结果:APP在静止状态时无没有明显的耗电情况,在运行状态时耗电量在可接受范围内。

1)电量、流量测试方法一:

最简单的一种方式,有的手机设置菜单里面会有流量和电量统计类,只需在测试前后记录下流量和电量值,便可获取消耗的流量和电量数值


流量

电量
2)电量、流量测试方法二:

腾讯的WeTest平台(http://wetest.qq.com/),可下载WeTest助手到手机,选择需要测试的APP,测试完成后会自动发送测试结果到WeTest平台,主要数据包括cpu,内存,流量,FPS,还会自动关生成图表,很方便查看。

图片.png

3)电量、流量测试方法三:

最推荐的方式:使用性能测试工具Emmagee,它是一款简单易用的Android性能检测小工具,主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流等很多性能状态的变化。

参考:

https://blog.csdn.net/qq_15158911/article/category/6554645
https://www.cnblogs.com/botoo/archive/2017/12/01/7940998.html
http://www.cnblogs.com/botoo/p/7943698.html
https://blog.csdn.net/bailichun19901111/article/details/50542462
https://blog.csdn.net/qq_15158911/article/details/53444764

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 移动APP测试讲义 本篇讲义主要阐述APP的手工测试要点,并概括介绍主流的APP测试框架。 1. APP测试的准备...
    厲铆兄阅读 9,596评论 6 109
  • Monkey启动的命令行脚本为:monkey [options] < count > Options可以分为5类...
    __HAPPINESS_yh阅读 694评论 0 0
  • 在这充满竞争的时代,我懂 懂你的心思 理解你的苦衷 你总是害怕 害怕有人比你漂亮 害怕有人比你优秀 害怕你想要的得...
    西北最北阅读 747评论 0 0
  • 本来是自从上了大学,学了这个和语文再无瓜葛的专业,我以为我再也不会写高考作文了,直到昨天书店里国学书籍开始打折,便...
    熊掌小姐阅读 320评论 0 3
  • 一纸云开见月明,得失未尽详。 笔墨流年,才情华腹,一生耕耘染书香。 但闻暖风来报喜,十年锦入囊。 这次转折,白衣清...
    愚人布布阅读 270评论 0 0