一、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
如上:测试程序CPU占用率为33%,其中用户(user)占用23%,内核占用9.5%。
(2)查看cpu详细信息,获取文件top信息
如:查看前5个进程的cpu信息:
adb shell top -m 5
这主要关注CPU占比,如果比例很高的话则表示有异常.
(3)查看指定程序的cpu信息:
adb shell top -n 1 | findstr com.mysteel.android.steelphone
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 进程名
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)点击内存.bat
和cpu.bat
,生成日志文件info_1.txt、cpuinfo_1.txt
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,还会自动关生成图表,很方便查看。
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
网友评论