Android Monkey工具介绍与使用

        过于爽快的承认失败,就可能发觉不了曾经与正确非常接近。大家好,依旧是在翻看旧文档的时候,发现一篇关于Monkey的介绍和使用,Monkey这款工具在软件测试中主要用于进行压力测试和稳定性测试。它可以模拟大量随机的用户操作,对应用程序进行长时间的高强度测试,以发现潜在的稳定性问题、崩溃问题以及其他异常情况。通过 Monkey 测试,可以在一定程度上评估应用在极端情况下的表现。

Monkey介绍

什么是Monkey

        Monkey是Android系统自带的一个命令行工具,可以在Android模拟器或手机设备中运行。通过向Android系统发送伪随机用户事件流(如屏幕的点击、滑动和系统按键操作等),实现对Android App进行稳定性测试。

Monkey的特点

我们可以在CMD命令行或adb shell命令行执行命令,根据一个特定命令来发送信息。

使用Monkey执行测试,具有如下特点:

(1)如果限定了Monkey运行在特定包上,当监测到试图转到其他包的操作,将对其进行阻止。

(2)如果应用程序崩溃或接收到任何失控异常,或程序无响应(application not responding),Monkey将记录对应的错误日志,并根据命令行参数判断是停止运行还是继续运行。

(3)按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。

(4)不支持条件判断,也不支持读取待测界面的UI值来执行验证和操作。

Monkey的介入时间

等产品比较稳定,没有明显或很多bug的时候,再使用Monkey进行稳定性测试。

Monkey操作

基本操作步骤

  1. 启动手机(真机或者虚拟机都可以),在其中安装要测试的应用。例如:百度地图。
  2. 执行monkey命令
  3. 进入手机系统(adb shell,如有多台设备需要指定设备 -s参数)
  4. 连接设备(adb connect 设备ID)
  5. 打开CMD命令行窗口

Monkey命令示例

        在模拟器上安装百度地图,可手动打开并打开地图显示页。打开CMD命令行执行adb shell进入 Linux命令行界面。执行如下命令,可看到Monkey的随机操作效果。

monkey -p com.baidu.BaiduMap --ignore-crashes --ignore-timeouts --ignore-native-crashes  --pct-motion 39 --pct-pinchzoom 34 --pct-trackball 20 --pct-touch 7 -s 1 -v -v -v --throttle 200 20000

        除了上面执行方式外,也可以不进入adb shell,在DOS命令行直接执行adb shell monkey命令。如下:

adb shell monkey -p com.baidu.BaiduMap --ignore-crashes --ignore-timeouts --ignore-native-crashes  --pct-motion 39  --pct-pinchzoom 34 --pct-syskeys 0 --pct-trackball 20 --pct-touch 7  -s 1 -v -v -v --throttle 200 20000

强制关闭monkey

        如果我们运行之后发现设置错误,运行了别的应用,需要中止monkey测试过程;或者monkey在运行测试中出现故障,需要中止进程,怎么实现呢?

根据monkey进程的启动方式,分为以下两种情况:

  1. monkey进程通过CMD命令行直接执行adb shell monkey启动:
  2. monkey进程通过先执行adb shell,进入Linux环境再执行monkey命令启动。

在第一种情况下,采用如下方式终止Monkey进程:

打开一个新的CMD窗口,输入命令:

adb shell ps |findstr "monkey"

查出com.android.commands.monkey 进程记录,记录其进程号(pid).

adb shell kill 进程号

杀掉monkey进程

在第二种情况下,结束Monkey进程则比较简单,直接Ctrl+C即可结束Monkey进程运行。

Monkey命令和参数

monkey 程序组成

1、Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;

2、Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;

monkey命令帮助

命令:

adb shell monkey -help   

运行结果:如下图。

Monkey命令参数

monkey基本参数

-p
 参数-p用于约束限制,用此参数指定一个或多个包(Package,即App)
 不指定-p参数的话会对整机进行测试,即对所有APP进行测试。


-s
 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同。
 执行monkey所产生的事件顺序,相当于一个flag,设置这个参数是为了更好地复现Bug。
 Seed值如果不指定,系统会自动生成
 seed值取值范围:1~9223372036854775807 (2的63次方-1)

