软件测试——稳定性测试:adb Monkey
Monkey
- 1. Monkey
- 1.1 Monkey 是什么
- 1.2 Monkey 测试场景
- 1.3 Monkey 特点
- 1.4 Monkey 在哪里
- 1.5 测试准备事项
- 1.6 Monkey 参数列表
- 2. 基本命令
- 3. 常用参数
- 4. 事件类型
- 5. 调试参数
- 6. 日志管理
- 7. 日志错误定位
- 8. Monkey测试可以发现的问题
1. Monkey
1.1 Monkey 是什么
Monkey是一款Android app的自动化测试工具,主要用于app的压力测试和稳定性测试。
工作原理是通过向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等操作,来对设备上的程序进行测试,检测程序长时间的稳定性,多久的时间会发生异常。
1.2 Monkey 测试场景
- app压力测试、稳定性测试。(功能测试—>专项测试(DFX 兼容性,稳定性)
- app的耗资源情况(耗电量,流量,内存,cpu等)
1.3 Monkey 特点
- 没法指定具体业务,发送一些伪随机事件(seed值)
- 通过参数来做一些设定
1.4 Monkey 在哪里
Monkey工具存在Android 系统中,使用Java语言写成,jar包在 Android 文件系统中的存放路径是:/system/framework/monkey.jar; Monkey.jar 程序是由一个名为“monkey”的 shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey; monkey需要通过adb来唤醒,即通过在cmd窗口中执行: adb shell monkey{+命令参数} 来进行 Monkey测试。
1.5 测试准备事项
- 手机准备
1)开发者模式: usb调试
2)解锁(常亮)
3)充足电量
4)放在不影响其它人的地方
5)打开wifi/数据通信
- 环境准备
1)jdk
2)sdk
3)adb
- app应用准备
(登录状态)关闭免密支付
1.6 Monkey 参数列表
图中的参数并不算全,下面会介绍常用的参数:
2. 基本命令
adb devices #测试当前连接设备adb shell pm list packages #查看你的手机所有的安装包adb shell pm list packages -3 #查看你的手机所有的第三方安装包#注:尽量少安装第三方软件,这样可以尽快的找到想要的安装包名称adb shell #可执行shell命令top | grep (包名) #获取该包的CPU内存使用率adb shell dumpsys activity | findstr mFocusedActivity # 获取当前手机运行的包名
3. 常用参数
1)-p 参数:表示指定测试的程序(空格后面跟安装包名字)
例:指定一个app包执行
adb shell monkey -p 包名 100
解析:此时指定的软件会被打开并开始乱点乱按100次。
例:指定多个app包执行
adb shell monkey -p 包名 -p 包名 100
解析:此时2个app一起执行 可以去测试两个软件/安装包同时打开是否产生冲突!
例:不指定包
adb shell monkey 100
解析:此时随机打开一个软件乱点乱按100次。
2)-v:日志详细程度(最高支持‘-v -v -v’三级)
指定日志级别 -v
adb shell monkey -p cn.mopon.film -v 100
说明:日志级别-v :缺省值,仅提供启动提示、测试完成和最终结果等少量信息。
指定日志级别 -v -v
adb shell monkey -p cn.mopon.film-v - 108
说明:日志级别-v -v:提供提供较为详细的日志,包括每个发送到Activity的信息。
指定日志级别 -v -v -v
adb shell monkey -p cn.mopon.film -v -v -v 108
说明:日志级别-v -v -v:提供更详细的日志,包括了测试中选中/未选中的Activity信息。
3)-s:种子,记忆功能,一条命令无论执行几次顺序全一样,方便问题复现
举例:monkey1:点击-滑屏-系统按键-屏幕翻转——对应的命令为adb shell monkey......seed 123.......
解析:当发现此用例/执行有问题,就可以利用种子123做复现,再次执行命令,只要种子是seed 123即可。
4)- throttle:种子,记忆功能(操作间隔时间,单位毫秒)
举例:adb shell monkey -p com.tencent.news -v -s 13 -throttle 500 1000
举例解析:
指定包名:com.tencent.news
Log日志: -v = 一级 最多三个:-v -v -v = 最高级 = 三级
种子记忆:13,自定义,之后再执行命令,执行顺序一样
单步间隔时间:500毫秒 = 半秒(1000毫秒 = 1秒)
总计执行事件:1000操作
在导出的log/txt中 Sleeping for xxxx milliseconds 就是- throttle xxxx(毫秒)!!!
4. 事件类型
图片解析:
0:触摸事件百分比,参数–pct-touch
1:滑动事件百分比,参数–pct-motion
2:缩放事件百分比,参数–pct-pinchzoo
3:轨迹球事件百分比,参数–pct-trackball
4:屏幕旋转事件百分比,参数–pct-rotation
5:基本导航事件百分比,参数–pct-nav
6:主要导航事件百分比,参数–pct-majornav
7:系统事件百分比,参数–pct-syskeys
8:Acitivity启动事件百分比,参数–pct-appswitch
9:键盘翻转事件百分比,参数–pct-flip
10:其它事件百分比,参数–pct-anyevent --ignore-crashes --ignore-timeouts等
举例:
1)命令:–pct-touch 空格后加数字,设定触屏时间生成的百分比。触屏事件是一个有手指按下,抬起事件的手势。
adb shell monkey --throttle 3000 --pct-touch 50 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定触屏的事件占比为50%。
2)命令: --pct-motion 设定滑动事件生成的白分比。滑动事件是一个先在某一个位置手指按下,滑动一段距离后再抬起手指的手势。
adb shell monkey --throttle 3000 --pct-motion 50 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定滑动的事件占比为50%。
3)命令: --pct -trackball 设定轨迹球事件生成的百分比。轨迹球事件是包含一系列随机移动和单击事件的事件。
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定轨迹球的事件占比为50%。
4)命令: --pct-nav 设定基本导航事件生成的百分比。基本导航事件是模拟方向性在设备上输入向上、向下、向左、向右的事件。
adb shell monkey --throttle 3000_--pct-nav 40 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定基本导航事件的占比为40%。
5)命令 : --pct-majornav 设定主要导航事件生成的百分比。主要导航事件通常会导致UI产生回馈信息,如单击Back键、Home键、Menu键等。
adb shell monkey --throttle 3000 --pct-majornav 40 -p com.tencent.news 1000
解析:向腾讯新闻发送1000次随机事件,每次事件间隔为3秒。其中设定主要导航事件的占比为40%。
6)命令 : --ignore-security-exceptions 通常情况下,指定应用程序发生许可错误时如证书许可,网络许可等),monkey将停止运行。现在会继续:
adb shell morkey --throttle 3000 --pct-trackball 50 -p com.tencent.news --ignore-security-exceptions 100
解析:指定了该参数,即使应用程序发生许可错误,monkey会继续向系统发送事件,直到指定事件全部运行完毕。
注:在log/txt文件中,每个时间后面的百分比占用可以自己设置,例如滑动事件要占比20% 则在命令中:adb shell monkey…–pct-motion 20…就可以在log/txt文件中看到,没有指定其它事件占比,则其它时间随机瓜分占比。
5. 调试参数
1)–ignore-crashes
指即使应用程序崩溃(Force& Close错误) ,Monkey依然会发送事件,直到事件计数达到指定的次数为止。
如 : adb shell monkey -p cn.mopon.film --ignore-crashes 10000
解析:即使应用程序崩溃,Monkey依然会发送事件,直到事件计数达到10000为止。
2)–ignore-security-exceptions
指APP发生许可证书错误时,Monkey依然继续发送事件,直到事件数目达到目标值为止。
如:adb shell monkey -p cn.mopon.film --ignore-security-exceptions 1000
3)–ignore-timeouts
指app在发生ANR(Application No Responding)错误时,Monkey是否停止运行如果使用-ignore-timeouts参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
如:adb shell monkey -p cn.mopon.film -ignore-timeouts 1000
4)–kill-process-after-error
指APP发生错误时,应用程序停止运行并保持在当前状。
如:adb shell monkey -p cn.mopon.film --kill-process-after-error 1000
当应用程序发生错误时,应用程序停止运行并保持在当前状态,注意系统并不会结束该应用程序的进程。
也可以多个控制参数一起使用:
adb shell monkey -p cn.mopon.film --ignore-crashes --ignore-timeouts 10000
注:当app崩溃,发生ANR错误时继续测试。
6. 日志管理
- 作用:
Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。
-
查看:
1)直接在dos窗口下执行命令后会显示出来
2)例如adb shell adb shell monkey -p 包名 -v -v -v 100
,在命令最后加上>E:\monkey.log -
monkey 日志保存方法:
1)保存在PC中
2)保存在手机上
3)标准流和错误流分开保存 -
保存在PC中:
举例:
adb shell monkey -v -v 100 > e:\monkeylog.txt
或者:adb shell monkey -v -v 100 > e:\monkeylog.log
- 保存在手机上:
adb shell monkey -v 100 >/sdcard/monkeylog.txt
打开文件管理器就可以查看。
- 标准流和错误流分开保存
举例 1:adb shell monkey -v 100 1>e:\monkey.txt 2>e:\error.txt
解析:在E盘中会显示monkey.txt和error.txt文本,monkey.txt保存着Monkey正常运行日志,error.txt保存着Monkey异常日志。
举例 2:指定手机文件运行日志和异常日志保存到E盘下。
adb shell monkey - f /sdcard/wxz.txt -v -v 1 1>e:\monkey.txt 2>e:error.txt
解析:第一个1代表一个文件,第二个1代表正常运行日志,执行上述命令,Monkey的运行日志和异常日志将被分开保存。
7. 日志错误定位
1)程序无响应的问题,在日志中搜索:ANR 无响应。
可能的原因有:
a、当前有耗时操作在UI线程指定,导致卡UI了。
b、在5s内没有响应输入事件( eg:按键、触摸屏幕)。
c、BroadcastReceiver在特定时间内(10s)无法处理完成在logcat将出现anr问题的进程号复制,然后在trace.txt文件里。
按ctrl+F查找,粘贴进程号,查找对应的问题。
2)崩溃问题
在日志中搜索:Exception,如果出现空指针,则肯定有bug
常见错误类型:
异常与错误类型 说明
java.lang.NullPointException 空指针异常
java.lang.ArrayIndexOutOfBoundsException 数组溢出
java.lang.classNotFoundException 类不存在
java.lang.ArithmeticException 数学运算异常
java.lang.IllegalArgumentException 方法参数错误
java.io.FileNotFoundException 文件未找到
java.lang.NumberFormatException 数值转化异常
java.lang.StackOverFlowError 推展异常错误
java.lang.OutOfMemoryError 内存溢出错误
3)monkey执行中断搜索:crash、error
8. Monkey测试可以发现的问题
Android平台应用程序可能产生以下四种Crash:
App层(JAVA应用程序):
1、Force Close Crash
2、ANR Crash
Native层(本地框架):
3、Tombstone Crash(Native Crash)
Kernel层(LINUX内核空间)
4、Kernel Panic
注:Monkey的参数没有顺序要求,但是随机事件数是一定要放在最后的!!!
相关文章:

