App之Monkey测试

article/2025/10/4 19:14:57

作为初入测试行业的小白,了解一些Monkey测试是很有必要的,在此小编整理了一些App方面Monkey测试的基础以及Monkey脚本的编写,希望可以帮助到大家。

1. Monkey的概念

Monkey测试又称"猴子测试",是指没有测试经验的人对产品进行乱点乱按。Monkey是Android 系统自带的一个命令行工具,可以向测试的应用程序发送伪随机的用户事件流(如按键、触屏、手势等),实现对应用程序进行测试的目的。通常使用Monkey进行压力测试和稳定性测试。

什么时候使用monkey测试比较合适?

答:一般产品比较稳定,没有特别多bug的时候,一般会用monkey去测试待测应用的稳定性,健壮性(是否会发生闪退、崩溃、ANR问题)

2. Monkey使用

第一部分介绍了Monkey的基本概念,那么对于测试小白要怎么使用Monkey呢?
第一步:需要在电脑上安装adb工具,如果不知道怎么安装的可以参考小编的另一篇博客ADB命令介绍
第二步:找一台真机或者模拟器,大家还是直接使用真机吧,比较方便,需要打开手机上的USB调试模式,使用数据线连接电脑。
第三步:打开命令行输入命令:
adb shell monkey
或者
adb shell monkey --help
之后就会看到命令行中一大堆的内容,以下内容是Monkey的帮助信息,主要是Monkey工具中参数的使用在这里插入图片描述

2.1 Monkey参数的使用

首先 先看一下事件参数表,其中包含了一些常用的参数,接下来就给大家挑几个介绍一下基本的用法