如:

adb shell monkey -p com.test -v -s 10 100

第一次运行时出现了bug,但从日志也看不出来什么,再运行一次

adb shell monkey -p com.test -v -s 10 100

它的事件执行顺序与上一次相同,这样就有利于你发现产生bug的地方了。

-v  日志级别
Level 0 

示例:

adb shell monkey -p com.baidu.BaiduMap -v 100

说明:仅提供启动提示、测试完成和最终结果等少量信息

Level 1

示例:

adb shellmonkey -p com.baidu.BaiduMap -v -v 100

说明:提供较为详细的日志,包括每个发送到Activity的事件信息

Level 2

示例:

adb shellmonkey -p com.baidu.BaiduMap -v -v -v 100

说明:最详细的日志,包括了测试中选中/未选中的Activity信息

adb shell monkey  --throttle 3000 100

 --randomize--throttle
结合--throttle使用,随机延迟范围为0到throttle指定的时间
示例:

adb shell monkey --throttle 3000 --randomize-throttle 100

 --pkg-whitelist-file 白名单
 只执行在白名单中的apk
 把设置的白名单的包写入到一个txt文档里面(文档和路径名不能有中文)
 如果想指定多个程序被执行,则在文件中添加多个包名,注意包名与包名之间均用回车键换行。
 把这个文件放入到安卓手机中,放在/data/local/tmp下面:

adb push D:\whitelist.txt /data/local/tmp   

adb shell monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt 200

--pkg-blacklist-file 黑名单
 执行除了黑名单中以外的apk
 设置方法和白名单类似,把文件名改为blacklist
 示例:

adb shell monkey --pkg-blacklist-file /data/local/tmp/blacklist.txt 200

  

--ignore-crashes
 用于指定当应用程序崩溃时(Force& Close错误),Monkey是否停止运行。
 如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。


--ignore-timeouts
忽略应用程序发生ANR(Application No Responding)错误时,直到事件数执行完成

--ignore-native-crashes
忽略本地代码造成的崩溃,直到事件数执行完成

--ignore-security-exceptions count
 应用程序权限错误发生后继续发送事件
 如果你希望monkey在应用程序权限错误发生后继续发送事件,则需要用到--ignore-security-exceptions选项。
 如果不设置此选项,monkey遇到此类权限错误将停止运行
随机事件个数,必填项

Monkey事件百分比参数

--pct-事件名称 百分比(用0-100的整数表示)

--pct-touch     触摸事件,点击事件的百分比。编号为:0
--pct-motion 动作事件,设定移动事件百分比,直线滑动。编号为:1
--pct-pinchzoom 缩放事件百分比,比如放大或者缩小的操作。编号为:2
--pct-trackball 轨迹球事件百分比,不常用。编号为:3。现在手机基本没有滚动球,但滚动球事件中包含曲线滑动事件,在被测程序中需要曲线滑动时可以使用此参数
--pct-rotation     屏幕旋转事件百分比,横屏竖屏。编号为:4
--pct-nav     基本导航事件百分比。编号为:5 包括上下左右,如方向输入设备的输入,老人机的上下左右键,智能机上没有
--pct-majornav 主要导航事件百分比。号为:6例如中间键,回退键,菜单键
--pct-syskeys     系统按键事件百分比。编号为:7这些按钮一般专供系统使用,如:Home,Back,Start Call,End Call,音量控制
--pct-appswitch  Activity启动事件百分比/调整APP切换事件的百分比。编号为8
--pct-flip     键盘翻转事件百分比/键盘的隐藏,出现。编号为9
--pct-anyevent 其他事件百分比。编号为10如按键,在其他设备上不常用的按钮等

注意:

1.如果不添加任何事件百分比参数,系统将在各种事件中随机分配比例;
2.所有事件百分比相加应小于等于100,若小于100,则剩余比例将随机分配;
3.手动设置时如何分配比例,要根据应用类型决定。

Monkey日志管理

        我们使用Monkey进行测试,目的是测试应用的稳定性,在运行时是否发生了诸如崩溃或无响应的问题。Monkey通过日志来记录执行过程以及其中的出错信息。默认情况下,Monkey日志打印在命令行窗口(Windows CMD窗口或adb shell窗口),显示范围有限,内容比较多的时候,无法查看先前生成的内容。而且,如果关闭了命令行窗口日志就丢失了。所以我们要处理的第一个问题,就是日志的保存。

