Monkey基本使用及介绍

news2024/12/24 18:49:47

1 简介.. 1

1.1 Monkey是干什么的.. 1

1.2 我们为什么要用monkey. 1

1.3 试行monkey的计划.. 2

2 monkey使用.. 4

2.1 基本常识.. 4

2.2 基本使用.. 6

2.2.1 通过adb 来启动monkey. 6

2.2.2 一些命令选项.. 7

2.2.3 一些测试例子.. 7

2.2.4 执行注意事项.. 9

2.2.5侦测到错误后的处理.. 10

2.2.6 自动化执行脚本.. 11

3 总结.. 12

                                                 Made by yuechuang

1 简介

1.1 Monkey是干什么的

Monkey是运行在模拟器或设备上的一个程序,用来伪随机地模拟点击和触摸等用户事件,就如其它许多系统事件一样。Monkey可以用于对我们开发的应用程序进行随机和重复的压力测试。

Google他自己说:Only bind this to local host.  This means that you can only talk to the monkey locally, or though adb port forwarding。

简单的说就是,模拟用户的touch screen和keyboard的输入!

1.2 我们为什么要用monkey

客户和本司对我们产品性能以及稳定性要求越来越高,基础的测试方法,在一定程度上只能提供越来越基本的保障。我们现在面临着一个挑战,就是“手机产品更高的测试强度和测试效率”。

一方面,我们要求测试方法有高效的命中率,另一方面,我们需要测试人员有更高的测试效率。我们如何面对挑战?在人为手工极限测试技能水平限制下,如何突破?

    android项目中,我们知道,Android application如果没有充分测试,很容易出现FC(Force Close)的问题。我们这里通过使用Android自带的monkey工具来做大量的软件压力测试,部分性能测试,而且,不需要投入很多精力,并且可以延伸到很多人所不能的方面,节省大量人力物力,提供准确的FC信息。

1.3 试行monkey的计划

如何在我们的项目中,普及monkey?

如何让monkey工具发挥更好的作用?

我们在使用monkey这个工具的时候,打算是分为三阶段来使用的,具体如下:

  • 研发阶段(test level 1)
  • 研发稳定阶段(test level 2)
  • 定制阶段(test level 3)

在第一阶段(test level 1),主要是:手工测试的补充,利用无数次尝试,加强自由测试力度。

这是我们针对我们公司“高要求多需求”的实际情况制定的一个方法。

在长期的QT实践和观察中,我们发现,案例测试,一般可以覆盖一些基本问题,而UR上的很多问题,并非是由案例去发现的,大多是测试者的主观发现,这种方式,我们测试上姑且称之为“无序测试”,同理,案例测试可以称之为“有序”了。

在复杂庞大的android软体环境下,认为因素的“无序”已经无法再逾越一个测试极限,那么这个时候,就应该引入“更加强大,量大”的“无序”动作,monkey应运而生!

我们这阶段,就是引入monkey中“执行次数(count)”这个参数,所有的东西都是在这个参数上做文章,以量变引发质变。

第二阶段(test level 2),主要是:科学安排相关参数,知道需要测试的方向,进行针对测试。

就是设置延时,事件类型等参数,进行针对性测试。我们通过调节这些性能相关的参数,或者控制设置很影响某些模块的事件,以及第一阶段总结的执行次数,来测试衡量模块的性能,稳定性。而做这一工作,单纯的人力是无法做到。

第三阶段(test level 3),主要是:“修改”或者“等待”源码支持,拟定自己的测试步骤,控制事件。

对于monkey,他如其他工具一样,不可能是为oppo定制,所以,有许多自己公司特有的东西,他支持的不好或者不支持,需要我们去改善,我们后期的工作,会深入到源码、机制,进行我们的定制行为。

2 monkey使用

2.1 基本常识

Monkey是自带的,在手机的/system/framework/monkey.jar文件,执行文件位于/system/bin/monkey,是一个shell命令。

monkey的基本架构图,如下:

​编辑

     相关事宜,也可以参照源码目录:

Monkey是用JAVA写成的,但是我们确可以这样运行::

     “adb shell monkey …..”

     为什么?

     是因为在/system/bin目录下有一个monkey的shell脚本.内容如下:

#Script to start "monkey" on the device, which has a very rudimentary 

# shell.                                                   

#                                                        

base=/system                                               

export CLASSPATH=$base/framework/monkey.jar                

exec app_process $base/bin com.android.commands.monkey.Monkey $*

      exec 会运行起/system/framework/monkey.jar。关于源码研究的,我们在这里不再深入下去了,后续会有一些东西补充上来。

2.2 基本使用

2.2.1 通过adb 来启动monkey

确保目标板“设置->应用程序->开发->USB调试”选项打开。连接目标机后,启动“cmd”命令。

输入“adb devices”命令,可以查看连接的设备,如图:

连接成功后,会反馈如下信息:

           

由于Monkey运行在模拟器/设备环境中,所以必须用其环境中的shell来进行启动。可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令(或者直接启动“adb shell”命令后直接使用monkey命令。),基本语法如下:

$ adb shell monkey [options]

具体如下:

或者

如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:

$ adb shell monkey -p your.package.name -v 500

例如,测试“com.android.camera”这个包(相机应用),可以输入:

2.2.2 一些命令选项

Monkey包括许多选项,它们大致分为四大类:

  • 基本配置 选项,如设置尝试的事件数量。
  • 运行约束选项,如设置只对单独的一个包进行测试。
  • 事件类型 和频率。
  • 调试选项。

这里有一个附表,有很详细的介绍,请看

2.2.3 一些测试例子

【使用monkey测试camera】

第一阶段(test level 1):控制测试次数

指令如下“monkey -v -p com.android.camera x(次数)”

这段时间,技术支持会先预测次数,然后获取问题反馈,增加测试次数,整理次数数据。

测试每一次,大概5分钟

技术意图是:通过高频操作,捡取内存控制不当事件,适用于改动较大阶段

第二阶段(test level 2):控制次数和时间延时

运行指令如下“monkey -v -p com.android.camera --throttle x y”

这会根据第一阶段的数据,获取相应的次数,根据性能评估测试时延(技术支持事先运行该模块,做一个基本的概率统计)

这段时间,主要是看延时值,参考次数值,需要数据反馈

技术意图:通过统计不同的时延数值和测试次数值,评估性能和稳定性。

控制时间概率

运行:

“monkey -v --pct-touch 60 --pct-nav 30 -p com.android.camera 500”

“monkey -v-v-v --pct-touch 60 --pct-nav 30 --throttle 300 -p com.android.camera 500”等类似复合指令

通过控制事件复杂度,达到界定问题的目的

这种复杂度的控制,是基于大量数据反馈到技术支持侧,通过分布统计,界定问题

2.2.4 执行注意事项

关于“your.package.name

在开发data目录中,根据项目实际情况寻找开发包名,或者向开发工程师咨询。

试着提供一个命令执行场景:

monkey -v -p com.android.camera --throttle 5000 --pct-anyevent 100 500

这条命令的解释是:

-v 显示默认程度的信息;

-p com.android.camera是指定测试的程序;   

--throttle 5000 设定延时;

--pct-anyevent 100设定启动activity的百分比为100%;

--500  执行500次操作。

执行场景:

再执行一下:

monkey -v -p com.android.camera --throttle 5000 500

仔细比较此图,可见各类事件是可以控制的。要是有点经验的话,我们执行“拨号盘”这个模块测试,可以将虚拟键盘事件控制到零,避免不必要事件发生。

2.2.5侦测到错误后的处理

这里运行一个例子,对mydemo应用进行500次任何触发事件随机压力测试(无时延)

  

$ adb shell monkey -p com.example.mydemo -v 500

运行后,将出现一些信息,目标机上将会出现“应用程序mydemo意外停止,请重试”,截取的有效信息如图:

注意:只有“cout”= =“events injected” 测试才执行成功。

在一般情况下,我们获取到FC后,会根据小机情况,我们有时可以运行“logcat”指令获取信息,或者,通过adb pull获取小机中的log。

2.2.6 自动化执行脚本