参数说明
-s伪随机数生成的种子,如果用相同的随机种子值再次运行相同的Monkey,前后两次执行将会生成相同的事件序列
–throttle在两个事件之间插入一个固定延时,可以减缓Monkey的执行速度。
–pct-touch设定触屏事件生成的百分比,触屏事件是一个有手指按下,抬起事件的手势
–pct-motion设定滑动事件生成的百分比
–pct-trackball设定轨迹球事件生成的百分比,轨迹球事件是包含一系列随机移动和单击事件的事件
–pct-nav设置基本的导航事件的百分比,基本导航事件是模拟方向性设备输入向上、向下、向左、向右的事件
–pct-majornav设定主要导航事件的百分比,主要导航事件通常会导致UI产生回馈事件,如:单击back事件,MENU键
–pct-syskeys设定系统按键事件的百分比,系统按键是指这些按键通常被保留,由系统使用,如HOME、BACK、拨号、挂断及音量控制键
–pct-appswitch设定启动活动事件的百分比。在随机的一定间隔后,Monkey就会执行一个start Activity()函数尽可能多覆盖包中全部活动
–pct-anyevent设定其他类型事件的百分比,如普通的按键消息、不常用的设备按钮事件等
-p设定一个或多个包名,每个包名前都需要有一个-p
–ignore-crashes一般情况下,Monkey会在待测应用程序崩溃或发生任何异常后停止运行,若指定了该参数,则Monkey将会在产生异常后,继续向系统发送事件,直到指定的事件消息全部完成为止。
–ignore-timeouts一般情况下,当应用程序发生任何超时错误时,monkey将停止运行,若指定了该参数,则monkey将会在产生错误信息后,继续向系统发送事件,直到指定的事件消息全部完成为止
  1. -p
    指的package,指定要操作的应用程序,也就是我们平时说的apk包。

    adb shell monkey -p packagename 1000
    -p 参数指定要运行的包,
    1000表示事件次数
    当存在多个包时
    adb shell monkey -p packagename1 -p packagename2 1000
    
  2. -s
    随机种子,在测试的过程中非常推荐使用的一种方法,如果第一次运行时出现了异常,可以通过随机种子复现之前异常的步骤,

    adb shell monkey -p packagename -s 10 1000
    
  3. -v
    通过-v可以查看Monkey执行的过程,在Monkey日志分为三个级别:0、1、2,分别对应的是一个-v、-v -v、-v -v -v;如果Monkey命令中什么都不写的情况话默认为0级别。

    0级:adb shell monkey -p packagename -v 1000
    1级:adb shell monkey -p packagename -v -v 1000
    2级:adb shell monkey -p packagename -v -v -v 1000		
    

    具体案例分析:
    输入命令:adb shell monkey -p packagename -v -v -v 1000
    命令窗口中会输出一大堆的内容,下面从中截取了一段:

    ~ ~ adb shell monkey -p com.qiniu.pili.droid.shortvideo.demo -v -v -v 100bash arg: -pbash arg: com.qiniu.pili.droid.shortvideo.demobash arg: -vbash arg: -vbash arg: -vbash arg: 100
    args: [-p, com.qiniu.pili.droid.shortvideo.demo, -v, -v, -v, 100]arg: "-p"arg: "com.qiniu.pili.droid.shortvideo.demo"arg: "-v"arg: "-v"arg: "-v"arg: "100"
    data="com.qiniu.pili.droid.shortvideo.demo"
    :Monkey: seed=1633995691825 count=100
    :AllowPackage: com.qiniu.pili.droid.shortvideo.demo
    :IncludeCategory: android.intent.category.LAUNCHER
    :IncludeCategory: android.intent.category.MONKEY
    // Selecting main activities from category android.intent.category.LAUNCHER
    //   - NOT USING main activity com.android.browser.launch.SplashActivity (from package com.android.browser)
    //   - NOT USING main activity com.android.calendar.homepage.AllInOneActivity 	(from package com.android.calendar)	
    // Seeded: 1633995691825
    // Event percentages:
    //   0: 15.0%
    //   1: 10.0%
    //   2: 2.0%
    //   3: 15.0%
    //   4: -0.0%
    //   5: -0.0%
    //   6: 25.0%
    //   7: 15.0%
    //   8: 2.0%
    //   9: 2.0%
    //   10: 1.0%
    //   11: 13.0%
    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity;end// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity } in package com.qiniu.pili.droid.shortvideo.demo// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity } in package com.qiniu.pili.droid.shortvideo.demo
    Sleeping for 0 milliseconds:Sending Touch (ACTION_MOVE): 0:(417.50476,1845.2583):Sending Touch (ACTION_MOVE): 0:(416.0715,1845.2562):Sending Touch (ACTION_MOVE): 0:(408.3729,1843.4117):Sending Touch (ACTION_MOVE): 0:(404.40262,1840.556):Sending Touch (ACTION_MOVE): 0:(378.433,1833.2344):Sending Touch (ACTION_UP): 0:(369.19046,1832.6873)Sleeping for 0 milliseconds:Sending Key (ACTION_DOWN): 23    // KEYCODE_DPAD_CENTER:Sending Key (ACTION_UP): 23    // KEYCODE_DPAD_CENTER:Sending Key (ACTION_UP): 82    // KEYCODE_MENUSleeping for 0 milliseconds:Sending Touch (ACTION_DOWN): 0:(391.0,92.0):Sending Touch (ACTION_UP): 0:(403.20142,94.02997)Events injected: 100:Sending rotation degree=0, persist=false:Dropped: keys=0 pointers=0 trackballs=0 flips=1 rotations=0## Network stats: elapsed time=601ms (0ms mobile, 0ms wifi, 601ms not connected)// Monkey finished~ 
    

    接下来对以上日志进行分析

    :Monkey: seed=1633995691825 count=100
    Monkey在使用伪随机数seed产生事件序列时,在没有指定随机种子时,系统会随机分配一个值,count表示随机事件次数:AllowPackage: com.qiniu.pili.droid.shortvideo.demo
    表示只启动com.qiniu.pili.droid.shortvideo.demo 包中的Activity。:IncludeCategory: android.intent.category.LAUNCHER
    :IncludeCategory: android.intent.category.MONKEY
    表示启动的意图重量为”LAUNCHER“和”MONKEY“的活动。// Event percentages:
    //   0: 15.0%
    //   1: 10.0%
    //   2: 2.0%
    //   3: 15.0%
    //   4: -0.0%
    //   5: -0.0%
    //   6: 25.0%
    //   7: 15.0%
    //   8: 2.0%
    //   9: 2.0%
    //   10: 1.0%
    //   11: 13.0%
    本次伪随机事件中各种类型的事件比例,如 按键、滑屏等事件,这些事件等占比也可以自己进行相应参数等设定
    :Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity;end
    表示跳转到“com.qiniu.pili.droid.shortvideo.demo”包中的“.activity.MainActivity”这个活动。// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.qiniu.pili.droid.shortvideo.demo/.activity.MainActivity } in package com.qiniu.pili.droid.shortvideo.demo
    表示允许启动“com.qiniu.pili.droid.shortvideo.demo”包中的“.activity.MainActivity”这个活动。Sleeping for 0 milliseconds
    表示Monkey允许在发送各种随机事件时有一个延迟,因为我们没有在命令行中指定,所以Monkey只能尽可能快的发送事件消息。Events injected: 100
    上面的信息表示产生了100次注入事件,因为命令行中设置的为100:Sending rotation degree=0, persist=false
    表示屏幕旋转,旋转角度为0,是否保持旋转状态,为假。:Dropped: keys=0 pointers=0 trackballs=0 flips=1 rotations=0
    表示丢弃的屏幕旋转相关信息,丢弃:键=0,指针=0,轨迹球=0,键盘轻弹=1,屏幕翻转=0.
    // Monkey finished
    如果在日志中看到这句就代表执行成功,在此过程中没有什么问题。
    
  4. 日志保存

    adb shell monkey -p com.qiniu.pili.droid.shortvideo.demo -v -v -v 100 >/Users/Downloads/monkey.log
    adb logcat -v time '*E' > monkey.log (只保存error级别的日志)
    
  5. 综合案例展示
    针对Monkey中的参数我们知道什么意思,怎么使用就可以了,接下来给大家进行综合案例展示

    adb shell monkey -v -v -v --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions -p com.qiniu.pili.droid.shortvideo.demo -s 100 --pct-touch 50 --throttle 3000 1000 >monkey.log
    测试过程中忽略相关的安全、超时、崩溃等异常
    --pct-touch 50 触屏事件为百分之五十
    --throttle 3000 事件间隔为3-s 100 种子为100
    

