前言

抄袭文章来源:Android App专项测试-压力测试篇

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

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

第一部分 背景

探讨两个问题:

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

第二部分 理论

  1. 手工测试场景
  2. 自动测试场景
  3. Monkey工具
  4. ADB命令
  5. Monkey Script
  6. MonkeyRunner
  7. 压力测试结果
  • 什么是Crash?
  • 什么是ANR?

第三部分 实践

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

第一部分 背景

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

  • 提高产品稳定性
  • 提高产品的留存率

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

  • 首轮功能测试通过后
  • 下班后的夜间进行

第二部分 理论

手工测试场景

自动化测试场景

图解:

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

  • 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

Monkey和MonkeyRunner区别:

MonkeyRunner APIs

MonkeyRunner 测试类型

压力测试结果

我们需要注意的两个地方:CrashANR

Crash

相对于我们app来说就像是战斗机的起火爆炸

ANR

Application Not Responding,如下图:

第三部分 实践

1.准备测试环境:

  • 准备Android SDK环境
  • 准备Python环境

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

2.一个APP的压测实践

压测实践Step1:

  • 开发人员选项中,将USB调试勾选上

    压测实践Step2:

确认手机和电脑已经连接成功,多种方式,这了介绍命令行模式
cmd窗口输入adb devices


如果cmd输入adb提示“不是内部或外部命令”:

在环境变量下配置adb地址即可


adb全称:android调试桥(android debug bridge),我们一般连接手机都是下载该连接桥才可以和AS代码进行真机调试

压测实践step3:

  • 安装测试app:adb install 路径/xx.apk

压测实践setp4:

  • 发送测试指令:adb shell monkey 1000

输出结果如下:



什么时候会出现两行ActivityResuming的信息:当一个app从前台调入后天,又从后台调入前台就会出现这么一个信息。

Event injected:700 表示我们输入的随机测试1000个事件,他只完成了700个,并且出现了相应的报错。如果这个数字与我们输入的数字相等,表示没有异常。如果改数字小于我们输入的数字,则表示有异常出现

java.lang.SecurityException: You need MANAGE_USERS permission to: check if specified user a managed profile outside your profile group

这里不具体讨论该bug,这边采用随机1000个时间爆出来的bug

压测实践step5:

  • 获取程序包名:adb shell “logcat | grep START”,还有一种方法,cmd命令中先:adb shell,然后:logcat | grep START

|表示前一个命令的输出作为下一个命令的输入 grep START表示抓取日志中包含有START标签的日志进行输入。

这里我们需要关注cmp= 后面的内容,在/之前的是app包名,/之后当前Activity类名

压测实践step6:

  • 给指定的包打压力: adb shell monkey -p [packagename] [次数,例如1000],如 adb shell monkey -p com.gxgroup.xx1000

    慢慢解决吧,操!!!

Monkey高级参数的应用

1.throttle参数

  • 指定实践之间的间隔: adb shell monkey --throttle,例如 adb shell monkey -p com.gxgroup.pkpt --throttle 1000 10

2.seed参数

  • 随机生成数的seed值:adb shell monkey -s <event_count> ,例如:adb shell monkey -p com.gxgroup.pkpt -s 100 50,在重复执行一遍命令就可以复现上一条命令执行的结果,这里seed次数100和执行次数50,保持遇上一条命令数目相同遍复现上一次结果(这里说的不好理解,往下看,后面有针对性描述)

3.触摸事件

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

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

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

10.不常用事件

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

11.崩溃事件
Crash

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

12.超时事件

ANR

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

CRASH结果析取

实践过程:

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

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

ANR异常测试结果析取

实践过程:

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

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

手动点击获得ANR异常,查看日志方法:

在cmd命令控制台,依次输入如下命令

  • adb shell
  • cd /data/anr/
  • ls (会有一个traces.txt)
  • more traces.txt

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

Monkey Script

  • 执行Monkey脚本命令 : adb shell monkey -f

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) , 传入毫秒数

6.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实践


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

总结

以上压力测试后面的涉及到代码的基本上我也是直接拷贝过来的,也不打算去实践,如果有兴趣的可以去认真看看,这里更偏重于针对测试人员