这里有一个实例,就是让测试员运行写好的测试脚本,进行“一键操作”。

大家连上机子,可以运行一个小玩意,附件如下:

   

这是一个测试拨号键盘的自动化测试执行脚本,你运行后,他自动测试拨号盘2万次,并且把log和bugreport记录到“d:\bat”目录下。

大家也可以在熟悉指令后,运用自己的才智进行这种脚本的编写。

3 总结

Monkey是一个灵活而强大的工具,可以用来提高应用的稳定性,注意它是伪随机的,所以如果不指定-s <seed>(随机数种子)则每次将运行相同的事件序列。

另外,虽然我们可以通过这种高强度的测试,获知相关软体稳定度,但是,目前还无法界定测试指标。比如,多少次才合格?时延设置是多少,可以客观反映系统性能?等。这些问题并非测试软件本身的问题,需要大家在实践中进一步去积累。

这次的探讨就讲到这里,关于test level 3,我相信随着我们了解的深入,后续支持的增加,我将会和大家再分享。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pandas read_json时ValueError: Expected object or value的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

数据结构 1.2 算法

算法的基本概念 算法的定义 算法是对特定问题求解步骤的一种描述&#xff0c;它是指定的有限序列&#xff0c;其中的每条指令表示一个或多个操作。 例、 算法的特性 &#xff08;5个&#xff09; 1.有穷性 一个算法总在执行有穷步之后结束&#xff0c;且每一步都可以在有穷…

Redis作为缓存,mysql的数据如何与redis进行同步?

Redis作为缓存&#xff0c;mysql的数据如何与redis进行同步&#xff1f; 一定要设置前提&#xff0c;先介绍业务背景 延时双删 双写一致性:当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致 读操作:缓存命中&#xff0c;直接返回;缓存未…

位移贴图和法线贴图的区别

位移贴图和法线贴图都是用于增强模型表面细节和真实感的纹理贴图技术&#xff0c;但是它们之间也存在着差异。 1、什么是位移贴图 位移贴图&#xff1a;位移贴图通过在模型顶点上定义位移值来改变模型表面的形状。该贴图包含了每个像素的高度值信息&#xff0c;使得模型的细节…

Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因

文章目录 前言502和504区别---都是Nginx返回的access.log和error.log介绍SpringBoot结合Nginx实战502 and 504准备工作Nginx配置host配置SpringBoot 502模拟access.logerror.log 504模拟access.logerror.log 500模拟access.logerror.log 总结 前言 刚工作那会&#xff0c;最常…

基于Java Web 的购物网站

本系统采用基于JAVA语言实现、架构模式选择B/S架构&#xff0c;Tomcat7.0及以上作为运行服务器支持&#xff0c;基于JAVA等主要技术和框架设计&#xff0c;idea作为开发环境&#xff0c;数据库采用MYSQL5.7以上。 开发环境&#xff1a; JDK版本&#xff1a;JDK1.8 服务器&…

【前后缀技巧】2022牛客多校3 A

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 这种是典中典中典&#xff0c;对于gcd&#xff0c;背包问题都是一样的处理方式 预处理出前缀lca和后缀lca&#xff0c;枚举哪个消失即可&#xff0c;可以统计方案数 Code&#xff1a; #include &l…

karmada v1.7.0安装指导

前言 安装心得 经过多种方式操作&#xff0c;发现二进制方法安装太复杂&#xff0c;证书生成及其手工操作太多了&#xff0c;没有安装成功&#xff1b;helm方式的安装&#xff0c;v1.7.0的chart包执行安装会报错&#xff0c;手工修复了报错并修改了镜像地址&#xff0c;还是各…

在Ubuntu 20.04搭建最小实验环境

sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates安装导入GPG公钥所需的依赖包。 sudo wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -导入GPG密钥。 sudo apt-get -y install --no-install-recommends software-p…

【APUE】文件系统 — 类 du 命令功能实现

一、du命令解析 Summarize disk usage of the set of FILEs, recursively for directories. du 命令用于输出文件所占用的磁盘空间 默认情况下&#xff0c;它会输出当前目录下&#xff08;包括该目录的所有子目录下&#xff09;的所有文件的大小总和&#xff0c;以 1024B 为单…

