• 工具

adb monkey

  • 测试前提

1)PC端已安装adb环境及做好配置

注:需要安装JDK、Android SDK并分别进行环境变量配置(此不为本次重点,不提供安装细则,可以参考本文档底部提供的参阅文件)

2)对adb命令和monkey有一定的了解

3)手机端已安装对应测试app,本文将以ownbank为例

4)测试前需要将android机(测试手机)的顶部状态栏进行屏蔽——目前通过开发隐藏或adb命令隐藏的还是可以同过下拉显示出来

当下前端开发未能实现客户端顶部状态栏永久隐藏。

  • 具体操作

1.将 Android 设备和 adb 主机(PC)连接到同一个 WiFi 网络

是否设置代理为可选操作,当前设置代理是为了方便抓包查看接口的请求情况)。

2.Android 设备需要把开发者工具-允许调试功能打开

3.使用USB数据线连接Android 设备和 adb 主机(PC)

建议使用USB,稳定性测试掉电速度很快、方便充电,同时方便不通过其他配置打开Android Studio就可以捕获日志。如果只是短时间操作,均可以选择远程连接设备。

4.打开cmd窗口或PowerShell命令窗口并确认调试包

当前使用PowerShell:

> adb devices      #查看已连接的设备

List of devices attached

R5CR205QY8R     device

> adb shell pm list packages -3 | findstr xxx      #查询包名包含“xxx”字符的第三方安装包/对应测试包,当前没有安装

> adb install -r -t D:\download\XXX_V1.1.90_20230215-common-stability_test.apk      #安装测试包

Performing Streamed Install

Success

> adb shell pm list packages -3 | findstr ownbank      #再次查询,确认包名

package:com.finance.ownbank.dev

>

5.monkey命令执行

> adb shell monkey -p com.xxx.dev -v -v -v --throttle 3 -s 1000 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt

当前操作说明:

指令

说明

-p com.xxx.dev

对包名为com.finance.ownbank.dev的app应用进行测试,如需要指定多个包,使用命令:

adb shell monkey -p com.finance.ownbank.dev -p 其他包名

-v -v -v

指定日志的级别(即日志详细程度)

--throttle 3
延时3毫秒,单位是毫秒
-s 1000
随机数种子,用于指定伪随机数生成的seed值,如果seed值相同则两次monkey测试所生成的时间序列也相同,建议使用,方便复现和回归测试
--ignore-crashes
忽略闪退或崩溃,继续发送执行事件、直到事件数执行完成
--ignore-timeouts
忽略超时导致的异常(如ANR),继续发送执行事件、直到事件数执行完成
--ignore-native-crashes
忽略native-code引起的崩溃,继续发送执行事件、直到事件数执行完成
10000000
执行10000000次事件
1>C:\Users\panpj\2023022021_info.txt

把level 1的日志保存到C:\Users\panpj\2023022021_info.txt

2>C:\Users\panpj\2023022021_info.txt
把level 2的日志保存到C:\Users\panpj\2023022021_info.txt

monkey参数说明:

—— 参数 说明
基本参数 -p <allowed-package-name> 指定一个或多个包
-s <seed> 指定一个随机数生成器的seed值
--throttle <milliseconds> 指定事件之间的固定延迟(ms)
-v

指定反馈信息级别(信息级别就是日志的详细程度),最多3个级别:

-v //缺省值,仅提供启动提示、测试完成和最终结果等的少量信息

-v  -v //较为详细的日志,包含每个Activity的事件信息

-v  -v  -v //最详细的日志

-c <main-category> 指定一个或多个类别名
-f <scriptfile> 运行指定的monkey脚本
事件参数 --pct-touch <percent> 指定触摸事件百分比
--pct-motion <percent> 指定动作事件百分比
--pct-trackball <percent> 指定轨迹事件百分比
--pct-syskeys <percent> 指定系统按键事件百分比
--pct-nav <percent> 指定基本导航事件百分比
--pct-majornav <percent> 指定主要导航事件百分比
--pct-appswitch <percent> 指定应用启动事件百分比
--pct-flip <percent> 指定flip(弹)事件的百分比
--pct-anyevent <percent> 指定其他类型事件百分比
--pct-pinchzoom <percent> 指定缩放(捏)事件百分比
--pct-permission <percent> 指定permission事件百分比,默认是0
调试参数 --ignore-crashes 忽略因崩溃或异常引起的停止运行
--ignore-timeouts 忽略应用发生超时错误(ANR)
--ignore-security-exceptions 忽略应用发生任何权限错误
--monitor-native-crashes 监视并报告monkey运行时native code的崩溃事件
--ignore-native-crashes 忽略因native code的崩溃事件
--kill-process-after-error 在应用出错后通知系统杀死发生错误的进程
--hprof 在事件序列前后立即生成profilfing报告
--dbg-no-events 监视应用程序所调用的包之间的转换
--wait-dbg 暂停执行中的monkey,直到有调试器与它连接
  • 日志分析