3. Monkey脚本

先给大家展示一下Monkey脚本,脚本名字为monkey.txt,内容如下:
对于Tap(960,274)中的坐标问题我们可以通过uiautomatorviewer工具解决,当然还有一个最简单的办法是:手机设置——开发者模式——指针位置,这样我们就可以获取button的坐标了。

type = raw events # 表示脚本的类型
count = 1 # 用于说明执行的次数,但是无论改成什么都只是执行一次??
speed = 1.0 # 用于调整两次执行随机事件的发送频率。
start data >> # 启动 或者start data >>LaunchActivity(com.qiniu.pili.droid.shortvideo.demo) # 包名,界面名
Tap(960,274) ## button 的坐标(点击)
UserWait(5000) # 等待时间
Tap(390,1538)
UserWait(13000)
Tap(780,1583)
UserWait(5000)
Tap(777,1183)
UserWait(5000)
Tap(30,1335)
UserWait(5000)
Tap(30,1456)
UserWait(5000)
Tap(945,81)
UserWait(5000)
DispatchPress(KEYCODE_BACK) # 点击返回键

第一步: 写monkey脚本,可以将其保存为monkey.txt( 名字任意)
第二步: 将脚本Push到手机某一个文件中

adb push monkey.txt  /sdcard/

第三步: 运行脚本

adb shell monkey -f /sdcard/monkey.txt -v -v 1

以上就是Monkey的全部内容了,希望可以帮助到大家。


http://chatgpt.dhexx.cn/article/3xPfswYC.shtml

相关文章

随机测试 Monkey Test

今天说一说随机测试,Monkey Test。翻译成中文就是猴子测试。 你可以想象一只猴子趴在电脑面前,拿着鼠标随便乱点的样子。 一,什么是随机测试? 软件测试中的Monkey测试是测试人员对应用程序随机输入以验证其功能的一种方法。这是…

墨者学院-Bash漏洞分析溯源

Bash漏洞分析溯源 难易程度:★★ 题目类型:命令执行 使用工具:FireFox浏览器、wwwscan 1.打开靶场,根据题目思路找poc.cgi。 2.使用wwwscan扫一下 发现有目录/cgi-bin 3.打开burpsuite,访问/cgi-bin/poc.cgi,截包。 send to repeater&…

vulhub漏洞复现之bash(Shellshock CVE-2014-6271)

Shellshock 破壳漏洞 CVE-2014-6271 1.漏洞概述: GNU Bash 4.3及之前版本在评估某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行shell命…

linux网站漏洞修复,CentOS Bash漏洞终极修复方法

目前已确认被成功利用的软件及系统:所有安装GNU bash 版本小于或者等于4.3的Linux操作系统。 【Bash漏洞描述】该漏洞源于你调用的bash shell之前创建的特殊的环境变量,这些变量可以包含代码,同时会被bash执行。 【漏洞检测方法】 在服务器命…

Bash漏洞分析溯源 cgi文件 (CVE-2014-6271) --墨者学院

