第一部分
首先我们要知道开展app压力测试的背景:
我们为什么要开展压力测试和什么时候开展压力测试
关于为什么开展压力测试主要有两个一个是提高产品的稳定性一个是提高产品的留存率!
对于何时开展压力测试一般是首轮功能测试通过后进行,还有一般是在下班后夜间进行压力测试比较好!
第二部分理论篇
1、手工测试场景和自动化测试场景的流程
例如以聊天为例,查找--->添加好友---->聊天
自动化测试场景 -----模拟事件流
touchinput-->keyevent--->touchSearch-->touchname---->touchfrind-->keyevent
2、monkey测试工具介绍
首先需要知道adb是什么
adb组成
adb:Android调试桥接Android Debug Bridge,是一个C/S架构的命令行工具
作用:PC通过adb来操作手机
客户端(Client):可以通过它对Android应用进行安装、卸载及调试
服务(Service):管理客户端到Android设备上adb后台进程的连接
守护进程:(adb daemon)运行在Android设备上的adb后台进程
现在介绍什么是monkey
monkey是发送伪随机用户事件的工具;monkey存在于android手机系统中,开发者可以使用ADB与monkey进行沟通;在mac上借助Terminal,在windows使用cmd,通过连接线(USB线)和ADB(Android Debug Bridge即安卓调试桥,手机调试的入口)进行沟通
monkey script是什么?
MonkeyScript是一组可以被Monkey识别的命令集合,并且可以完成重复且固定的操作,但是在执行操作中需要截屏操作,但MonkeyScript并不支持截屏操作,因此需要使用借助另外的叫做MonkeyRunner的工具。
MonkeyRunner提供了一系列的API(Application Programming Interface,应用程序编程接口)通过MonkeyRunner中的APIs我们可以完成模拟事件以及截屏操作
Monkey和MonkeyRunner的区别在于,Monkey是在adb shell中生成用户或系统的伪随机事件,monkey runner是通过Api定义特定命令和事件控制设备!
monkey runner APIs有monkeyrunner用来连接设备或模拟器;monkeydevice提供安装卸载应用发送模拟事件,monkeyimage完成图像保存及对比的操作
monkeyrunner的测试类型:多设备控制、功能测试、回归测试
那么pc如何通过adb和android手机里的monkey进行沟通的呢?adb作为PC和Android设备交互与通信的一个工具。那么就需要简单介绍下adb的基本使用命令了,这里做简单介绍下,具体在测试中需要使用哪些测试命令会在第三部分实践部分做更加详细的说明。
adb命令格式:adb [-e | -d | -s <设备序列号>] <子命令>

Adb基础命令
(1)文件传输与安装命令

(2)获取信息命令

(3)Log与重启相关命令

关于adb的push和pull文件首先需要adb root
输入命令adb remount ,意思是将设备改为可读可写;
显示remount succeeded就代表命令执行成功;

假如你要将Windows下D盘根目录下的aa.txt文件拷贝到机器(手机或者平板)的/system/目录下;可以使用命令如下:
adb push D:\aa.txt system/

(4)Adb备份与恢复命令

(5)Adb重定向端口命令
通过adb的端口转发来实现一些端口的通信
将开发PC上的端口(1314)重定向到设备的端口(5200)上,这样所有发往PC端口(1314)的数据都会被转发到设备的端口(5200)上。这个机制可以实现远程控制Android设备应用。
端口映射命令

(6)Adb无线连接与文件同步
无线连接可以实现不用USB进行调试应用,文件同步可将修改的文件自动快速的push到手机对应目录中

无线连接步骤
root您的Andorid设备
安装wireless adb工具(google play里面可以下载)
PC和Android设备连接到同一网络,手机上查看Android设备IP地址
通过命令:netcfg查询IP
PC端输入以下命令
adb connect IP地址:端口,端口默认为5555
adb connect 192.168.1.105:5555
文件同步步骤
Sync如果没有指定的更新目录,则会默认更新以下目录
/system
/vendor
/data
注意:需要root
使用默认目录来同步文件
在PC新建一个目录,目录中新建三个文件夹分别为,system、vendor、data
设置环境变量ANDROID_PRODUCT_OUT为上个步骤新建的目录
使用命令adb sync进行同步
结果分析
压力测试结果分为正常结果和异常结果
我们主要分析异常结果。异常结果主要分为两个方面一个是crash就是崩溃
应用程序在使用过程中,非正常退出这种情况非常严重,可能会导致app不能使用;第二个是ANR(Application Not Responding)出现后会有两种情况一种是force close另一种是wait,若选择wait应用程序就会一直等待直到程序恢复正常,若选择另一种则会直接退出程序,对于测试人员会认为是正常情况,若是用户使用则会认为程序问题,并且是严重问题。为了方便用户使用,最好避免这种情况出现。
anr的截图

第三部分实践操作
理论部分大概如此,下面进入实践环节对安卓app进行压力测试
1、adb环境配置
下载Android SDK,将tools和platform-tools目录配置到系统变量PATH
验证是否安装配置成功,需要打开cmd窗口,输入adb之前在其他章节已经介绍过