软件测试——稳定性测试:adb Monkey
Monkey 1. Monkey1.1 Monkey 是什么1.2 Monkey 测试场景1.3 Monkey 特点1.4 Monkey 在哪里1.5 测试准备事项1.6 Monkey 参数列表 2. 基本命令3. 常用参数4. 事件类型5. 调试参数6. 日志管理7. 日志错误定位8. Monkey测试可以发现的问题 1. Monkey 1.1 Monkey 是什么 Monkey是一…...

前端vue实战项目结构、常用编辑器vs code 配置
5.Complete JSDoc Tags 6.Custom CSS and JS Loader 7.Debugger for Chrome 8.EditorConfig for VS Code 9.ESLint ☆☆☆ 10.gitignore 11.GitLens — Git supercharged 12.npm 13.PostCSS syntax !important 14.Vetur ☆ 15.vscode-icons 16.vue-i18n 17.Markdow…...
Linux系统性能优化实战经验
1、影响Linux系统性能的因素一般有哪些? Linux系统的性能受多个因素的影响。以下是一些常见的影响Linux系统性能的因素: CPU负载:CPU的利用率和负载水平对系统性能有直接影响。高CPU负载可能导致进程响应变慢、延迟增加和系统变得不稳定。 …...

2024广东省职业技能大赛云计算赛项实战——Ansible部署Zabbix
Ansible部署Zabbix 前言 今年的比赛考了一道Ansible部署Zabbix的题目,要求就是用两台centos7.5的云主机,一台叫ansible,一台叫node,使用对应的软件包,通过ansible节点控制node节点安装zabbix服务。这道题还是算比较简…...