1.日志开头

解析命令信息,包括被执行的测试包、指令操作次数及其他参数信息等。

2.日志结尾

指令操作次数、耗时,命令操作结束标识语“Monkey finished”。

3.日志内容分析

事件

关键字

备注

程序无响应 ANR Application Not Responding
程序崩溃 CRASH

一般日志体现为“Exception”或“Error”,常见:

1)NullPointerException:空指针异常
2)SQLException:操作数据库异常类
3)ClassCastException:类型转换异常
4)NumberFormatException:数值转化异常
5)ClassNotFoundException:指定的类不存在
6)ArithmeticException:数学运算异常,如程序中出现了除以零等
7)ArrayIndexOutOfBoundsException:数组越界异常
8)IllegalArgumentException:方法的参数错误
9)IllegalAccessException:没有类访问权限
10)ArrayStoreException:错误对象存储到数组
11)FileNotFoundException:文件未找到
12)IndexOutOfBoundsException:下标越界异常
13)ActivityNotFoundException Activity:未找到异常
14)IllegalStateException:非法状态异常
15)SecurityException 安全异常
16)StackOverflowError:堆栈异常错误
17)OutOfMemoryError:内存溢出错误

其他问题

Exception

meninfo

同上可能导致崩溃的Exception,可以通过“Exception”关键字进行搜索,

meninfo关注是否存在OOM

Monkey执行的Activity Switch 一般通过Switch确认异常所在的Activity位置

可以通过关键字对采集的日志进行搜索、通过PowerShell或cmd命令窗口或android studio的日志输出进行确认,可以结合抓包工具、kibana等日志进一步确认业务请求的情况。

注:Android Studio切换日志等级后,日志就会被清空,建议慎用该功能。

4.问题重现

1)通过日志确认出错前的事件操作、手动执行复现;

2)按照原来的操作场景重新执行对应含seed值的命令进行复现。

monkey复现之seed值

使用-s参数来指定命令执行的seed值

Monkey会根据seed值来生成对应事件流,同一个seed生成的事件流是完全相同的。这里指定了seed值,是为了测试发现问题时,便于进行问题复现。

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

monkey 测试1:adb shell monkey -p com.kaiyuan.developmentbusiness –s 10 100

monkey 测试2:adb shell monkey -p com.kaiyuan.developmentbusiness –s 10 100

两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;

  • 测试准出

稳定性测试过程中APP端没有出现ANR、Crash和任意Exception及OOM等情况(含日志),以及不存在业务请求的异常、客户端操作的异常等。

  • 执行命令参考

    测试人员可以结合以上指令根据需要进行测试:

adb shell monkey -p com.xx.dev -v -v -v --throttle 3 -s 1 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt

adb shell monkey -p com.xxx.dev -v -v -v --throttle 3 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 20 --pct-motion 20 --pct-flip 20 --pct-pinchzoom 20  --pct-trackball  20 500000 1>C:\Users\panpj\20230222-info_02.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 20 --pct-motion 20 --pct-flip 20 --pct-pinchzoom 20  --pct-trackball  20  -s 100  500000 1>C:\Users\panpj\20230222-info_02.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 50 --pct-motion 50  50000 1>C:\Users\panpj\20230222-info_05.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 50 --pct-motion 50  50000 1>C:\Users\panpj\20230222-info_05.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 50 --pct-motion 50 -s 500000000 500000000 1>C:\Users\panpj\20230222-info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 100 -s 50000 50000000 1>C:\Users\panpj\20230228-info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 100 -s 50000 50000000 1>C:\Users\panpj\2023022819-info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v  -s 50000 50000000 1>C:\Users\panpj\20230301-info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 100 -s 500 50000 2>C:\Users\panpj\2023030220-info.txt