python2.7下载并且配置好环境变量

adb devices确认pc和app连接软连接已经建立,这里使用的app是模拟器

模拟器

安装测试app这里使用命令行安装将需要安装的apk复制到sdk的目录下

adb install package.apk命令即可

安装好可以在模拟器上看到此app

下面进行压测的过程
发送压力指令:adb shell monkey 1000 :测试手机中任意的1000条使用指令

获取单独的需要测试手机功能的包名
获取app包名linux系统可以使用命令adb logcat | grep START
logcat是输出所有app的日志信息,grep是管道是把输出的作为下一个命令的输入信息grep 查找日志信息中含有START信息的内容
windows系统可以借助工具uiautomator viewer.bat,先打开模拟器的计算器的界面可以定位查看到计算器的包名



计算器的包名就是:com.android.calculator2
获取到包名之后就可以针对某一个包app进行压力测试了
命令如下:adb shell monkey -p package 1000
adb shell monkey -p com.android.calculator2 1000

针对这个计算器的应用包就进行了1000个事件的操作,这个就是压测的过程
下面进行monkey高级参数的应用
1、每一个事件之间的间隔一段时间就用参数--throttle 1000ms 100是事件,每一个事件间隔1s
adb shell monkey -p com.android.calculator2 --throttle 1000 100

2、seed参数
monkey生成的事件都是随机的,但是如果monkey执行过程中发生了问题,那么想复现的话就会比较的难,但是有了seed参数就可以复现了。开发修复之后验证的话就难了
,每一个seed值,指定随机seed值之后,monkey随机操作是基于seed值生成的。
【adb shell monkey -s<seed> event-count】
相同的seed值就可以复现操作

3、触摸事件---只是帮我完成点击的操作
-pct-touch 100
表示触摸事件比例是100%没有其他事件
触摸事件,设定点击事件的出现比例【adb shell monkey - -pct-touch】在编译过程中加一个-v参数可以在编译时列出当前编译过程中执行的事件
adb shell monkey -p com.android.calculator2 --pct-touch 100 100

-v 会把所有的点击事件列出来
命令如下:
adb shell monkey -v -p packagename --pct-touch
adb shell monkey -v -p com.android.calculator2 --pct-touch 100 100

不指定比例的话就是随机分配的
adb shell monkey -v -p com.android.calculator2 --throttle 1000 10

4、动作事件 70%类似于触摸事件【adb shell monkey - -pct-motion】
adb shell monkey -v -p com.android.calculator2 --throttle 1000 --pct-touch 30 --pct-motion 70 10
如果不想有其他操作类型的就将需要的操作类型相加比例为100%如果不是100%就会将剩余的比例进行随机分配
adb shell monkey -v -p com.android.calculator2 --throttle 1000 --pct-touch 30 --pct-motion 50 10
这里相加只有80%还有20%就会随机操作

5、轨迹球事件【adb shell monkey - -pct-trackball 】
6、基本导航事件,继续使用百分比输入设备的上、下、左、右【adb shell monkey - -pct-nav 】
7、主要导航事件,兼容中间键、返回键、菜单按键即软键盘上的一些访问键【adb shell monkey - -pct-majornav 】
8、系统导航事件,HOME、BACK、拨号及音量键【adb shell monkey - -pct-syskeys 】
9、启动Activity事件,设定切换已有的activity比例,使事件流在已有的activity事件之间切换【adb shell monkey - -pct-appswitch 】
10、不常用事件也就是其他不常用的一些手机操作事件【adb shell monkey - -pct-anyevent 】
11、崩溃事件:忽略崩溃和异常【adb shell monkey - -ignore-crashes 】
超时事件:忽略超时事件【adb shell monkey - -ignore-timeouts 】
adb shell monkey -v -p me.ele --pct-touch 50 --pct-motion 50 --ignore-crashes --ignore-timeouts 100
CRASH结果析取
1、首先安装会引起crash的app :adb install app-debug.apk
2、然后执行压力命令 :adb shell monkey -p demo.leakcanary.srain.in.leakcanarydemo 1000
3、最后析取CRASH的Exception:
补充:查询app上所有的包名:adb shell pm list package

adb shell dumpsys window w | findstr \/ | findstr name= ---查看当前所打开的应用的包名和利用识别工具识别到的demo.leakcanary.srain.in.leakcanarydemo一致

**在不添加忽略Crash和ANR的情况下,不指定seed的monkey在结束后显示seed的值,可用此值复现。如果Monkey添加过ignore参数忽略Crash和ANR,则不会出现seed的值。在Crash和ANR 之后,会继续执行Monkey操作,直到操作数量达到指定值。
adb shell monkey -p demo.leakcanary.srain.in.leakcanarydemo --s <seed值> 1000可以复现crash
将exception的内容复制出来给开发去定位
还可以加ignore忽略--ignore-crashes
adb shell monkey -p demo.leakcanary.srain.in.leakcanarydemo --ignore-crashes 1000
出现crash的情况,将crash的日志复制给开发定位,此时出现crash会有一个seed的值,等开发修复之后可以重新复现此步骤看是否仍会出现此问题