monkey日志保存

        Monkey运行日志可以保存在PC中,也可以保存在移动设备(或模拟器)上。而且保存在手机上时,可以将标准流和错误流分开保存。

1、保存在PC中
前提是Monkey测试在PC端执行,命令格式如下:

adb shell monkey [选项参数] 事件数 >Windows文件全路径

此时所有信息输出到一个日志文件。例如:

adb shell monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 >d:\monkey.log


2、保存在移动设备(或模拟器)上
        前提是Monkey测试在移动设备(或模拟器)执行,先通过执行adb shell进入设备中。   有两种保存方式:

标准信息、错误信息保存在同一个文件,命令格式如下:

monkey [选项参数] 事件数 1>Linux文件全路径 2>&1

例如:

monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 1>/sdcard/monkey.log 2>&1

 标准信息、错误信息分开保存在两个文件,命令格式如下:

monkey [选项参数] 事件数 1>Linux文件全路径 2>Linux文件全路径

 例如:

monkey -p com.baidu.BaiduMap -v -v -v --throttle 200 100 1>/sdcard/monkey_std.log     2>/sdcard/monkey_error.log

Monkey日志分析

        Monkey日志分析是Monkey测试中非常重要的一个环节,通过日志分析,可以获取当前测试对象在测试过程中是否发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。

Monkey日志详解

Monkey日志由以下几部分组成:

1、测试命令信息:包括随机种子、事件总数、允许测试包和使用的Activity、各事件百分比。。

 2、App切换和Activity跳转:可以看到切换到了哪个App,从哪个Activity跳转到了哪个Activity,如果发生了异常,就可以看出是在哪个App和Activity中发生的。

3、伪随机事件流:各种随机事件。

4、异常信息:应用崩溃、无响应等异常相应信息。

5、测试结果信息:完成事件数、其他信息。

App切换和Activity跳转
        可以看到切换到了哪个App,从哪个Activity跳转到了哪个Activity,如果发生了异常,就可以看出是在哪个App和Activity中发生的。

注:在允许一次测试多个应用时,会看到多次App切换;只测试一个应用时,一般只看到一次App切换,除非应用异常后重启。

伪随机事件流
记录各种随机操作及中间的延迟时间,主要是以下几种操作:   

touch 触摸操作

motion 滑动操作

trackball 曲线滑动操作

pinch-zoom 缩放操作

rotation 旋转操作

异常信息
应用无响应、崩溃等异常信息

应用无响应时信息:

崩溃信息:

测试结果信息
完成事件数、其他信息              

完成事件数:

其他信息:

从日志中发现并提交bug

        使用Monkey进行测试结束后,我们关注的是应用在测试中是否出现崩溃或无响应这类问题。测试结果可以通过如下方法判断:

(1)在日志中搜索“CRASH”,如果搜到,可以判断App在测试过程中发生过崩溃(闪退)问题

(2)在日志中搜索“ANR”,如果搜到,可以判断App在测试过程中发生过无响应的问题

        我们可以把这些关键字,连同其上下文,包括Java异常信息和其他相关信息一起提交。其中,Java异常信息主要有以下类型:

算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

类型强制转换异常:ClassCastException

数组负下标异常:NegativeArrayException

数组下标越界异常:ArrayIndexOutOfBoundsException

违背安全原则异常:SecturityException

文件已结束异常:EOFException

文件未找到异常:FileNotFoundException

字符串转换为数字异常:NumberFormatException

操作数据库异常:SQLException

输入输出异常:IOException

违法访问错误:IllegalAccessError

内存不足错误:OutOfMemoryError

堆栈溢出错误:StackOverflowError

注意:长时间运行Monkey时,产生的日志文件非常庞大,用记事本无法打开,可以使用如Notepad++UltraEdit之类的流式读取的编辑器打开。

ANR异常和traces.txt文件

        Monkey日志中ANR相关信息不够详细,当发现APP运行中存在ANR问题时,我们还需要使用adb pull命令从被测设备的/data/anr目录下导出名为traces.txt的对应log文件,一并交给开发人员排查问题。命令如下:

adb pull /data/anr/traces.txt  D:\logs\
adb logcat 查看Android系统日志(logcat日志)

        使用monkey进行测试时,还要注意logcat日志。这是Android系统日志,包含更详细的内容,可以帮助开发人员定位问题。如果要获取logcat日志,需要在执行monkey测试前开始记录logcat日志。完整步骤如下:

adb logcat -c 清理现有日志

adb logcat -v time > D:\logcat.log 开始记录日志

③ 运行monkey程序  

运行monkey程序结束后,可以把logcat日志文件logcat.log也提交给开发作为定位问题的参考。

复现问题

        如果需要复现问题,可以在日志中找到当时执行的seed值,再构建monkey命令运行几次。构建命令时,seed值自定义,定义成与第一次运行相同。程序运行的初始界面也跟第一次运行相同。

        后续回归问题也用同一个命令,seed值保持相同。 如果问题不易复现,需要多运行几次,或多运行一段时间。

另外,还应保持初始界面、网络条件、位置、运行时长一致。

一次测试发现多个问题

        monkey 执行时如果加了--ignore-crashes和--ignore-native-crashes,App出现崩溃退出后,还会自动重启并继续发送事件(否则monkey中断)。我们可以等monkey进程结束后,去日志里直接搜索CRASH。可能会看到多处问题。所以加这两个选项可以帮助我们在一次测试中发现多处崩溃问题。

        monkey 执行时如果加了--ignore-timeouts,App出现无响应后还会继续发送事件;我们可以等monkey进程结束后,去日志里直接搜索ANR,可能会看到多处问题。所以加这个选项可以帮助我们在一次测试中发现多处无响应的问题。

上述三个选项都加,则可能在一次测试中发现多处CRASH或ANR问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/569465.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

618买什么最划算?618买什么东西便宜?必备数码好物清单分享

​只不,马上又到了618购物节咯,数码产品的优惠力度尤为显著,是购买数码产品的绝佳时机。接下来,我将为大家分享几款性价比超高的数码产品,相信总有一款能吸引你的目光。 一、南卡OE MIX开放式蓝牙耳机 在618购物狂欢节…

javaScript中的闭包

什么是闭包 在理解 JavaScript 中的闭包前先了解以下两个知识点: JavaScript 中的作用域和作用域链JavaScript 中的垃圾回收 简单回顾一下这两个知识点: 1. JavaScript 中的作用域和作用域链 作用域就是一个独立的地盘,让变量不会外泄、…

tomcat 配置支持 ssl 附效果图

1、修改tomcat配置文件server.xml: vim ./conf/server.xml 把配置文件&#xff1a; <Connector port"8088" Server" " protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443" URIEncoding"UTF-8" …