-- 不同事件操作

# 触摸事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 100 -s 500 5000 2>C:\Users\panpj\2023030709-touch-info.txt

# 动作事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-motion 100 -s 500 5000 2>C:\Users\panpj\2023030715-motion-info.txt

# 轨迹事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-trackball 100 -s 500 5000 2>C:\Users\panpj\202303071501-trackball-info.txt

# 系统按键事件(音量调节等)

adb shell monkey -p com.xxx.dev--ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-syskeys 100 -s 500 5000 2>C:\Users\panpj\202303071502-syskeys-info.txt

# 基本导航事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-nav 100 -s 500 5000 2>C:\Users\panpj\202303071507-nav-info.txt

# 主要导航事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-majornav 100 -s 500 5000 2>C:\Users\panpj\202303071514-majornav-info.txt

# 应用启动事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-appswitch 100 -s 500 5000 2>C:\Users\panpj\202303071515-appswitch-info.txt

# flip(弹)事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-flip 100 -s 500 5000 2>C:\Users\panpj\202303071516-flip-info.txt

# 其他类型事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-anyevent 100 -s 500 5000 2>C:\Users\panpj\202303071516-anyevent-info.txt

# 缩放(捏)事件(含有输入)

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-pinchzoom 100 -s 500 5000 2>C:\Users\panpj\2023030719-pinchzoom-info.txt

# permission事件(没看到什么操作)

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-permission 100 -s 500 5000 2>C:\Users\panpj\202303071527-permission-info.txt

  • 已知问题参考

firebase监控到的异常:----这个平台监控的数据不够精准,有发现顶部统计数据不对齐的情况以及客户端获取到崩溃但是这里没有捕获到的情况

  • 拓展

1.adb命令--远程连接设备

> adb devices      #查看已连接的设备,当前没有连接设备

List of devices attached

> adb tcpip 5555      #打开adb连接设备的端口,需要先使用数据线将PC跟测试手机进行连接

restarting in TCP mode port: 5555

> adb connect 10.10.24.73      #连接手机ip地址(关于手机-状态信息-IP地址 或 连接-WiFi-已连接的wifi-IP地址),无线连接

connected to 10.10.24.73:5555

> adb devices      #再次查看已连接的设备,设备连接成功,以下两个都是同一个手机设备,一个是数据线连接的、一个是无线连接,此时可以把PC跟测试手机连接的数据线断开,避免因不能识别命令具体是针对哪个设备进行而影响后面操作

List of devices attached

R5CR205QY8R     device

10.10.24.73:5555        device

> adb devices      #拔掉数据线后,再次查看已连接的设备,当前断开数据线是为了方便在暴力操作情况下的耗电情况,如果稳定性测试的时间很长、不建议通过ip+端口进行连接

List of devices attached

10.10.24.73:5555        device

2.adb命令--隐藏状态栏相关

> adb shell settings put global policy_control immersive.full=*      #隐藏状态栏和虚拟键

> adb shell settings put global policy_control immersive.status=*      #仅隐藏状态栏

> adb shell settings put global policy_control immersive.navigation=*      #仅隐藏虚拟键

> adb shell settings put global policy_control null      #恢复状态栏和虚拟键

> adb shell

o1q:/ $ service call statusbar 1      //下拉显示命令行

Result: Parcel(00000000    '....')

o1q:/ $ service call statusbar 2      //收缩状态栏

Result: Parcel(00000000    '....')

3.Android studio的性能分析面板

APP性能测试时可以结合该监控进行相关指标确认,有兴趣可以拓展学习下Android studio相关功能。

可参阅文档:

1、adb基本介绍:Android 调试桥 (adb)

2、adb环境安装:adb环境配置详细

3、monkey的基本介绍和用法:UI/Application Exerciser Monkey

