当前位置: 首页 > news >正文

Monkey

一、Monkey的概念

        “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按的。

        这种测试方式在产品周期中的早期阶段会找到很多很好的bug,为用户节省不少的时间。

二、Monkey的介绍

        它是Android系统自带一个命令行工具,可以运行在模拟器里或者真机设备中运行。

        monkey向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。

三、monkey四大类

        1.基本配置选项,如设置尝试的事件数量。

        2.运行约束选项,如设置只对单独的一个包进行测试。

        3.事件类型和频率。

        4.调试选项

四、monkey命令特性

        不可能使用monkey来指定做一样测试,重复做很多次。因为monkey产生的是伪随机的事件流。但是我们可以通过添加命令选项将操作限制在一定的范围内。

五、搭建环境

        1.先下载jdk 具体安装流程请参考:https://blog.csdn.net/write6/article/details/79136388

        2.再下载sdk 具体安装流程请参考:https://blog.csdn.net/u011541946/article/details/77142045

        3.检验是否安装好-JDK和SDK

                windows+r 输入cmd进入dos命令行

                JDK:java -version

                SDK:adb

六、实际操作

        1.打开手机的开发者调试工具,用usb数据线链接手机或者使用模拟器

        2.windows+r 输入cmd进入dos命令行

        3.输入adb devices:查询序列号 出现类似下图的组合代表成功

        4. 输入adb shell连接手机

        或 adb -s 序列号 shell

        5.查询手机APP包名:adb shell pm list packages命令用法(未连接手机在查询APP包名输入命令需要带上adb shell、已连接手机查询手机APP包名直接输入pm list packages命令)

序号

命令

含义

1

adb shell pm list packages

查看当前连接设备或者虚拟机的所有包

2

adb shell pm list packages -s

只输出系统的包

3

adb shell pm list packages -3

输出所有第三方包

4

adb shell pm list packages -f

输出包和包相关联的文件(安装路径)

5

adb shell pm list packages -i

输出包和安装信息(安装来源)

6

adb shell pm list packages “baidi”

输出包含过滤条件的包

7

adb shell pm list packages -e

只输出启用的包

8

adb shell pm list packages -d

只输出禁用的包

9

adb shell pm list packages -u

只输出包和未安装包信息(安装来源)

10

adb shell pm path packages

定位apk所在系统路径

11

adb pull <remote> [<local>]

从手机把apk pull下来

12

adb shell pm list packages --user <USER_ID>

根据用户id查询用户的空间的所有包,<USER_ID>代表当前连接设备的顺序,从零开始

        6.对包操作

1. 首先用一个最简单的mokey去试着找哪个是你想要的安装包名称

        -p参数:表示指定测试的程序(空格后面跟安装包名字,拿刚才的第三方安装包一个个试)

        -v参数:表示查看monkey执行过程的信息(日志级别)(-v 越多越详细,最多三个)

数字100:表示测试事件数为100

序号

命令

含义

1

adb shell monkey -p tv.danmaku.bili 100

指定一个包

2

adb shell monkey -p tv.danmaku.bili -p com.baidu.searchbox 100

指定多个包

3

adb shell monkey -v 100

不指定包

4

adb shell "ps | grep com.baidu.searchbox"

获取进程ID

5

adb shell ps

查看所有进程

6

adb shell dumpsys meminfo 包名,或者进程id

查看某个进程的内存占用情况

7

kill -9 进程ID

杀死进程

8

exit

退出 shell

2.adb shell monkey -p tv.danmaku.bili -v 50 向b站发起随机点击50次

                结果图:

Event percentages(事件百分比):

0:触摸事件百分比,参数--pct-touch

1:滑动事件百分比,参数--pct-motion

2:缩放事件百分比,参数--pct-pinchzoom

3:轨迹球事件百分比,参数--pct-trackball

4:屏幕旋转事件百分比,参数--pct-rotation

5:暂时不知道这个是什么

6:基本导航事件百分比,参数--pct-nav

7:主要导航事件百分比,参数--pct-majornav

8:系统事件百分比,参数--pct-syskeys

9:Activity启动事件百分比,参数--pct-appswitch