01 背景介绍 Bash脚本在解析某些特殊字符串时出现逻辑错误导致可以执行后面的命令,在一些cgi脚本中,数据是通过环境变量来传递的,这样就会形成该漏洞; bash通过以函数名作为环境变量名,以“(){…

suse linux bash漏洞,bash漏洞: CVE-2014-6271漏洞及紧急修复方法

最近linux的bash漏洞闹得沸沸扬扬,问题还是挺严重的,我这里提醒大家一下早日修复吧! 如何验证 $ env x() { :;}; echo vulnerable bash -c echo hello 在终端中运行上面的命令,如果返回有vulnerable,就说明这台服务器中…

suse linux bash漏洞,Suse11 sp3 下Bash漏洞升级修复

SuSE Linux Enterprise Server 11Bash 漏洞修复方案 系统:Suse-11-sp3-64 Bash:bash-4.4 1.1. Bash升级 1.1.1升级概述 大部分现行Linux操作系统自带的版本比较陈旧,因此需要升级bash版本。 发现现在版本存在漏洞 1.1.2 安装介质 bash-4.4.tar.gz(官网最…

墨者Bash漏洞分析溯源题解

这个漏洞是看别人的思路解出来的,因为在打开页面后,我扫描不出来其他东西,惭愧 后台存在一个地址,是http://219.153.49.228:49581/cgi-bin/poc.cgi 访问这个地址 对着地址进行抓包 将user-agent进行修改,修改为() { …

Bash漏洞利用!

环境: 服务器Centos:192.168.195.130 攻击机bt5:192.168.195.130 1、找到漏洞利用程序 必须web服务器支持cgi 这里是测试的bug.sh代码 #!/bin/bash 第一行要特别注意! echo "Content-type: text/html" echo "&q…

redhat linux bash 漏洞,GNU Bash 漏洞及修补方法

文章引自http://loosky.net/3036.html 漏洞描述 CVE-2014-6271 ***者可构造特殊的环境变量值,以在这些环境变量的值中包含特定的代码,当 Shell 对这些环境变量求值时,这些特定的代码将得以在系统中执行。某些服务和应用接受未经身份者提供的环…

linux 破壳漏洞,Bash破壳漏洞

“破壳”是一个严重漏洞的别名,在Red Hat、CentOS、Ubuntu、Fedora、Amazon Linux、OS X 10.10中均拥有存在CVE-2014-6271(即“破壳”漏洞)漏洞的Bash版本,同时由于Bash在各主流操作系统的广泛应用,此漏洞的影响范围包括但不限于大多数应用Bash的Unix、Linux、Mac OS X,而针…

linux系统漏洞补丁包,RedHat 5.X、6.X Bash漏洞RPM补丁包下载

RedHat 5.X、6.X Bash漏洞RPM补丁包下载及教程。 首先查看服务器的BASH版本号: bash -version 如果BASH版本是4.X的64位系统的话,安装bash-4.1.2-15.el6_5.2.x86_64文件夹里面的三个文件; 如果BASH版本是3.X的话,32位和64位分别安…

Linux Bash漏洞复现

Bash是什么? Bourne Again Shell(简称BASH)是在GNU/Linux上最流行的SHELL实现,于1980年诞生,经过了几十年的进化从一个简单的终端命令行解释器演变成了和GNU系统深度整合的多功能接口。根据维基百科的描述&#xff1a…

关于CentOS下Linux的bash 漏洞,查看和解决的方法

说明:我是今天才发现这个问题的,据说06年就就已经发现了,我才在才发现,后知后觉,如果不是遇到了,估计还没发现,我是个假的程序猿。。。 如果Shell版本较旧的话,建议升级到最新版本的…

墨者学院 - Bash漏洞分析溯源

bash漏洞技术层面分析 漏洞起源: 漏洞信息最早来源于国外知名漏洞网站exploit-db下的第34765篇漏洞报告,其中出现了一条验证命令: env x() { :;}; echo vulnerable bash -c "echo this is a test" 如果在一个含有版本号小于bash…

墨者 - Bash漏洞分析溯源

bash代码注入的安全漏洞分析 bash的环境变量 环境变量是操作系统运行shell中的变量,很多程序的运行需要获取系统的环境变量参数。具体赋值格式如下: $ var"hello world" 然后你就可以使用这个变量了,但是只是局部变量,即是当前进程…

墨者靶场 初级:Bash漏洞分析溯源

墨者靶场 初级:Bash漏洞分析溯源 题目背景介绍实训目标解题方向解题步骤 题目 背景介绍 安全工程师"墨者"对一单位业务系统进行授权测试,在测试过程中,发现存在bash命令执行漏洞。 实训目标 1、了解bash; 2、了解Bas…

Bash漏洞

1、漏洞的起因 这个漏洞的起因源自于Bash(Bourne Again SHell)的ENV指令 http://ss64.com/bash/env.html envDisplay, set, or remove environment variables, Run a command in a modified environment.Syntaxenv [OPTION]... [NAMEVALUE]... [COMMAND [ARGS]...]Options-u …

Linux系统bash漏洞

Linux系统bash漏洞 前言一、漏洞介绍二、实验过程总结 前言 bash,全称为Bourne-AgainShell,是控制Linux计算机命令提示符的软件。2014年被发现其存在严重的安全漏洞。bash在处理含有诸如”(){:;};”的环境变量赋值的代码上存在设计缺陷,错误…

Bash漏洞分析溯源

漏洞简介 Bash(GNU Bourne-Again Shell)是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。 1.bash漏洞利用的版本号为4.3或更早的版本。产生漏洞的…