1.Android稳定性测试相关推荐

  1. android 稳定性测试工具,APP 稳定性测试工具-Fastbot_Android详解

    基于monkey的二次开发,约束monkey的行为,比monkey更智能. 写在开始 monkey测试的随机性概率过大,导致其效率并不能达到预期.有时可能遍历了很久,依旧与最有可能发生问题的部分擦肩而 ...

  2. android稳定性测试

    1.monkey介绍 说到稳定性测试我们就不得不说monkey,monkey就是猴子,所谓的稳定性测试,就像一只猴子,在设备上进行随机点击触摸等事件操作以此来发现软件的异常,它的主要目的就是为了测试a ...

  3. Android稳定性测试工具Monkey的使用

    综述 Monkey是一个命令行工具,它可以运行在我们的模拟器或者设备当中.它可以发送一些伪随机(pseudo-random)的用户事件流,例如点击,触摸,手势等.我们能够使用Monkey工具来对我们所 ...

  4. monkey Android稳定性测试

    monkey测试原理: Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进 ...

  5. python:app稳定性测试工具

    工作中因要测试app的稳定性,市场上多用于monkey进行稳定测试,而字节跳动开源了一个基于monkey的稳定性测试工具Fastbot,使用了一阶段,超级棒. 因为每次都要去输入一堆命令,故写了一个第 ...

  6. android驱动测试,Android: 通过 cucumber 驱动 monkey 做稳定性测试

    主要内容 稳定性测试是什么 Monkey 介绍 自动化 Monkey 稳定性测试是什么 通过随机点击屏幕一段时间,看看 app 会不会奔溃,能不能维持正常运行. Monkey 介绍 Monkey 是一 ...

  7. python实现android应用稳定性测试

    一.作用 长时间操作app是否会出现崩溃和anr现象,发现人无法感知的crash 二.实现原理 使用python模拟终端输入monkey命令,同时抓取ERROR级别及以上的logcat日志,最后通过数 ...

  8. android系统稳定性测试,Android的稳定性

    概述 Android的稳定性包含以下几个方面: 1.ANR 2.Crash 3.Tombstone 4.Freeze 5.黑屏 6.冻屏 #稳定性问题分析以及需要的相关log /data/anr/tr ...

  9. [原创]Android Monkey测试工具使用介绍

    [原创]Android Monkey测试工具使用介绍 1 Android Monkey介绍 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件 ...

最新文章

  1. linux 安装mysql
  2. 质量意味着在没有人看的时候把它做对
  3. javascript里你绝对用的上的字符分割函数--原创
  4. 用C#写的一个注册表操作类
  5. 计算机c盘用户,windows 7 c盘的用户文件夹users如何转移
  6. Oracle典型应用场景--数据迁移到本地测试
  7. javaee字符缓冲输出流
  8. 金牛判势 精品起涨预警 主升浪起爆点指标 通达信绝对精准买点指标选股公式
  9. 远程控制teamviewer|远程桌面teamviewer|远程桌面连接软件teamviewer|teamviewer无人值守
  10. python中计算ln和lg的方法
  11. 万能的5款工具推进活动策划方案
  12. 各种滤镜算法C语言,Photoshop入门学习之PS 滤镜算法原理——染色玻璃
  13. iHRM 人力资源管理系统_第7章 POI报表的入门
  14. 2022年Spark基础学习笔记
  15. 反转链表详细讲解(就地逆置法)
  16. win 10使用模拟器蓝屏解决方案
  17. 神经网络 深度神经网络,深度神经网络训练
  18. Some MATLAB tips (二)
  19. 还在说软件测试没有中年危机?9年测试工程师惨遭淘汰
  20. mysql 数据表中文转拼音 sql中文转拼音 SQL中文转拼音首字母大写

热门文章

  1. 哈佛结构和冯·诺依曼结构的区别
  2. 若依RuoYi-Vue前后端项目启动流程
  3. 【比特熊故事汇】X Microsoft Build 2022——微软专家+MVP,技术亮点全解析
  4. 找工作就上智联,效果真快,然而让我去的公司都是泡我呢
  5. MA8601 无需更改电路直接pin√pin替代FE8.1s方案
  6. 种植的黄瓜,为什么会出现早衰?如何防治和补救?
  7. 【Win10 UWP】微信SDK基本使用方法和基本原理
  8. STM32CubeMX安装问题【尤其是Java环境没安装好的情况】
  9. c语言程序设计五子棋棋盘怎么画,五子棋的棋盘画不出来,求助!!
  10. 139邮箱无法验证服务器,139邮箱无法登陆原因,怎么登录自己的139邮箱