10:键盘翻转事件百分比,参数--pct-flip

11:其他事件百分比,参数--pct-anyevent

3.尽管monkey产生是伪随机事件流,但是我们希望我们的操作有一定的规律性,即按键、触屏等各类事件操作有所偏重

        (1).对文本框操作,需要更多的按键操作。

        (2).玩游戏,需要更多的点击和滑动操作。

序号
1

--throttle

设定两个事件之间一个固定延迟,可以减缓monkey的执行速度

如果不指定,monkey将不会被延迟,事件将尽可能快地生成和发送消息。单位:毫秒

adb shell monkey --throttle 2000 -p tv.danmaku.bili 50

向B站发送50次随机事件,每次事件间隔为2秒

2

--pct-touch

设定触屏事件生成的百分比。

触屏事件是一个有手指按下,抬起事件的手势

adb shell monkey --throttle 2000 --pct-touch 20 -p tv.danmaku.bili 50

向B站发送50次随机事件,每次事件间隔为2秒。其中设定触屏的事件占比为20%

3

--pct-motion

设定滑动事件生成的百分比。

滑动事件是一个先在某一个位置手指按下,滑动一段距离后再抬起手指的手势

adb shell monkey --throttle 2000 --pct-motion 20 -p tv.danmaku.bili 50

向B站发送50次随机事件,每次事件间隔为2秒。其中设定滑动的事件占比为20%

4

--pct-trackball

设定轨迹球事件生成的百分比。

轨迹球事件是包含一系列随机移动和单击事件的事件

adb shell monkey --throttle 2000 --pct-trackball 20 -p tv.danmaku.bili 50

向B站发送50次随机事件,每次事件间隔为2秒。其中设定轨迹球的事件占比为20%

5

--pct-nav

设定基本导航事件生成的百分比。

基本导航事件是模拟方向性在设备上输入向上、向下、向左、向右的事件。

adb shell monkey --throttle 2000 --pct-nav 40 -p tv.danmaku.bili 50

向B站发送50次随机事件,每次事件间隔为2秒。其中设定基本导航事件的占比为40%。

monkety

6

--pct-majornav

设定主要导航事件生成的百分比。

主要导航事件通常会导致UI产生回馈信息,如单击Back键、Home键、Menu键等

adb shell monkey --throttle 2000 --pct-majornav 30 -p tv.danmaku.bili 50

向B站发送50次随机事件,每次事件间隔为2秒。其中设定主要导航事件的占比为30%

7

--hprof

指定了该参数,Monkey会在发送事件序列的前、后,生成性能分析报告。

通常会在data/misc目录下生成一个5MB左右大小的文件

8

--ignore-crashes

通常情况下,当应用程序发生任何超时错误(application not responding)时,monkey将停止运行。若指定了该参数,则monkey将会在产生错误信息后,继续向系统发送事件,直到指定事件全部运行完毕

9

--ignore-security-exceptions

通常情况下,指定应用程序发生许可错误时(如证书许可,网络许可等),monkey将停止运行。

若指定了该参数,即使应用程序发生许可错误,monkey会继续向系统发送事件,直到指定事件全部运行完毕

adb shell monkey --throttle 2000 --pct-trackball 50 -p tv.danmaku.bili 50 --ignore-security-exceptions 50

10

--ignore-timeouts

忽略响应超时,ANR

11

--ignore-native-crashes

忽略本地代码崩溃

12

--monitor-native-crashes

监视崩溃时的本地代码

4.对单独的APP进行测试

monkey -p tv.danmaku.bili --throttle 500 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 200>/mnt/sdcard/monkey.txt

说明:

--throttle(毫秒)事件之间插入的固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定,Monkey将尽可能快的产生并执行事件。

-s 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。

--ignore-crashes 忽略程序崩溃。设置此选项后,Monkey会执行完所有的事件,不会因crash而停止。

--ignore-timeouts 忽略程序无响应。设置此选项后,Monkey会执行完所有的事件,不会因ANR而停止。

--ignore-security-exceptions 忽略证书或认证异常。设置此选项后,Monkey会执行完所有的事件,不会因认证或证书异常而停止。

