Monkey稳定性测试——你必须要懂的App稳定性测试

App稳定性测试

稳定性测试就是指软件长时间的持续运行,系统版本是否稳定,是否能否持续的为用户提供服务。
指标:
  异常的次数
  异常的频率

App的稳定性测试如何实施?

首选Monkey

Monkey是向系统发送随机的用户事件流(如按键输入、触摸屏输入和手势输入等),实现对正在开发的应用程序进行稳定性测试。可以更好的模拟用户操作,确保App的稳定性。

Monkey运行原因

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

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

3、Monkey 启动方式:在 cmd 命令提示符里面输入命令行来启动 monkey 测试。

4、命令行:adb shell monkey------monkey.shell------monkey.jar------安卓进程------设备上执行测试

Monkey原理图:

Monkey原理图:

thon3.7
Pycharm社区版
SDK 下载网址:http://www.androiddevtools.cn/
雷神模拟器
58同城apk

二、SDK环境搭建

1、下载 android-sdk,这个是做 android 测试和开发的必备环境

2、解压后,里面有个 SDK manager.exe 双击打开

3.勾选你要现在的 API 版本和对应的 android 版本,后面模拟器会用到,然后坐等下载

在系统变量新建:ANDROID_HOME,对应变量值:

E:\android-sdk-windows(sdk 安装路径)

2.path 添加两个变量,将以下箭头所指的两个文件路径添加到 path 里

path下添加如下两个路径:

E:\android-sdk-windows\tools 和 E:\android-sdk-windows\platform-tools

adb环境

1.因为 adb 是在 D:\androidsdk\android-sdk-windows\platform-tools

这个目录下的,所以上面添加了环境变量后,可以直接在 cmd 里面运行了。

2.在 cmd 输入 adb 可以查看对应版本号

三、连接雷神模拟器---adb connect 127.0.0.1:5555

首先要打开USB调式选项(默认是没有开启调式模式的)

开启调式模式操作步骤:依次打开设置--关于-连击5次版本号,再返到我设置主页就可以看到开发者选项

雷电模拟器:adb connect 127.0.0.1:5555

使用指令:adb devices

连接信息解释

手机设备:显示设备的序列号,即b2355f8a

模拟器:显示ip地址和端口,即127.0.0.1:62001

device:已识别的设备,连接成功

unauthorized:没有授权,需要手机上授权后才能连接

unkown:未识别的设备

offline:离线设备

主流安卓模拟器连接方式:

夜神模拟器:adb connect 127.0.0.1:62001

逍遥安卓模拟器:adb connect 127.0.0.1:21503

天天模拟器:adb connect 127.0.0.1:6555

海马玩模拟器:adb connect 127.0.0.1:53001

网易MUMU模拟器:adb connect 127.0.0.1:7555 MacOS:adb connect 127.0.0.1:5555

genymotion模拟器:adb connect 127.0.0.1:5555

谷歌原生模拟器:adb connect <设备的IP地址>:5555

Monkey

Monkey命令-事件数
Monkey支持的所有命令

adb shell monkey

必选的命令

COUNT:事件数
通过事件数量来测试稳定性
adb shell monkey 次数 即,adb shell monkey 50

注:可能小伙伴发现这速度也忒快了,我看都没看清,这人的速度也没这么快,不合理。哈,那接着,控制每一次操作的间隔时间

Monkey命令-事件间隔

--throttle 在事件之间插入固定延迟。通过这个选项可以控制Monkey发送事件的频率。时间单位是ms(毫秒)1000毫秒=1秒

例1:发送10个事件,持续执行时间1分钟

adb shell monkey --throttle 6000 10,即10个事件,做完一个事件就等待6秒后再执行

--randomize-throttle 用这个参数必须与--throttle 绑定使用。用于在事件之间插入随机延迟,随机延迟范围为0到throttle设置的时间,单位为毫秒;

例:adb shell monkey -p com.tencent.edu --throttle 500 --randomize-throttle 100

备注:扯了半天,小伙伴想知道我要去检测公司的app倒 底要怎么整

Monkey命令-指定包

p 此参数指定了一个包,Monkey将只允许系统启动这些包里的Activity

-p -p 如果用此参数指定了多个包,Monkey将只允许系统启动这些包里的Activity

例3:对58同城进行稳定性测试,执行100次事件

adb shell monkey -p com.wuba 100

获取包名

adb shell pm list packages

知识点:
有可伙伴可能会问,我压根不知道我学习的app的名包叫啥那怎么找呢?
aapt dump badging D:\test\xxx.apk(APK的全名),如手机淘宝.apk
在这里插入图片描述

Monkey命令-日志设置

-v Level 0 除启动提示、测试完成和最终结果之外,提供较少信息

-v-v Level 1 提供较为详细的测试信息,如逐个发送到Activity的事件

-v-v-v Level 2 提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。