Linux—— ansible循环
1.如果有大量的变量要定义,如果多个变量本身类型相同或类似 再比如,同一个剧本,给主机同时安装多个软件包 按照已有的用法,每个软件包都对应不同变量,还会涉及到改剧本 2.现在可以用清单,以及playbook里…...

RabbitMQ 开发指南
连接RabbitMQ 连接方式一: 也可以选择使用URI的方式来实现 连接方式二: Connection接口被用来创建一个Channel,在创建之后,Channel可以用来发送或者接收消息。 Channel channel conn.createChannel();使用交换器和队列 声明…...

ElasticSearch学习笔记(二)文档操作、RestHighLevelClient的使用
文章目录 前言3 文档操作3.1 新增文档3.2 查询文档3.3 修改文档3.3.1 全量修改3.3.2 增量修改 3.4 删除文档 4 RestAPI4.1 创建数据库和表4.2 创建项目4.3 mapping映射分析4.4 初始化客户端4.5 创建索引库4.6 判断索引库是否存在4.7 删除索引库 5 RestClient操作文档5.1 准备工…...

python离线安装第三方库、及其依赖库(单个安装,非批量移植)
文章目录 1.外网下载第三方库、依赖库2.内网安装第三方库3.补充附录内网中离线安装python第三方库,这时候只能去外网手动下载第三方库,再传回内网进行安装。 问题是python第三方库往往有其前置依赖包,你很难清楚某个第三方库依赖的是哪些依赖包,更难受的是依赖包可能还有其…...