--ignore-native-crashes 监视系统中本地代码发生的崩溃

--monitor-native-crashes 忽略本地代码导致的崩溃。设置忽略后,Monkey将执行完所有的事件,不会因此停止。

-v -v –v 提供最详细的设置信息

5.导出log到电脑

adb pull /mnt/sdcard/monkey.txt d:monkey.txt

6.分析log

日志开头:显示本次测试seed值,执行次数,测试包,

日志结尾:

如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间;Monkey finished代表执行完成。(如果Monkey执行中断,在log的最后也能查看到当前已执行的次数。)

日志内容分析

一般测试结果分析-搜索关键字:

1.程序无响应,ANR问题:在日志中搜索“ANR”

2.崩溃问题:在日志中搜索“CRASH”

3.其他问题:在日志中搜索”Exception”

详细分析monkey日志

Switch--查看log中的Switch,主要是查看Monkey执行的是那一个Activity,两个swtich之间如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。

Sleeping--Sleeping for 500 milliseconds这是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件。

重现问题

Monkey测试出现错误后,一般的查错步骤为以下几步:

1.找到是monkey里面的哪个地方出错

2.查看Monkey里面出错前的一些事件动作,并手动执行该动作

3.若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样

相关文章:

Monkey

一、Monkey的概念 “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人&#xff08;就像猴子一样&#xff09;不需要知道程序的任何用户交互方面的知识&#xff0c;如果给他一个程序&#xff0c;他就会针对他看到的界面进行操作&#xff0c;其操作是无目的的、乱点乱按…...

SQL中left join、right join、inner join等的区别

一张图可以简洁明了的理解出left join、right join、join、inner join的区别&#xff1a; 1、left join 就是“左连接”&#xff0c;表1左连接表2&#xff0c;以左为主&#xff0c;表示以表1为主&#xff0c;关联上表2的数据&#xff0c;查出来的结果显示左边的所有数据&#…...

算法学习—排序

排序算法 一、选择排序 1.算法简介 选择排序是一个简单直观的排序方法&#xff0c;它的工作原理很简单&#xff0c;首先从未排序序列中找到最大的元素&#xff0c;放到已排序序列的末尾&#xff0c;重复上述步骤&#xff0c;直到所有元素排序完毕。 2.算法描述 1&#xff…...

在Pycharm中创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…...

linux里source、sh、bash、./有什么区别

1、source source a.sh 在当前shell内去读取、执行a.sh&#xff0c;而a.sh不需要有"执行权限" source命令可以简写为"." . a.sh 注意&#xff1a;中间是有空格的。 2、sh/bash sh a.sh bash a.sh 都是打开一个subshell去读取、执行a.sh&#xff0c;而a.…...

IDEA编译器技巧-提示词忽略大小写

IDEA编译器技巧-提示词忽略大小写 写代码时,每次创建对象都要按住 Shift 字母 做大写开头, 废手, 下面通过编译器配置解放Shift 键 setting -> Editor -> General -> Code Completion -> Match case 把这个√去掉, 创建对象就不需要再按住 Shift 键 示例: 1.…...

【MySQL】MySQL安装 环境初始化

MySQL安装 MYSQL官网 安装完成后,傻瓜下一步即可 配置一下环境变量即可 (1) 初始化MySQL, 管理员身份运行 mysqld --initialize-insecure(2) 注册 mysqld mysqld -install# 如果记录以前的版本执行下面指令 mysqld -remove(3) 启动MySQL服务 // 启动mysql服务 net start …...

C# IList 与List区别二叉树的层序遍历

IList 接口&#xff1a; IList 是一个接口&#xff0c;定义了一种有序集合的通用 API。继承自 ICollection 接口和IEnumerable<T>&#xff0c;是所有泛型列表的基接&#xff0c;口它提供了对列表中元素的基本操作&#xff0c;如添加、删除、索引访问等。IList 不是一个具…...

助力android面试2024【面试题合集】

转眼间&#xff0c;2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难&#xff0c;那么想必找工作也不好找&#xff0c;在我们android开发这一行业非常的卷&#xff0c;在各行各业中尤为突出。android虽然不好过&#xff0c;但不能不吃饭吧。卷归卷但是还得干…...

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…...