例4:对58同城进行稳定性测试,执行100次事件,分别查看不同日志级别记录的信息情况

adb shell monkey -p com.wuba -v 100

adb shell monkey -p com.wuba -v-v 100

adb shell monkey -p com.wuba -v -v -v 100

日志导出到本地

adb shell monkey -p com.wuba -v-v-v 100 >d:\wuba.txt

Monkey命令-seed值
在Monkey运行过程中,肯定会发现异常、奔溃、无响应等问题,对于此类问题如何进行复现呢?

-s 伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列。

monkey日志分析详解

日志内容分析:
a. 程序无响应,ANR问题:在日志中搜索"ANR"
b. 崩溃问题:在日志中搜索"CRASH"
c. 其他问题:在日志中搜索"Exception"

日志内容解析

Monkey 在运行是输出的信息包含一般四类,分别是测试命令信息,事件流信息,异常信息, 执行结果信息:

测试命令信息 此类信息流主要包括在monkey启动后输出的当前执行各种参数信息,其中主要包括:种子值(seed),事件数量,运行的应用列表,各种事件的百分比等。这部分日志信息解析主要如下所示:

bash 复制代码
// 测试命令信息
// 随机种子值,执行事件数量
:Monkey: seed=1617866276701 count=100000
// 可运行的应用列表
:AllowPackage: com.car300.activity
//Category 包含LAUNCHER 和MONKEY
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// 各事件的百分比
 Event percentages:
// 触摸类事件占15%
0: 15.0% 事件0 :--pct-touch
// 手势类事件占10%
1: 10.0% 事件1 :--pct-motion
// 二指缩放类事件占2%
2: 2.0% 事件2 :--pct-pinchzoom
// 轨迹类事件占15%
3: 15.0% 事件3 :--pct-trackball
// 旋转类事件占0%
4: -0.0% 事件4 :--pct-rotation
// 基本导航类事件占25%
5: 25.0% 事件5 :--pct-nav
//主要导航栏类事件占15%
6: 15.0% 事件6 :--pct-majornav
//系统按键类事件占2%
7: 2.0% 事件7 :--pct-syskeys
//启动activity类事件占2%
8: 2.0% 事件8 :--pct-appswitch
//键盘类事件占1%
9: 1.0% 事件9 :--pct-flip
//其他事件类占13%
10: 13.0% 事件10 :--pct-anyevent

事件流信息 当命令开始执行测试后,会依次输出相应执行的事件流信息,主要包括前面提到的事件。这部分日志信息解析主要如下所示:

bash 复制代码
// 执行的事件流信息
// 启动App 事件
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.car300.activity/com.che300.toc.module.splash.SplashActivity;end
 // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.car300.activity/com.che300.toc.module.splash.SplashActivity mCallingUid=2000 } in package com.car300.activity
Sleeping for 300 milliseconds
// 轨迹球事件(后面括号里面是表示点击的位置坐标)
:Sending Trackball (ACTION_MOVE) 0:(907.6482,501.939)
// 点击事件(后面括号里面是表示点击的位置坐标)
:Sending Touch (ACTION_DOWN):  0:(338.0,676.0)
:Sending Touch (ACTION_UP): 0:(325.4063,658.7628)
// 延时2秒(每一个事件之间的间隔时间)
Sleeping for 300 milliseconds 
//其他事件
......

异常信息 在执行过程中遇到错误或者异常时,会输出相应的信息。这部分日志信息解析主要如下所示:

bash 复制代码
// 发送Crash 的应用包名和pid
 CRASH: com.car300.activity (pid 912)
//Crash 的简要信息(提示文件未找到)
 Short Msg: java.lang.ClassNotFoundException
//Crash 的详细信息
Long Msg: java.lang.ClassNotFoundException: Didn't find class "com.qq.AppService.AstApp" on path DexPathList[[zip file "/data/app/monkey.apk"],nativeLibraryDirectories[/data/app-lib/com.car300.activity.android.qqdownloader-2, /vendor/lib, /system/lib]]
// 机型和系统信息
 Build Label: Xiaomi/pisces/pisces:4.4.4/KTU84P/5.12.24:user/release-keys
 Build Changelist: 5.12.24
 Build Time: 1450958964000
//Crash 的详细日志
java.lang.RuntimeException: Unable to instantiate application com.qq.AppService.AstApp: java.lan.ClassNotFoundException: Didn't find class "com.qq.AppService.AstApp" on path: DexPathList[[zip fil "/data/app/monkey.apk"],nativeLibraryDirectories=[/data/app-lib/com.
car300.activity.android.qqdownloader-2, /vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:509)
at android.app.ActivityThread.access$1500(ActivityThread.java:138)
at dalvik.system.NativeStart.main(Native Method)
... 11 more

执行结果信息

