Android-monkey稳定性测试(多台设备同时进行)
1.目的(原创文章,转载请注明出处~)
主要为指引开展android平台应用的稳定性测试,尽可能地在应用发布前发现crash及anr等问题并修复,android平台的应用均适用并可定制接入。
主要达到下班前执行,第二天上班时查看分析测试日志的目的,实现了以下核心功能:
a、可批量同时对多台android手机进行测试;
b、可对一台android设备选择模式为连续多次测试;
c、输入保存monkey运行时日志文件和用logcat抓取app运行时日志
2.环境搭建
3.1、java jdk环境配置:安装jdk,并添加系统环境变量,点击参考
3.2、android sdk环境配置(建议使用方法2):
方法1:下载安装SDK for Windows:
设置sdk下面tools的环境变量
右击“计算机”-》属性-》高级系统设置-》环境变量-》
点击Path,将“D:\android-sdk-windows\platform-tools”添加到变量值中,与之前的变量值用“;”隔开。
方法2:可通过安装android模拟器的方式实现(较简单),可直接搜索下载droid 4x海马玩模拟器。
安装成功后设置环境变量:
右击“计算机”-》属性-》高级系统设置-》环境变量-》
点击Path,将“D:\Program Files\Droid4X”添加到变量值中,与之前的变量值用“;”隔开。
3.3、python环境搭建:安装python 2.7或3.5版本,并添加系统环境变量,点击参考
3.测试前准备
2.1、每台待测android设备手工安装好待测试app应用,若为需要登录才能使用app功能的应用请先手工完成登录操作,并确保跳过相应的app新手引导页。
2.2、待测试android设备通过USB数据线与PC主机相连,并通过360手机助手之类的工具确保手机与pc是可进行adb调试的)。如下所示,在cmd命令中输入adb devices,所列的设备如果状态为device则代表该设备已可与PC通过adb调试通信。(建议一台PC机所连接android设备不超过5)
2.3、执行monkey测试前,一定要确保屏幕处于解锁状态。设置屏幕超时时间为最大时间(设置->显示->休眠->30分钟或者从不)。以防测试过程中手机锁屏,影响monkey测试。
4.测试工具介绍
4.1 monkey工具
Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。点击详细了解monkey
4.2 adb工具
Android调试桥接器,简称adb,是用于管理模拟器或真机状态的万能工具。Adb工具在本稳定性测试方案中主要作为PC与手机的通信桥梁。点击详细了解adb
4.3 python脚本功能说明
此脚本可以达到同时进行多台手机的测试,并可选择单次测试和同一台设备多次连续测试,具体功能说明如下:
Python脚本执行说明:在pc上快捷键“win+R”打开cmd命令行,输入:python E:\monkey_test\monkey_dist.py(脚本的绝对路径)
# -*- coding: GB2312 -*-
import os
import os.path
import time
import glob
# 删除已有测试cmd脚本
path = "E:\\monkey_test\\"
for file in glob.glob(os.path.join(path, '*.cmd')):
os.remove(file)
os.system("cls") # os.system("cls")具有清屏功能
rt = os.popen('adb devices').readlines() # os.popen()执行系统命令并返回执行后的结果
n = len(rt) - 2
print "当前已连接待测手机数为:" + str(n)
aw = raw_input("是否要开始你的monkey测试,请输入(yes or no): ")
if aw == 'yes':
print "monkey测试即将开始...."
count = raw_input("请输入你要进行的monkey测试次数: ")
testmodel = raw_input("请输入你是要进行单次测试还是多次连续测试,请输入(1-代表单次测试,2-代表多次连续测试): ")
ds = range(n)
for i in range(n):
nPos = rt[i + 1].index("\t")
ds[i] = rt[i + 1][:nPos]
dev = ds[i]
promodel = os.popen(
"adb -s " + dev + ' shell cat /system/build.prop | find "ro.product.model="').readlines() # 获取手机型号
#modelname = ('').join(promodel) # 将list转为字符串
modelname = promodel[0] #从list中取出第一个值
model = modelname[17:].strip('\r\n')
proname = os.popen(
"adb -s " + dev + ' shell cat /system/build.prop | find "ro.product.brand="').readlines() # 获取手机名称
roname = proname[0]
name = roname[17:].strip('\r\n')
packagename = os.popen(
"adb -s " + dev + ' shell pm list packages | find "xxx"').readlines()
package = packagename[0]
pk = package[8:].strip('\r\n')
if pk == 'com.xxx':
filedir = os.path.exists("E:\\monkey_test\\")
if filedir:
print "File Exist!"
else:
os.mkdir("E:\\monkey_test\\")
devicedir = os.path.exists("E:\\monkey_test\\" +name + '-' + model + '-' + dev)
if devicedir:
print "File Exist!"
else:
os.mkdir("E:\\monkey_test\\" +name + '-' + model + '-' + dev) # 按设备ID生成日志目录文件夹
wl = open("E:\\monkey_test\\" +name + '-' + model + '-' + ds[i] + '-logcat' + '.cmd', 'w')
#wl.write('adb -s ' + dev + ' logcat -v time ACRA:E ANRManager:E System.err:W *:S')
wl.write('adb -s ' + dev + ' logcat -v time *:W')
wl.write('> E:\\monkey_test\\' + '"'+ name + '-'+ model + '-' + dev + '"' + '\\logcat_%random%.txt\n')
wl.close()
':
wd = open("E:\\monkey_test\\" +name + '-' + model + '-' + ds[i] + '-device' + '.cmd', 'w')
wd.write(
'adb -s ' + dev + ' shell monkey -p com.xxx --monitor-native-crashes --ignore-crashes --pct-syskeys 5 --pct-touch 55 --pct-appswitch 20 --pct-anyevent 20 --throttle 200 -s %random% -v ' + count) # 选择设备执行monkey
wd.write('> E:\\monkey_test\\' + '"'+ name + '-'+ model + '-' + dev + '"' + '\\monkey_%random%.txt\n')
wd.write('@echo 测试成功完成,请查看日志文件~')
wd.close()
':
wd = open("E:\\monkey_test\\" +name + '-' + model + '-' + ds[i] + '-device' + '.cmd', 'w')
wd.write(':loop')
wd.write('\nset /a num+=1')
wd.write('\nif "%num%"=="4" goto end')
wd.write(
'\nadb -s ' + dev + ' shell monkey -p com.xxx --monitor-native-crashes --ignore-crashes --pct-syskeys 5 --pct-touch 55 --pct-appswitch 20 --pct-anyevent 20 --throttle 200 -s %random% -v ' + count) # 选择设备执行monkey
wd.write('> E:\\monkey_test\\' + '"'+ name + '-'+ model + '-' + dev + '"' + '\\monkey_%random%.txt\n')
wd.write('@echo 测试成功完成,请查看日志文件~')
wd.write('\nadb -s '+ dev +' shell am force-stop '+ pk)
wd.write('\n@ping -n 15 127.1 >nul')
wd.write('\ngoto loop')
wd.write('\n:end')
wd.close()
else:
print "请确认待测手机"+name + '-' + model +"未安装com.xxx~"
# 执行上述生成的cmd脚本path='E:\\monkey_test\\'
for file in os.listdir(path):
if os.path.isfile(os.path.join(path, file)) == True:
if file.find('.cmd') > 0:
os.system('start ' + os.path.join(path, '"' + file + '"')) # dos命令中文件名如果有空格,需加上双引号
time.sleep(1)
elif aw == 'no':
print('请重新确认所有待测手机是否已通过adb命令连接至pc!')
else:
print "测试结束,输入非法,请重新输入yes or no!"
1.查找当前已连接的测试设备;