昨天发的 npm 包,却因为 registry 同步问题无法安装使用
用过 HBuilderX 云打包的都知道,云上面的 Android 环境很有限,其实并不能覆盖 uniapp 生态所有的版本,甚至说只能覆盖最新的一两个版本。 如果你需要用到 HBuilderX 安卓云打包,就必须及时跟进 HBuilderX 的版本更新,…...
Redis 数据恢复及持久化策略分析
在分布式系统中,Redis作为高性能的键值存储数据库,广泛应用于缓存、会话管理、消息队列等场景。对于Redis数据的可靠性,持久化是至关重要的一环。当Redis宕机时,如何恢复数据成为一个关键问题。这篇文章将详细分析Redis的数据恢复…...
vscode 快捷键侧边栏
_____ 配置 vscode 快捷键 visual studio code - open explorer and close sidebar with the same key - Stack Overflow { "key": "ctrlshifte", // when Explorer not open // "command": "workbench.view.explorer", // either…...
FreeRTOS:1、任务通知vTaskNotifyGiveFromISR保证实时性
文章目录 背景解释意义 背景 首先,我们看以下代码: #include "FreeRTOS.h" #include "task.h"TaskHandle_t s_task_handle NULL;void vTaskFunction(void *pvParameters) {for (;;) {// 等待通知ulTaskNotifyTake(pdTRUE, portMA…...
监督学习:从数据中学习预测模型的艺术与科学
目录 引言 一、监督学习的基本概念 1、数据集 2、特征 3、标签 4、模型 二、监督学习的原理和方法 1、基本原理 2、常用方法 三、监督学习的定义与分类 1、 定义 2.、分类 四、为什么是监督学习? 1、 明确的学习目标 2、高准确率 3、易于评估 4、 …...
深入理解Java虚拟机(JVM)中的垃圾回收器
垃圾回收(Garbage Collection, GC)是现代编程语言中用于管理内存的重要机制,特别是在Java虚拟机(JVM)中。 它的基本原理是自动检测和释放不再被程序使用的内存,以避免内存泄漏和提高程序执行效率。 1.GC的基…...

视频集市新增支持多格式流媒体拉流预览
流媒体除了常用实时流外还有大部分是以文件的形式存在,做融合预览必须要考虑多种兼容性能力,借用现有的ffmpeg生态可以迅速实现多种格式的支持,现在我们将按需拉流预览功能进行了拓展,正式支持了ffmpeg的功能,可快捷方…...

定时器-前端使用定时器3s轮询状态接口,2min为接口超时
背景 众所周知,后端是处理不了复杂的任务的,所以经过人家的技术讨论之后,把业务放在前端来实现。记录一下这次的离大谱需求吧。 如图所示,这个页面有5个列表,默认加载计划列表。但是由于后端的种种原因,这…...
python实践笔记(二): 类和对象
1. 写在前面 最近在重构之前的后端代码,借着这个机会又重新补充了关于python的一些知识, 学习到了一些高效编写代码的方法和心得,比如构建大项目来讲,要明确捕捉异常机制的重要性, 学会使用try...except..finally&…...
指定GPU跑模型
加上一个CUDA_VISIBLE_DEVICES0,2就行了,使用0卡和2卡跑模型,注意多卡有时候比单卡慢,4090无NVlink,数据似乎是通过串行的方式传输到多个gpu的,只不过单个gpu是并行计算,数据在gpu与gpu之间似乎是串行传输的…...
Windows桌面运维----第五天
1、华为路由怎们配置IP、划分vlan、互通: 1、用户模式→系统模式; 2、进入相关端口,配置IP地址; 3、开通相应vlan,设置vlanX、IP地址; 4、绑定相关端口,设置端口类型; 5、电脑设置IP&#…...
bash和dash的区别(及示例)
什么是bash、dash Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。 GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接࿰…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...