C++ | Leetcode C++题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){// 所有数都填完了if (first len) {res.emplace_back(output);return;}for (int i first; i &…

逆数对(树状数组的方法)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 5 4 5 1 3 2 输出 7 思路&#xff1a; 根据题意&#xff0c;求逆序对总数。 逆序对含义&#xff1a;如果数组中的两个不同位置&#xff0c;前面的数字比后面的数字严格大&…

投票刷礼物链接怎么弄?最新投票活动创建系统源码 轻松创建活动

投票刷礼物链接怎么弄&#xff1f;投票活动创建系统的作用和功能多种多样&#xff0c;为用户提供一个便捷、高效且功能强大的平台&#xff0c;用于创建、管理和执行各种投票活动。分享一个最新投票活动创建系统源码&#xff0c;源码开源可二开&#xff0c;含完整代码包和详细搭…

SCA-CNN-LSTM多输入回归预测|正余弦优化算法-卷积-长短期神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

[笔试训练](五)

013 游游的you__牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 组成一个you需要一个o且能得2分&#xff0c;而组成相邻字母oo需要两个o&#xff0c;只能得1分。优先考虑组成尽可能多的you&#xff0c;再考虑剩下的o&#xff0c;放一起。 #include <iostream…

【C++】C++的四种类型转换

一、C语言中的类型转换 在C语言中有两种类型转换&#xff0c;隐式类型转换和显示类型转换。 如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转化。 隐式类型转换&#…

汽车IVI中控开发入门及进阶(十六):carplay认证

现在有些中控采用高通的芯片如8155、8295等,实现多屏互动等,但是也有一些车型走低成本方案,比如能够实现HiCar、CarLife或者苹果Apple的Carplay等能进行手机投屏就好了。 能实现CarPlay功能通过Carplay认证,也就成了一些必须的过程,国产车规级中控芯片里,开阳有一款ARK1…

Android SDK Manager安装Google Play Intel x86 Atom_64 System Image依赖问题

Package Google Play Intel x86 Atom_64 System Image,Android API R, revision 2 depends on SDK Platform Android R Preview, revision 2 问题 一开始以为网络还有依赖包没有勾选&#xff0c;尝试了很多次&#xff0c;勾选这边报错对应的license即可。此时点击一下其他licen…

深入探索Go语言:io库的实战应用全解析

深入探索Go语言&#xff1a;io库的实战应用全解析 引言io库概览Reader接口Writer接口Closer接口Seeker接口 文件操作打开和关闭文件读取文件写入文件错误处理 数据读写技巧使用缓冲读写缓冲读取缓冲写入 复用缓冲区提高读写效率的技巧 处理I/O流网络I/O的处理创建简单的HTTP服务…

cdo 修改 calendar 为标准的格式

使用ncl脚本时出现警告&#xff1a;day_of_year: illegal calendar proleptic_gregorian 其原因是读取的降水nc文件是我手动合并生成&#xff0c;所以时间的calendar不是很标准&#xff0c;数据信息如下所示&#xff0c;可以发现Calendar是proleptic_gregorian&#xff0c;这…

前端补充17(JS)

一、JS组成成分 JS的组成成分&#xff0c;由三部分组成 第一、ECMAScript&#xff1a;语法规则&#xff0c;如何定义变量&#xff0c;数据类型有哪些&#xff0c;如何转换数据类型&#xff0c;if判断 if-else while for for-in forEach do-while switch 数组 函数 对…

Python小功能实现(链接下载图品并存储到EXCEL中)

import os import requests from openpyxl import Workbook from openpyxl.drawing.image import Image from concurrent.futures import ThreadPoolExecutor# 图片链接列表 image_urls ["https://uploads/file/20230205/f85Lpcv8PXrLAdmNUDE1Hh6xqkp0NHi2gSXeqyOb.png&q…

3月魅力彩妆行业数据分析:某国产品牌彩妆产品销额将近30亿!

彩妆行业发展多年&#xff0c;经历了多重红利期和激烈的市场竞争后&#xff0c;进入到缓慢发展时期。 根据鲸参谋数据显示&#xff0c;今年3月在线上电商平台&#xff08;淘宝天猫京东&#xff09;彩妆产品销量累计超过6700万件&#xff0c;同比去年下降了29%&#xff1b;销售…

基于spring boot学生综合测评系统

基于spring boot学生综合测评系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件…

C语言 | Leetcode C语言题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; int firstMissingPositive(int* nums, int numsSize) {for (int i 0; i < numsSize; i) {while (nums[i] > 0 && nums[i] < numsSize &&nums[nums[i] - 1] ! nums[i]) {int t nums[nums[i] - 1];nums[nums[i] -…

用代码给孩子造“钱”

起因 作为家里有两个娃的奶爸&#xff0c;时长为了孩子乱花钱而焦虑不已。然后最近看到一段短视频说了这么段话。 父母不要被动给孩子买东西&#xff0c;而是定期给孩子钱。让孩子自己管钱培养她对于钱的认知和理财的观念。 突然感觉大师我悟了。感觉值得一试。于是就打算给他…

【爬虫】多线程爬取图片

多线程爬虫 多线程爬虫概述1.1 多线程的优势1.2 多线程的挑战 设计多线程爬虫1.1 项目设计1.2 项目流程1.3注意事项 总结 多线程爬虫概述 在当今信息爆炸的时代&#xff0c;网络爬虫&#xff08;Web Scraper&#xff09;已成为获取和分析网络数据的重要工具。而多线程爬虫&…