2.设置当前要进行的monkey测试次数;

3.设置要进行的测试模式:单次or 多次连续;

4.完成1~3步后,会由python生成相应的android设备的cmd批处理脚本,然后自动扫描执行所有已生成的批处理脚本,以进行monkey稳定性测试。

5、测试结果分析
查看测试日志(进入日志文件夹E:\monkey_test,目前会同时保存monkey运行时的日志和logcat抓取app运行时的实时日志,monkey日志主要关注是否含关键字: crash、exception、anr,logcat日志主要关注是否含关键字:E/ACRA和weloop相关的exception。目前先手工搜索进行检查,日志分析工具后续提供~)

如下所示,某次测试中导致APP崩溃的现象,logcat日志如下(将有效的异常日志提交给相应的开发同学进行确认问题所在):
06-03 14:04:26.730 E/ACRA ( 9152): ACRA caught a RuntimeException exception for com.xx.xxx.xxx.xxx. Building report.
06-03 14:04:27.229 W/ActivityManager( 718): Activity pause timeout for ActivityRecord{2e729252 u0 com.xx.xxx.xxx.xxx./pl.gatti.dgcam.DgCamActivityForTommy2 t874 f}
06-03 14:04:28.238 W/recents.Performance( 934): preload while task Change spend : 1
06-03 14:04:29.761 E/ACRA ( 9152): com.xx.xxx.xxx.xxx. fatal error : Unable to pause activity {com.xx.xxx.xxx.xxx./pl.gatti.dgcam.DgCamActivityForTommy2}: java.lang.RuntimeException: Camera is being used after Camera.release() was called
06-03 14:04:29.761 E/ACRA ( 9152): java.lang.RuntimeException: Unable to pause activity {com.xx.xxx.xxx.xxx./pl.gatti.dgcam.DgCamActivityForTommy2}: java.lang.RuntimeException: Camera is being used after Camera.release() was called
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3613)
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3568)
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3543)
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.ActivityThread.access$1000(ActivityThread.java:178)
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1557)
06-03 14:04:29.761 E/ACRA ( 9152): at android.os.Handler.dispatchMessage(Handler.java:111)
06-03 14:04:29.761 E/ACRA ( 9152): at android.os.Looper.loop(Looper.java:194)
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.ActivityThread.main(ActivityThread.java:5779)
06-03 14:04:29.761 E/ACRA ( 9152): at java.lang.reflect.Method.invoke(Native Method)
06-03 14:04:29.761 E/ACRA ( 9152): at java.lang.reflect.Method.invoke(Method.java:372)
06-03 14:04:29.761 E/ACRA ( 9152): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1005)
06-03 14:04:29.761 E/ACRA ( 9152): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:800)
06-03 14:04:29.761 E/ACRA ( 9152): Caused by: java.lang.RuntimeException: Camera is being used after Camera.release() was called
06-03 14:04:29.761 E/ACRA ( 9152): at android.hardware.Camera.lock(Native Method)
06-03 14:04:29.761 E/ACRA ( 9152): at pl.gatti.dgcam.a.b(ProGuard:76)
06-03 14:04:29.761 E/ACRA ( 9152): at pl.gatti.dgcam.DgCamActivityForTommy2.l(ProGuard:555)
06-03 14:04:29.761 E/ACRA ( 9152): at pl.gatti.dgcam.DgCamActivityForTommy2.onPause(ProGuard:547)
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.Activity.performPause(Activity.java:6215)
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1363)
06-03 14:04:29.761 E/ACRA ( 9152): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3595)
06-03 14:04:29.761 E/ACRA ( 9152): ... 11 more
附:常见问题
1、脚本检测出来的手机数与待测手机数不一致,此时需要手工检查确认是否所有手机USB连接/USB调试模式均已打开;
2、部分华为手机权限未放开,导致logcat未能捕获monkey执行测试时的应用日志;如提示:
则华为手机进入拨号界面输入:*#*#2846579#*#* 依次选择:工程菜单---后台设置----LOG设置---LOG开关 将四个选项点击打开。
3、因为monkey工具为随机事件测试,故会误打开系统的音乐播放器播放音乐。
Android-monkey稳定性测试(多台设备同时进行)的更多相关文章
- Monkey Android app稳定性测试工具之Monkey使用教程
Monkey Android app稳定性测试工具之Monkey使用教程 by:授客 QQ:1033553122 由于篇幅问题,仅提供百度网盘下载链接: Android app稳定性测试工具之Monk ...
- 【Monkey】Monkey稳定性测试常用命令
Monkey稳定性测试常用命令: 1.adb shell monkey n 2.adb shell monkey -p com.android.calculator2 1000 3.adb shel ...
- Android Monkey压力测试环境搭建及使用
Android Monkey压力测试学习笔记 步骤:下载SDK -> 解压进入SDK Manager下载系统 -> 配置环境变量 -> 创建虚拟设备或连接真机 -> 进入命令模 ...
- Android客户端稳定性测试——Monkey
修改时间 修改内容 修改人 2016.6.20 创建 刘永志 2016.6.29 完成 刘永志 Monkey简介: Android SDK自带的命令行测试工具,向设备发送伪随机事件流,对应用程序进行进 ...
- Android Monkey压力测试
Monkey 是Android SDK提供的一个命令行工具, 可以简单,方便地运行在任何版本的Android模拟器和实体设备上. Monkey会发送伪随机的用户事件流,适合对app做压力测试. 1为什 ...
- Android Monkey压力测试使用
一.Monkey简介: Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击.滑动.Application切换.横竖屏.应用关闭)实现对 ...
- Android Monkey压力测试(转)
参考链接:https://www.cnblogs.com/yyh8/p/6707745.html Monkey 是Android SDK提供的一个命令行工具, 可以简单,方便地运行在任何版本的Andr ...
- Monkey 稳定性测试
学习网址: https://blog.csdn.net/lucytan01/article/details/79958727 https://blog.csdn.net/hebbely/article ...
- monkey稳定性测试的步骤及策略
1.adb的作用是什么?adb的全称:android debug bridge 安卓调试桥梁,包含在 Android SDK 平台工具软件包中.通过该命令与设备进行通信,以便进行调试adb可以同时管理 ...
- 转 Android Monkey压力测试使用
转自:https://www.jianshu.com/p/c8844327f5e9 一.Monkey简介: Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送 ...
随机推荐
- DB2 中文排序问题
本地测试库中 代码集: GBK 数据库配置发行版级别 = 0x0c00 数据库发行版级别 = 0x0c00 数据库地域 = CN 数据库代码页 = 1386 数据库代码集 = GBK 数据库国家/地区 ...
- Django Form and Modelform Admin定义 高级查询)
Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...
- python之 Redis
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- Lab_7_Automating_v2.5
System Operations - Lab 7: Automating Deployments with CloudFormation - 2.5 ======================== ...
- Struts1.x有两个execute方法,不要重写错哦HttpServletRequest才是对的(转)
Struts1.x 的 Action 有两个 execute 哦,小心搞错! by agate - Published: 2008-05-01 [9:42 下午] - Category: 程序编码 不 ...
- bootstrapvalidator校验、校验清除重置
//保存 function saveAdmin(){ //开启验证 $('#saveadmin_form').data('bootstrapValidator').validate(); if(!$( ...
- svn-git
1.创建版本库 # svnadmin create proj 2.修改配置文件 Auth文件 [groups] admin=shguo [/] @admin=rw *= ...
- Stanford NLP学习笔记:7. 情感分析(Sentiment)
1. 什么是情感分析(别名:观点提取,主题分析,情感挖掘...) 应用: 1)正面VS负面的影评(影片分类问题) 2)产品/品牌评价: Google产品搜索 3)twitter情感预测股票市场行情/消 ...
- email
#region 邮件帮助类 //+-------------------------------------------------------------------+ //+ FileName: ...
- JS移动端如何监听软键盘回车事件
移动端经常项目中会有搜索之类的功能,一般实现的是按搜索按钮进行搜索,如果要像PC端一样实现按回车键进行搜索该怎么实现呢? 方法很简单,就是在搜索框的input外面套一个form标签 注意点:form ...