包装机(栈和队列的应用)

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道&#xff0c;放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时&#xff0c;活塞向左推动&#xff0c;将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时&#xff0c;机械手将抓取筐顶部的一件物品&#x…

论文阅读——Pyramid Grafting Network for One-Stage High Resolution Saliency Detection

目录 基本信息标题目前存在的问题改进网络结构CMGM模块解答为什么要用这两个编码器进行编码 另一个写的好的参考 基本信息 期刊CVPR年份2022论文地址https://arxiv.org/pdf/2204.05041.pdf代码地址https://github.com/iCVTEAM/PGNet 标题 金字塔嫁接网络的一级高分辨率显著性…

虚拟机通过nat模式端口映射实现内网穿透

虚拟机通过nat模式端口映射实现内网穿透 1.网络状态 windows虚拟主机的IP为局域网的私有IP192.168.1.7linux的虚拟主机IP为nat的172.36.4.1062.linux修改nat模式的端口映射 3.windows宿主机防火墙添加规则,&#xff08;或者直接关闭公共网络防火墙&#xff0c;不安全&#xf…

多个excel合并

目的&#xff1a;将同一个文件下的多个 “京东差评.xlsx” 合并为一个&#xff1a;“京东汇总.xlsx" 代码如下&#xff1a; # -*- coding: utf-8 -*- """ Created on Wed Oct 4 12:52:32 2023author: 64884 """import pandas as pd impor…

ffmpeg之去除视频水印

ffmpeg去除水印使用delogo视频滤镜。 delogo参数: x,y,w,h分别表示logo区域的左上角位置及宽度和高度&#xff1b; show:0表示不显示logo区域&#xff0c;1表示显示logo区域。 执行下面的命令&#xff1a; ffmpeg -i 1.mp4 -vf delogox300:y10:w80:h30:show0 out.mp4 效果…

Java数据结构————队列

一 、队列 在Java中&#xff0c;Queue是个接口&#xff0c;底层是通过链表实现的。 只允许在一端进行插入数据操作&#xff0c; 在另一端进行删除数据操作的特殊线性表&#xff0c; 队列具有先进先出FIFO(First In First Out) 。 入队列&#xff1a; 进行插入操作的一端称为…

Android 获取IP地址的Ping值 NetworkPingUtils

项目里需要对动态配置的Ip列表都去ping下延迟&#xff0c;取出其中最小的三个进行随机取值然后去连接&#xff0c;倒腾了一下午终于搞出来了&#xff01; 需求实现思路&#xff1a; 1.找到方法去ping IP地址&#xff1b; 2.同时去Ping&#xff0c;不能让用户等待&#xff1b…

游戏素材网站

OpenGameArt.org&#xff1a;这是一个提供免费游戏素材的社区平台&#xff0c;包括角色、背景、音效、音乐等各种类型的素材。你可以在 https://opengameart.org/ 上找到大量的免费资源。 Kenney.nl&#xff1a;Kenney 是一个知名的游戏开发者&#xff0c;他提供了大量的免费 …

buuctf-[BSidesCF 2020]Had a bad day

打开环境 就两个按钮&#xff0c;随便按按 url变了 还有 像文件包含&#xff0c;使用php伪协议读取一下&#xff0c;但是发现报错&#xff0c;而且有两个.php,可能是自己会加上php后缀 所以把后缀去掉 /index.php?categoryphp://filter/convert.base64-encode/resourcei…

【C++】运算符重载 ⑤ ( 一元运算符重载 | 使用 成员函数 实现 前置 ++ 自增运算符重载 | 使用 成员函数 实现 前置 - - 自减运算符重载 )

文章目录 一、一元运算符重载1、使用 成员函数 实现 前置 自增运算符重载2、使用 成员函数 实现 前置 - - 自减运算符重载 二、完整代码示例 一、一元运算符重载 1、使用 成员函数 实现 前置 自增运算符重载 使用 全局函数 实现 前置 自增运算符重载 : 首先 , 写出函数名 ,…