忽略的话就会将全部数量的指定全部执行完
adb shell monkey -v -p com.liebao.dlmqy --ignore-crashes 1000

ANR异常结果析取
1、安装可以引起ANR的App、$adb install app-debug_anr.apk】
2、执行压力命令 :查看anr的log
ANR的日志文件查看方法:cd /data/anr/ 先进入到anr的目录,然后ls看下anr目录下有什么文件,当看到一个traces.txt文件,即代表有文件记录anr的情况,用命令more来查看该文件内容,即可知道ANR的信息情况
3、析取ANR的Exception信息,整理成测试文档提交给开发定位

monkey 可以完成随机操作,完成稳定性测试之后需要的另外的需求就是希望完成固定的操作比如重复操作100次,就需要monkey script的功能
执行monkey脚本的命令:
adb shell monkey -f <scriptfile> <event-count>
其中的scriptfile就是monkey script脚本需要我们把需要操作的命令事先写好
scriptfile脚本命令
a、DispatchTrackball命令,轨迹球事件完成点击操作,参数中的int action 0代表按下,1代表弹起,x和y代表坐标点

(说明:long downtime:健最初按下的时间;long eventide:事件发生的时间;int action:操作的动作是按下还是弹起; float x:x坐标点;float y:y坐标点;float pressure:0-1压力的大小;float size:触摸的值0-1;int metastate:按下标识;float xprection:x精确值;float yprecsion:;int device:事件来源;int edgeflags:超出屏幕范围)
b、DispatchPointer命令,点击事件,参数中的永达和上一个命令一致
配对使用
c、DispatchString输入字符串事件命令,DispatchString(String text)
d、LaunchActivity启动应用,LaunchActivit(package,Activity)
e、UserWait命令,等待事件,UserWait(毫秒)
f、DispatchPress按下键值,DispatchPress(键值)#keycode 66 回车键
g、RotateScreen:翻转屏幕
h、Tab单击事件
在输入查询词之后需要按下回车键才能传上去
实例重复执行100次点击按钮功能
1、启动app
2、点击按钮
3、等待结果输出
4、按esc返回上一步
获得想x和y坐标DispatchPointer(10,10,0,180,350,1,1,-1,1,1,0,0)
只要在如下图所示的x和y的坐标范围内即可

以下以实际的app进行实践编写monkeyscript的脚本,并且是在真机中执行脚本内容

执行操作命令:adb shell monkey -f wttscriptr.script 2 其中wttscriptr。txt就是我们编写的script的脚本,2就是执行本脚本的次数。
但是实际直接执行是没有效果的因为此脚本是需要monkey来执行而此脚本是存放在电脑端的,因此我们需要将此脚本push到真机中命令如下:
adb push wttscriptr.txt /data/local/tmp
然后可以进入真机再其目录中找到此文件内容

直接在真机的脚本目录中执行此脚本
monkey -f wttscriptr.script 1 这里的1表示次数
script的固定内容
type=raw event
count=10
speed=1.0
start data >>
可以看到执行的过程,app会按照脚本的命令进行操作app

此脚本的第一行LaunchActivity其实启动的时候并且我要测试的app而是其他的app,这是因为测试的apk的源码中缺少一个配置,我们需要打开源码,在源码中加入android:exported="true"才能在外部被调起,在androidMaintest.xml的activity的属性下增加android:exported="true"重新打包成此apk进行安装即可。
monkey script的缺点就是没有办法进行截屏操作
因此就用到了强大的Monkey runner
MonkeyRunner常见的API
MonkeyRunner:API
1.alert 警告框 void alert(string message,string title,string okTile)

然后进入sdk\tools目录下,这个目录有monkeyrunner.bat文件将py放在这里运行命令 monkeyrunner demo.py即可。

MonkeyDevice:WaitForConnection等待设备连接,有多个device id需要指明具体哪个设备
1、WaitForConnection(float timeout,string deviceid)
2、drag
drag(tuple start,tuple end,float duration,integer steps)
start:起点位置 end 终点位置 duration 手势持续时间 steps 插值点的步数默认是10
3、press:按键
press(string keycode,dictionary type)
keycode名:Down,UP,DOWN_AND_UP
4、startActivity(package+'/'+activity)启动应用
5、touch:点击
touch(integer x,integer y,integer typer)
x坐标 y坐标 type:DOWN,UP,DOWN_AND_UP
6、type :type(string message)
**7、takeSnapshot截屏
MonkeyImage takeSnapshot()
MonkeyImage的API
1.sameAs 图像对比
boolean sameAs(MonkeyImage other,float percent)
2、writetoFile:保存图像文件
void writeToFile(string path,string format)
实例
实现在搜索框中输入搜索词并且截屏
待实现
但是MonkeyRunner不能自动多次执行,需借助phton或Java进行循环,MonkeyScript可以多次执行
以上就是最基础的知识还需要不断的练习和使用才能孰能生巧。
网友评论