您的位置:首页 > 移动开发

Android APP压力测试 之Monkey工具

2016-11-09 03:13 716 查看

1、Monkey简介



Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对APP进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。





3、Monkey实例



1)、指定一个包:adb shell monkey -p com.example.findyou 10
2)、指定多个包:adb shell monkey -p com.example.findyou –p com.example.findyou1 -p com.example.findyou2 100
3)、Seed值:Monkey测试1:adb shell monkey -p com.example.findyou –s 10 100
Monkey 测试2:adb shell monkey -p com.example.findyou –s 10 100
指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的
4)、日志级别
Level 1 :adb shell monkey -p com.example.findyou –v -v 100
说明 提供较为详细的日志,包括每个发送到Activity的事件信息
Level 2 :adb shell monkey -p com.example.findyou –v -v –v 100
说明 最详细的日志,包括了测试中选中/未选中的Activity信息



4、Monkey测试结果分析


Monkey测试的log分析,我们可以通过几个关键词来判断测试是否通过。

1)Monkey finished
打开LOG,查看log的最下端,是否有类似以下字段:

## Network stats: elapsed time=5123ms (5123ms mobile, 0ms wifi, 0ms not connected)
// Monkey finished

这个字段表明本次的Monkey没有异常,测试通过。

2)CRASH

同样,在得到LOG后,搜索”CRASH”字段,如果搜索到有结果,则表明有进程出现问题,测试不通过。

// CRASH: com.onekchi.downloadmanager (pid 12919)

3)ANR
在Log中搜素该字段,如果有搜索有结果,则表示测试过程中,测试对象出现了无响应的现象,因此测试不通过。--throttle <毫秒>值建议为500

4)无法搜索到上述信息
出现这种情况,一般都是外界原因而非程序本身原因。比如电脑异常测试中断,需要重新测试。




monkey信息自动收集脚本

1、Findyou的Monkey脚本

1)、【脚本文件】

a、配置文件:config.conf

[appinfo]
appCnName=Findyou
appEnName=Findyou
appversion=V1.0.0
packageName=com.Findyou.you


b、脚本文件:Monkey_findyou.bat

@ECHO OFF
ECHO.:::::::::::::::::::::::::::::::::::::::::::::::::
ECHO.:: Monkey测试 ::
ECHO.:: 作者:Findyou ::
ECHO.:: 版本 V1.0.1 ::
ECHO.:: 时间:2014.08.25 ::
ECHO.:::::::::::::::::::::::::::::::::::::::::::::::::
IF NOT EXIST %~dp0\config.conf GOTO EXIT
ECHO.[ INFO ] 准备Monkey测试
ECHO.[ INFO ] 读取config.conf中信息

REM 从配置文件中获得包名
FOR /F "tokens=1,2 delims==" %%a in (config.conf) do (
IF %%a == packageName SET packageName=%%b
IF %%a == appEnName SET appEnName=%%b
IF %%a == appversion SET appversion=%%b
)

REM 获取日期,格式为:20140808
SET c_date=%date:~0,4%%date:~5,2%%date:~8,2%
REM 获取得小时,格式为:24小时制,10点前补0
SET c_time=%time:~0,2%
IF /i %c_time% LSS 10 (
SET c_time=0%time:~1,1%
)
REM 组合小时、分、秒,格式为: 131420
SET c_time=%c_time%%time:~3,2%%time:~6,2%
REM 将当运行时间点做为日志文件名
SET logfilename=%c_date%%c_time%

REM 创建当天日期目录及测试APP日志保存目录
IF NOT EXIST %~dp0\%c_date% md %~dp0\%c_date%
SET logdir="%~dp0\%c_date%\%appEnName%%appversion%"
IF NOT EXIST %logdir% (
ECHO.[ Exec ] 创建目录:%c_date%\%appEnName%%appversion%
md %logdir%
)

REM 获得手机信息,显示并保存
adb shell cat /system/build.prop>phone.info
FOR /F "tokens=1,2 delims==" %%a in (phone.info) do (
IF %%a == ro.build.version.release SET androidOS=%%b
IF %%a == ro.product.model SET model=%%b
IF %%a == ro.product.brand SET brand=%%b
)
del /a/f/q phone.info
ECHO.[ INFO ] 读取Phone信息
ECHO. 手机品牌: %brand%
ECHO. 手机型号: %model%
ECHO. 系统版本: Android %androidOS%
ECHO.Phone信息>"%logdir%\%logfilename%_%model%.txt"
ECHO.手机品牌: %brand%>>"%logdir%\%logfilename%_%model%.txt"
ECHO.手机型号: %model%>>"%logdir%\%logfilename%_%model%.txt"
ECHO.系统版本: Android %androidOS%>>"%logdir%\%logfilename%_%model%.txt"

