Android App专项测试-压力测试篇

Android App专项测试-压力测试篇

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/wb1276831936/article/details/53256808

小伙伴们大家好,今天主要分享的主题是Android App专项测试。如何进行Android App专项测试压力测试呢?我们主要通过Android平台的一门工具Monkey。在学习本门课程之前,如果你具有一定的Shell基础,将很有助于理解。

本次课程大纲主要分为3个部分:

第一部分 背景

探讨两个问题:

1. 为什么要开展压力测试? 
2. 什么时候开展压力测试?

第二部分 理论

1.手工测试场景 
2.自动测试场景 
3.Monkey工具 
4.ADB命令 
5.Monkey Script 
6.MonkeyRunner 
7.压力测试结果

      1.什么是Crash?
      2.什么是ANR?
  • 1
  • 2

第三部分 实践

1.一个APP的压测实践 
2.Monkey高级参数的应用 
3.CRASH结果析取 
4.ANR结果析取 
5.Monkey Script实例 
6.MonkeyRunner实例

第一部分 背景

1. 为什么要开展压力测试?

    提高产品稳定性

    提高产品的留存率
  • 1
  • 2
  • 3

2.什么时候开展压力测试?

    首轮功能测试通过后

    下班后的夜间进行
  • 1
  • 2
  • 3

第二部分 理论

手工测试场景

这里写图片描述

自动化测试场景

就拿查找实现自动化的话,对于手机来说它会

TouchInput(收集点击事件)–>KeyEvent(它会收到你点击键盘各种Key的事件)–>TouchSearch(收到你点击按钮的Touch事件)

然后就会返回一个联系人列表可以添加了

TouchSearch(收到你点击按钮的Touch事件)–>TouchName(对于手机来说同样收到一个Touch事件)

聊天嘛,你收到的也是一个Touch事件,因为你要点击用户头像,所以

TouchName(对于手机来说同样收到一个Touch事件)–>TouchFriend–>TouchKey(接着会受到你输入的各种文字)

图解:

这里写图片描述

Monkey

Monkey在哪?

在手机系统里,为了与它进行通讯,我们需要借助一个工具ADB

ADB

ADB是什么

这里需要借助一部 手机 和一台 WIndows电脑 ,通过USB链接,此时我们还需要建立一个软的连接,这个连接全程就是Android Debug Bridge,也就是Android调试桥。

Monkey Script

这里写图片描述

MonkeyRunner

这里写图片描述

这里写图片描述

MonkeyRunner APIs

MonkeyRunner APIs

MonkeyRunner 测试类型

这里写图片描述

压力测试结果

我们需要注意的两个地方:Crash 和 ANR

Crash 
相对于我们app来说就像是战斗机的起火爆炸 
这里写图片描述

ANR 
Application Not Responding,如下图: 
这里写图片描述

第三部分 实践

准备测试环境:

准备Android SDK环境 
准备Python环境

对于环境配置这里不做过多讲解

一个APP的压测实践

压测实践Step1:

在手机开发者选项中,将USB调试勾上

压测实践Step2:

确认手机和电脑已经连接成功 
adb devices来确认:cmd窗口输入adb devices,有以下信息就说明已经建立连接 
这里写图片描述

压测实践Step3:

安装测试app : adb install package.apk

压测实践Step4:

发送测试指令 : adb shell monkey 1000

之后会输出如下类似信息:

这里写图片描述

什么时候会出现两行ActivityResuming的信息呢,就是一个app从前台调入后台,又从后台调入前台就会出现这么一个信息.

Event injected:1000 表示我们输入的随机测试1000个事件,它完成的也是1000个事件.如果这里的数字与我们输入的数字小灯,则表明没有异常出现.如果有异常出现,则这个数字小于我们输入的数字.

压测实践Step5:

获取程序包名 : adb logcat | grep START , 
| 表示前一个命令的输出作为下一个命令的输入 
grep START表示抓取日志中包含有START标签的日志进行输出 
这里写图片描述 
这里我们主要关注cmp=后面的内容,在/之前的是app的包名,在/后面的是当前Activity的类名.Activity我们暂时不许要太关注,我们只需要关注这个包名。 
我们以计算器为例,当我们home返回桌面,点击进入计算器,cmd就会输出计算器的一些信息,如: 
这里写图片描述

压测实践Step6:

给指定包打压力 : adb shell monkey -p [packagename] [次数,如1000] ,,如adb shell monkey -p com.android.calculator2 1000,输出信息如下: 
这里写图片描述

Monkey高级参数的应用

1.throttle参数