当命令执行完所有事件后,会输出相应执行结果信息,其中包括执行的事件数量、旋转的角度、丢失等事件数量、网络状态以及 最终的执行结果。这部分日志信息解析主要如下所示:

bash 复制代码
// 执行的事件数量
Events injected: 100000
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量,按键0,提示0,轨迹球0,翻转0,旋转0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络 0ms ,Wi-Fi 0ms ,无网 144ms
## Network stats: elapsed time=9947108ms (0ms mobile, 0ms wifi, 9947108ms not connected)
// Monkey finished

2.如果执行过程中出现了异常导致执行失败,会输出对应的执行失败的原因,比如第几个事件执行失败以及所使用的随机种子数。这部分日志信息解析主要如下所示:

bash 复制代码
// 显示Monkey 执行失败
** Monkey aborted due to error.
// 执行的事件数量
Events injected: 8
// 旋转的角度为0
:Sending rotation degree=0, persist=false
// 丢失的事件数量,按键0,提示0,轨迹球0,翻转0,旋转0
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
// 网络状态,移动网络 0ms,Wi-Fi 0ms,无网 405ms
## Network stats: elapsed time=405ms (0ms mobile, 0ms wifi, 405ms not connected)
// 提示在执行到第8 个事件时出现Crash ,以及所使用的随机种子值
** System appears to have crashed at event 8 of 10 using seed 1454215444564

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

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

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

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

日志异常信息查找

Monkey 执行过程中常见的错误类型主要有两类:

程序无响应( ANR ):Android 系统监测到应用程序在 5 秒内没有响应输入的事件或广播在 10 秒内没有执行完毕时抛出无响应提示。

崩溃( Crash ):当应用程序出现错误时导致程序异常停止或退出的情况。

使用场景:

复现bug,回归测试(验证bug)
adb shell monkey -s 1593077384911 -p com.wuba -v-v-v 100 >d:\wuba4.txt
adb shell monkey -s 100 -p com.wuba -v-v-v 50

在Monkey运行过程中,我们可以通过结束进程的方式来终止Monkey的执行,当然在运行过程中遇到异常、奔溃等情况Monkey也会停止。为了保证执行的事件数执行完整,我们可以通过调试选项的设置来防止在运行过程中Monkey命令的提前结束。

--ignore-crashes 忽略在应用程序出现crash时导致的monkey停止

--ignore-timeouts 忽略在应用程序出现ANR问题时导致monkey停止

--ignore-security-exceptions 忽略应用程序发生许可错误时导致monkey停止

例5:对58同城进行稳定性测试,执行50次事件,忽略过程中遇到的异常,直到50次事件完成

adb shell monkey -p com.wuba --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions -v-v-v 50

Monkey百分比事件

0:点击事件百分比,即参数--pct-touch

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

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

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

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

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

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

7:系统按键事件百分比,即参数--pct-syskeys

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

9:键盘唤出隐藏事件百分比,即参数--pct-flip

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

例:adb shell monkey -p com.tencent.edu --pct-touch 10 -v -v 100

-pkg-whitelist-file 白名单,后面接txt文件,指定白名单参数后只测试白名单的应用程序

--pkg-blacklist-file 黑名单,后面接txt文件,指定黑名单参数后,避开黑名单的应用程序

例:adb shell monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt 100

注:黑白名单命令不能同时使用

总结:

1、Monkey是对安卓apk进行随机事件的操作,通过报告来查看apk是否稳定

2、只适用安卓平台

3、根据公司不同产品的特性可设置不同概率来针对性测试或回归(如抖音他的滑动频率高)

相关推荐
hello world smile1 天前
Flutter常用命令整理
android·flutter·移动开发·android studio·安卓
潘帕斯的雄鹰3 天前
【1个月速成Java】基于Android平台开发个人记账app学习日记——第4天,注册登录逻辑代码
java·学习·安卓·自定义安卓app图标
jingling5558 天前
Android系统架构
android·arm开发·系统架构·安卓
qiuqiushuibx11 天前
安卓基础001
安卓
第三女神程忆难12 天前
Android Kotlin 高阶函数详解及其在协程中的应用
android·开发语言·kotlin·移动开发·安卓·高阶函数·1024程序员节
x02414 天前
Android Room(SQLite) too many SQL variables异常
sqlite·安卓·android jetpack·1024程序员节
惜.己14 天前
Appium环境搭建全流程(含软件)
python·测试工具·node.js·appium·pytest·安卓·1024程序员节
shandianchengzi15 天前
【记录】Android|安卓平板 猫游戏(四款,peppy cat,含下载教程和链接)
android·游戏·安卓·平板·cat··tablet
jingling55516 天前
adb常见指令以及问题解决
开发语言·功能测试·测试工具·adb·安卓
jingling55516 天前
adb安装,连接模拟器以及常见指令
开发语言·功能测试·测试工具·adb·安卓