ECHO.
ECHO.[ Exec ] 使用Logcat清空Phone中log
adb logcat -c
REM ECHO.[ INFO ] 暂停2秒...
ping -n 2 127.0.0.1>nul
ECHO.
ECHO.[ INFO ] 开始执行Monkey命令
REM ECHO.[ INFO ] 强制关闭准备测试的APP
adb shell am force-stop %packageName%

:::::::::::::::::Monkey测试命令::::::::::::::::::::::::
::::::::::::修改策略请仅在此区域内修改:::::::::::::::::
ECHO.[ Exec ] adb shell monkey -p %packageName% -s %c_time% --throttle 500 -v -v -v 10000

adb shell monkey -p %packageName% -s %c_time% --throttle 500 -v -v -v 10000>%logdir%\%logfilename%_monkey.log

::::::::::::修改策略请仅在此区域内修改:::::::::::::::::
::::::::::::::::::::::END::::::::::::::::::::::::::::::
ECHO.[ INFO ] 执行Monkey命令结束
ECHO.

ECHO.[ Exce ] 手机截屏
adb shell screencap -p /sdcard/monkey_run_end.png
ECHO.[ INFO ] 拷贝截屏图片至电脑
adb pull /sdcard/monkey_run_end.png %logdir%
cd %logdir%
ren monkey_run_end.png %logfilename%.png

ECHO.
ECHO.[ Exec ] 使用Logcat导出日志
adb logcat -d >%logdir%\%logfilename%_logcat.log

REM ECHO.
REM ECHO.[ Exec ] 导出traces文件
REM adb shell cat /data/anr/traces.txt>%logfilename%_traces.log

REM 待扩展,上传日志至服务器

:EXIT
ECHO.
ECHO.[ INFO ] 请按任意键关闭窗口...
PAUSE>nul

注意:保存bat时注意为文件格式 ANSI 哈,Windows你懂的


2、Findyou脚本讲解


1)、[b]使用方法[/b]

a、保存脚本:拷贝本文中的config.conf、Monkey_findyou.bat内容保存在同一目录下

b、修改配置:修改 config.conf 中内容为你需要测试的APP对应的信息

c、执行脚本:双击 Monkey_findyou.bat 即可

★温馨提示★
a、环境变量:adb命令可执行(需要安装安卓SDK,不会安装配置请百度或google)
b、保存脚本:目录不要太深,且建议为英文文件夹,不要有空格或特殊字符
c、手机连接:此版脚本没有对同时连接电脑的多台安卓设备进行检测,只能对单台手机进行测试与操作
2)、脚本讲解

a、核心:Monkey命令

adb shell monkey -p %packageName% -s %c_time% --throttle 100 -v -v -v 10000

-p %packageName%
指定测试包名,%packageName%变量值来自文件config.conf中的packageName对应的值。
-s %c_time%
%c_time%为执行脚本当时的时间(小时、分、秒),以时间为值即达到随机目的,也为后续需要再模拟此次测试提供事件序列。
--throttle 100

代表间隔时间,即每次操作的时间间隔,此命令的含义就是增加500ms的时间间隔。

-v -v -v 10000
-v -v -v日志级别 Level 2,最详细的日志,包括了测试中选中/未选中的Activity信息。10000即执行10000次随机事件。
★温馨提示★

①、将Monkey命令区域标注划出,可以按需定致,%packageName%代表你需要测试的包名,其他可以自己增减Monkey参数。

②、例:adb shell monkey -p %packageName% -s %c_time% --throttle 100 --ignore-crashes -v -v -v 10000

③、Monkey此处不做过多的讲解,网上有很多Monkey测试策略的介绍。Bat中其他相关方法操作脚本中基本都有注解与说明,相信大家能懂。

b、配置文件

config.conf
[appinfo]
appCnName=Findyou
appEnName=Findyou
appversion=V1.0.0
packageName=com.Findyou.you

①、appCnName:此脚本中暂时未用到

②、appEnName:待测APP名称,建议用英文或拼音,多处用到此项值

③、appversion:待测APP版本号,不要有空格,bat脚本没有做处理

④、packageName:待测APP版本package名

★温馨提示★

①、APP第3、4项信息可以用aapt命令从安装apk中获取,具体方法请见我笔记《Android测试提升效率批处理脚本》http://www.cnblogs.com/findyou/p/3785618.html

3)、信息收集自动化实现

Monkey_findyou.bat 结果
F:\Monkey\20140808\FindyouV1.0.0
20140825181801.png
20140825181801_logcat.log
20140825181801_monkey.log
20140825181801_SM-N9008V.txt

①、Monkey后手机截屏:20140825181801.png

②、Monkey时手机日志:20140825181801_logcat.log

③、Monkey测试结果:20140825181801_monkey.log

④、被测手机信息:20140825181801_SM-N9008V.txt

★温馨提示★
*、每次执行Monkey会自动收集相关信息生成以上四个文件,文件名为执行时的时间点。