对 Vision Transformers 及其基于 CNN-Transformer 的变体的综述

A survey of the Vision Transformers and its CNN-Transformer based Variants 摘要1、介绍2、vit的基本概念2.1 patch嵌入2.2 位置嵌入2.2.1 绝对位置嵌入(APE)2.2.2 相对位置嵌入(RPE)2.2.3卷积位置嵌入(CPE) 2.3 注意力机制2.3.1多头自我注意(MSA) 2.4 Transformer层2.4.1 …...

MongoDB简介

数据库&#xff0c;顾名思义&#xff0c;是保存数据的地方。中华文化博大精深&#xff0c;短短3个文字&#xff0c;就定义了一个强大的数据管理和读写方式出来。数据库&#xff0c;管理的对象是数据。称为库&#xff0c;表示数据在库中有组织&#xff0c;相互之间有微妙的关系。…...

尚硅谷hadoop3.x课程部分资料文件下载,jdk,hadoopjar包

jdk文件百度云下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MCiGRzOZY8rAFpRJwA3tdw 提取码&#xff1a;kphl hadoop的jar包&#xff1a; 最新版官网链接&#xff1a; Index of /dist/hadoop/core/stable (apache.org) 百度云下载&#xff0c;3.3.3版&#xf…...

vue el-radio-group多选封装及使用

基于Element UI库的Vue组件&#xff0c;实现了一个单选/多选框组合的效果&#xff0c;可以根据 type 属性的不同值来切换单选框&#xff08;默认&#xff09;和按钮式单选框/多选框。 创建组件index.vue (src/common-ui/radioGroup/index.vue) <template><el-radio-g…...

Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19

一些原理文章 卷积神经网络基础&#xff08;卷积&#xff0c;池化&#xff0c;激活&#xff0c;全连接&#xff09; - 知乎 PyTorch 入门与实践&#xff08;六&#xff09;卷积神经网络进阶&#xff08;DenseNet&#xff09;_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…...

TPLink-Wr702N 通过OpenWrt系统打造打印服务器实现无线打印

最近淘到了一个TPLink-Wr702N路由器&#xff0c;而且里面已经刷机为OpenWrt系统了&#xff0c;刚好家里有一台老的USB打印机&#xff0c;就想这通过路由器将打印机改为无线打印机&#xff0c;一番折腾后&#xff0c;居然成功了&#xff0c;这里记录下实现过程&#xff0c;为后面…...

[UGUI]实现从一个道具栏拖拽一个UI道具到另一个道具栏

在Unity游戏开发中&#xff0c;实现UI道具的拖拽功能是一项常见的需求。本文将详细介绍如何使用Unity的UGUI系统和事件系统&#xff0c;实现从一个道具栏拖拽一个UI道具到另一个道具栏的功能。 一、准备工作 首先&#xff0c;你需要在Unity中创建两个道具栏和一些UI道具。道具…...

微服务--08--Seata XA模式 AT模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式事务Seata 1.XA模式1.1.两阶段提交1.2.Seata的XA模型1.3.优缺点 AT模式2.1.Seata的AT模型2.2.流程梳理2.3.AT与XA的区别 分布式事务 > 事务–01—CAP理论…...

Doris 数据导入一:Broker Load 方式

1.Doris导入数据的方式总结 导入(Load)功能就是将用户的原始数据导入到 Doris 中。导入成功后,用户即可通过 Mysql 客户端查询数据。为适配不同的数据导入需求,Doris 系统提供了6种不同的导入方式。每种导入方式支持不同的数据源,存在不同的使用方式(异步,同步)。 所有…...

docker踩坑记录:docker容器创建doris容器间无法通讯问题

背景&#xff1a; 开发大数据平台&#xff0c;使用doris作为数据仓储&#xff0c;使用docker做集群部署&#xff0c;先进行开发环境搭建&#xff0c;环境为BE1;FE1&#xff0c;原来使用官方例子&#xff0c;但是官方例子是创建了一个bridge使用172.20.80.0/24通讯&#xff0c;…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...