指定事件之间的间隔:adb shell monkey --throttle<milliseconds>,例如adb shell monkey -p com.android.calculator2 --throttle 1000 10

2.seed参数

指定随机生成数的seed值 : adb shell monkey -s<seed> <event-count>,例如 : adb shell monkey -p com.android.calculator2 -s 100 50,在重复执行一遍命令就可以复现上一条命令执行的结果,这里的seed次数100和执行事件数50保持遇上一条命令数目相同便可复现上一次结果

3.触摸事件

设定触摸事件的百分比 : adb shell --pct-touch<percent>,意思就是monkey所有操作中点击事件占多大比例。例如 : adb shell monkey -v -p com.android.calculator2 --pct-touch 100 100‘-v’参数表示列出所有操作详情。如下图,红色部分就是执行的操作,其中Action_down和Action_up是一个点击事件,成对出现。 
这里写图片描述

4.动作事件

设置动作事件百分比 : adb shell monkey --pct-motion <percent> ,这个百分比和你其他事件之和要等于100。如果不等于100,它就会把剩余的比例随机操作。例如 : adb shell monkey -v -p com.android.calculator2 --pct-touch 50 --pct-motion 30 100,执行后各事件百分比如下: 
这里写图片描述

5.轨迹球事件

设定轨迹球事件的百分比 : adb shell monkey --pct-trackball<percent>

6.基本导航事件

设定基本导航事件的百分比,输入设备的上下左右 : adb shell monkey --pct-nav<percent>

7.主要导航事件

设定主要导航事件的百分比,兼容中间键,返回键,菜单按键 : adb shell monkey --pct-majornav<percent>

8.系统导航事件

与手机硬件相关的

设定系统导航事件的百分比,HOME,BACK,拨号及音量键 : adb shell monkey --pct-syskeys<percent>

9.启动Activity事件

设定启动Activity的事件百分比 : adb shell monkey --pct-appswitch<percent>,假设我们指定了30%,有4个Activity,它就会有30%部分在4个Activity里进行切换

10.不常用事件

设定系统导航事件的百分比,HOME,BACK,拨号及音量键 : adb shell monkey --pct-anyevent<percent>

11.崩溃事件

Crash

忽略崩溃和异常 : adb shell monkey --ignore-crashes<event-count>,monkey在遇到崩溃时会继续跑,直到遇见的崩溃数等于我们的设定数值。

11.超时事件

ANR

忽略超时事件 : adb shell monkey --ignore-timeouts<event-count>,monkey在遇到超时事件会继续跑,直到遇见的超时数等于我们的设定数值。

CRASH结果析取

实践过程:

  1. 安装可以引起Crash的App
  2. 执行App的压力命令
  3. 析取Crash的Exception信息

    注意:在cmd命令控制台输出的信息中CRASH: 后面的内容可以复制出来交给开发人员进行解决,在输出信息末尾会有一个seed的值,拷贝这个值并在命令中加上[-s seed值]便可复现上一次的测试。如果在测试过程中忽略了crash而继续执行则无法获取到seed值。

ANR异常测试结果析取

实践过程:

  1. 安装可以引起ANR的app
  2. 执行app的压力命令
  3. 析取ANR的Exception信息

    注意:在cmd命令控制台输出的信息中NOT RESPONDING:后面会开始输出ANR错误的类名位置,后面会紧跟当时手机系统的一些信息,如cpu,内存以及其他的一系列的异常信息,全部打印了出来。当出现这种异常信息我们可以将这些信息发送给开发人员debug进行处理。

手动点击获得ANR异常,查看日志方法: 
在cmd命令控制台,依次输入如下命令

  1. adb shell
  2. cd /data/anr/
  3. ls (会有一个traces.txt)
  4. more traces.txt

经历以上操作就可以把异常信息再控制台中输出了,我们可以把这些异常信息复制下来交由开发人员去分析。

Monkey Script

执行Monkey脚本命令 : adb shell monkey -f <scriptfile> <event-count>

1.DispatchTrackball命令(轨迹球事件)

可以帮我们完成点击操作

DispatchTrackball(long downtime,long eventide,int action,folat x,float y,float pressure,float size,int metstate,float xprecision,float yprecision,int device,int edgeflags)

downtime : 记录键最初被按下的时间 
eventide : 事件发生的时间 
action : 具体的操作过程 
x,y : 坐标点 
pressure : 压力的大小,范围是0-1 
size : 触摸的一个即使值,范围是0-1 
metstate : 当前按下met键的标识 
xprecision : x坐标的精确值 
yprecision : y坐标的精确值 
device : 事件的来源,事件的来源是0-x,0表示不来自物理设备 
edgeflags : 表示超出屏幕范围

action 0代表按下,1代表抬起,x和y代表坐标点

2.DispatchPointer命令(点击事件)

DispatchPointer(long downtime,long eventide,int action,folat x,float y,float pressure,float size,int metstate,float xprecision,float yprecision,int device,int edgeflags)

downtime : 记录键最初被按下的时间 
eventide : 事件发生的时间 
action : 具体的操作过程 
x,y : 坐标点 
pressure : 压力的大小,范围是0-1 
size : 触摸的一个即使值,范围是0-1 
metstate : 当前按下met键的标识 
xprecision : x坐标的精确值 
yprecision : y坐标的精确值 
device : 事件的来源,事件的来源是0-x,0表示不来自物理设备 
edgeflags : 表示超出屏幕范围

action 0代表按下,1代表抬起,x和y代表坐标点

3.DispatchString命令(输入字符串事件)

DispatchString(String text)

4.LuanchActivity命令(启动应用)

LuanchActivity(Package,Activity)

5.UserWait命令(等待事件)

UserWait(1000) , 传入毫秒数

5.DespatchPress命令(按下键值)

DespatchPress(int keycode) , #keycode 66 返回键

Monkey Script 实践

缺点:执行脚本过程中无法实现截屏操作

脚本后缀名.script

这里写图片描述

1.启动app 
2.点击输入框 
3.输入查询词 
4.点击键盘上的回车 
5.点击搜索按钮 
6.等待结果出现 
7.点击clear按钮

范例脚本: 
这里写图片描述 
解释: 
这里写图片描述

在获取点击坐标点时我们需要用到android_sdk里面tools文件夹下的一个uiautomatorviewer的一个工具 
使用:cmd命令进入到tools文件夹下,然后输入 ./uiautomatorviewer

uiautomatorviewer界面: 
左上角两个手机图标是获取当前Android设备的界面 
这里写图片描述

右下角bounds两个坐标点表示控件的左上角和右下角的坐标点。

脚本使用首先要从电脑push到手机中,命令如下: 
adb shell ***.script /data/local/tmp/ 
此时继续执行脚本命令: 
monkey -f ***.script <event-count> 
而此时回车并不能启动起我们指定的Activity而是超级用户,这里寻找原因就是我们的LaunchActivity()命令行有问题 
之所以出现这个问题是因为在app的AndroidManifest.xml里面activity标签没有android:exported="true"这一行代码,这样外部就无法调用起Activity。 
在一系列修改完成之后,在脚本里还需要在LaunchActivity()里将后面的Activity加上完整路径,包名+类名,这样才能正确启动

MonkeyRunner

1.MonkeyRunner API-alert(警告框)

void alert(String message,String title,String okTitle)

这里的脚本是一个python脚本,后缀名为.py 
这里写图片描述 
第一行表示是用Python编写的 
第二行表示编码格式 
第三行表示需要导入我们测试的模块 
第四行表示执行alert命令

执行命令: 
monkeyrunner ****.py 
monkeyrunner 在android-sdk/tools下面

2.MonkeyRunner API-waitForConnection

等待设备连接,如果有多个device id,则需要指明具体哪个设备

waitForConnection(float timeout,String deviceId) , timeout单位为秒

3.MonkeyRunner API-drag

拖动

drag(tuple start,tuple end, float duration ,integer steps) , timeout单位为秒 
start : 起始点 
end : 目标点 
duration : 手势持续时间 
steps : 插值点的个数,默认为10

4.MonkeyRunner API-press

按键

press(String keycode,dictionary type) , 
keycode 名:DOWN,UP,DOWN_AND_UP

5.MonkeyRunner API-startActivity

启动应用

startActivity(package+'/'+activity)

6.MonkeyRunner API-touch

点击

touch(integer x,integer y,integer type) 
x,y : 坐标值 
type : DOWN,UP,DOWN_AND_UP

7.MonkeyRunner API-type

输入

type(String text)

8.MonkeyRunner API-takeSnapshot

截屏

MonkeyImage takeSnapshot(),会返回MonkeyImage 类型数据

9.MonkeyRunner API-sameAs

图像对比

boolean sameAs(MonkeyImage other,float percent)

10.MonkeyRunner API-writeToFile

保存图像

void writeToFile(String path,String format)

path : 保存路径 
format : 保存格式,如.jpg,.png,.jpeg

MonkeyRunner实践

这里写图片描述

这里写图片描述

压力测试至此就告一段落了,本文是通过视频来实时做的文章笔记,想要看原视频的链接点这里

发布了43 篇原创文章 · 获赞 95 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/weixin_42139375/article/details/102654580