android测试篇(四)android专项测试之压力测试相关推荐

  1. Android专项测试之崩溃测试(CPU)

    Android专项测试之崩溃测试(CPU) 崩溃问题类型 ❖ ANR:❖ 主线程5s内没响应 ❖ Java Crash: ❖ 未捕获的android vm异常 ❖ Native Crash: ❖ 未处 ...

  2. app专项测试之兼容性测试

    文章末尾给大家留下了大量的福利 前言 昨天给大家唠了唠怎么测试app,那么今天笔者还想和大家来唠唠app的专项测试之兼容性测试,废话呢笔者就不多说了,直接进入主题. 1.APP兼容性测试认识 随着AP ...

  3. 【Android取证篇】Android设备USB调试打开方式(开发者模式)

    [Android取证篇]Android设备USB调试打开方式(开发者模式) Android各个版本系统手机开启"USB调试"的入口不全相同,仅供参考-[蘇小沐] 1.[Androi ...

  4. 压力测试是什么?为什么要压力测试?怎么使用压力测试?

    想必很多人在第一次接触压力测试时都会发出如同题目中的疑惑,压力测试是什么?为什么要进行压力测试?我第一次接触压力测试是在电脑突然死机的情况下,装机师傅给我重装系统后进行了压力测试后才有所了解:这时候才 ...

  5. AIDA64压力测试教程,AIDA64压力测试多长时间,AIDA64压力测试结果怎么看

    硬件管理工具AIDA64功能全面专业,操作简便易学,使用AIDA64进行系统稳定性测试逐渐成为更多用户的选择.可能有很多用户对如何使用AIDA64进行系统稳定性测试不太了解,系统稳定性测试也称为压力测 ...

  6. 压力测试时软件崩溃怎么办,完善压力测试 避免系统崩溃恶果

    压力测试对系统的重要作用 我们对应用程序进行压力测试时经常会出现这种情况,就是测试到了最后却发现不明白测试结果有什么意义?实际上,当我们都不明白压力测试的意义时,我们就不能设计出各种极限测试用例. 压 ...

  7. Android 白盒测试之单元测试(junit),黑盒测试之mokey测试

    导言: 做安卓也有几个年头,对于小项目基本都不去单元测试和稳定性测试等,都是在出现异常后通过debug处理或log打印即可解决,当然对于大的项目,由于运行时效问题,加快开发效率,一些测试方法必须要做, ...

  8. Android基础篇(四)

    AdapterView 指使用适配器来配置多个内容显示的视图,代表的有ListView(列表).GridView(九宫格).ExpanableListView(分组列表) ListView <L ...

  9. 专项测试之App测试

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 文章目录 一.手机 App 测试的范围 二.手机 App 测试的方法 1.功能模块测试 1.1 运行 1.2 应用的前后台切换 1 ...

最新文章

  1. python3 内置函数map 返回的迭代器转为列表
  2. ESTabBarController
  3. 新方向!DeepMind提出人工生命框架,促进智能生物体的出现
  4. linux动态链接库的使用,Linux动态库soname的使用
  5. spring boot中@ResponseBody等注解的作用与区别
  6. c4d支持mac系统渲染器有哪些_在macOS Catalina发布前检查哪些应用程序不支持64位系统...
  7. python-字符串·文件·集合操作
  8. 2007年10月小记
  9. socket 网络编程
  10. iOS开发多线程篇—GCD的常见用法
  11. 使用 fail2ban 防御 SSH 服务器的暴力破解
  12. 通信原理最佳接收-匹配滤波器
  13. alfafile中转站免费_免费、不限速的文件中转站or网盘
  14. Linux系统安装详解
  15. rank函数在c语言怎么用,如何利用RANK函数排名?RANK函数怎么使用?
  16. 为什么沿着梯度相反的方向更新参数
  17. THINKPHP网站漏洞怎么修复解决
  18. 学神、学霸的学生,靠的不是1%的天赋和智商,更不是努力,而是它
  19. 【李佳辉_周报_2022.10.30】
  20. 万润新能源递交上会稿:单季营收15亿 拟募资12.6亿

热门文章

  1. 被哈佛录取后,他骑行4300公里旅行回家
  2. 在 win7 上简单搭建ftp服务器
  3. 编程达人教你如何快速掌握一门编程语言附技术书阅读方法论
  4. 海门开发区机器人项目_点赞!海门“经洽会”现场签约10亿元以上项目21个
  5. Java餐饮酒店管理系统PC端,使用SpringBoot、Layer,Beetl
  6. 成都拓嘉启远:如何排查拼多多星级下降的原因
  7. 为什么我的windows 10 电脑关机时,电脑灯延迟很久才熄灭?
  8. 4.3 CPU性能侦测
  9. TiDB 在安信证券资产中心与极速交易场景的实践
  10. Linux--进程与任务管理(查看和控制进程及计划任务管理)