*、分析日志文件,是否有异常关键字:CRASH、ANR、Exception等,想偷懒把四个文件打包发给研发定位即可,不过还是建议自己学会分析。

*、如果有需要多次测试压力测试,想自动执行多少多少次之类的,下面提供一个思路

①、删除Monkey_findyou.bat脚本中最后一行"PAUSE>nul ",保存

②、将手机设置永不锁屏,或者安装自动解锁APP(脚本执行调一下app)

③、Windows的计划任务定时执行Monkey_findyou.bat




3、操作记录

1)、双击执行Monkey_findyou.bat



2)、脚本执行信息



3)、输出结果






Monkey日志自动分析脚本

1、Monkey日志分析脚本

1)、脚本文件:Monkey_Log分析.bat

@ECHO OFF
ECHO.:::::::::::::::::::::::::::::::::::::::::::::::::
ECHO.:: 分析Monkey日志 ::
ECHO.:: 作者:Findyou ::
ECHO.:: 版本 V1.0.1 ::
ECHO.:: 时间:2014.08.26 ::
ECHO.:::::::::::::::::::::::::::::::::::::::::::::::::
REM 方法一:手动设置Monkey日志路径
SET monkeyLogFile=F:\Monkey\20140808\FindyouV1.0.0\20140825181801_monkey.log

REM 方法二:直接将Monkey日志拖到此bat文件上
IF NOT "%1"=="" SET monkeyLogFile=%1

ECHO.[ INFO ] Monkey日志: %monkeyLogFile%
ECHO.[ INFO ] 开始分析
SET blnException=0
ECHO.
ECHO.
REM 如果觉得分析太快,没有感觉,把下面注释去掉假装分析中,有停顿感
REM ping -n 2 127.0.0.1>nul

::ANR日志
FOR /F "delims=" %%a IN ('FINDSTR /C:"ANR" %monkeyLogFile%') DO (
SET strANR=%%a
)

::崩溃日志
FOR /F "delims=" %%a IN ('FINDSTR /C:"CRASH" %monkeyLogFile%') DO (
SET strCRASH=%%a
)

::异常日志
FOR /F "delims=" %%a IN ('FINDSTR /C:"Exception" %monkeyLogFile%') DO (
SET strException=%%a
)

::正常
FOR /F "delims=" %%a IN ('FINDSTR /C:"Monkey finished" %monkeyLogFile%') DO (
SET strFinished=%%a
)

IF NOT "%strANR%" == "" (
ECHO.[ INFO ] 分析Monkey日志存在: ANR
ECHO.[ INFO ] ------------------------------------
ECHO. "%strANR%"
SET /a blnException+=1
ECHO.
)

IF NOT "%strCRASH%" == "" (
ECHO.[ INFO ] 分析Monkey日志存在: CRASH
ECHO.[ INFO ] ------------------------------------
ECHO. "%strCRASH%"
SET /a blnException+=1
ECHO.
)

IF NOT "%strException%" == "" (
ECHO.[ INFO ] 分析Monkey日志存在: 异常
ECHO.[ INFO ] ------------------------------------
ECHO. "%strException%"
SET /a blnException+=1
)

IF NOT "%strFinished%" == "" (
ECHO.[ INFO ] 分析Monkey日志存在: 执行成功标记
ECHO.[ INFO ] ------------------------------------
ECHO. "%strFinished%"
ECHO.
) ELSE (
IF %blnException% EQU 0 ECHO.[ INFO ] 分析Monkey日志结果: Monkey执行异常中断,请重新执行Monkey脚本!
ECHO.
)

REM 如果blnException不为0,说明存在异常,改变字体为淡紫色
IF %blnException% NEQ 0 (
Color 0D
ECHO.[ INFO ] 分析Monkey日志结果:存在异常日志,请手工再仔细检查!
ECHO.
) ELSE (
ECHO.[ INFO ] 分析Monkey日志结果:正常
ECHO.
)
ECHO.
ECHO.[ EXIT ] 按任意键关闭窗口...
PAUSE>nul



2)、【使用方法】
a、保存脚本:Monkey_Log分析.bat
b、执行脚本:
方法一:手动设置Monkey日志路径,修改脚本中的monkeyFile变量
方法二:直接将Monkey日志拖至bat文件上




2、脚本原理

1)、Monkey结果分析理论:

a、请见本系列的第一篇 《Android APP压力测试(一)之Monkey工具介绍》 中的第4节:Monkey测试结果分析

2)、脚本核心思想:

a、理论支撑,请见上方 1)

b、搜索关键字

c、通过关键字判读有无异常

★温馨提示★

*、不足,如果Monkey命令存在调试选项如:--ignore-crashes --ignore-timeouts,此脚本还需要增加判断条件,如有兴趣可以自己再优化增强。


3、操作记录

1)、将Monkey日志拖至bat文件上



2)、脚本执行结果

a、正常



b、异常


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: