Android自动化测试之monkey命令使用和monkey脚本编写

Android自动化测试之monkey命令使用和monkey脚本编写



一、背景

当我们在接触到某个项目的时候,假设开发在没有充分自测的情况下,等到测试阶段再出现问题已经
为时已晚,消耗了大量的时间,现阶段,还是有很多的测试需要我们人工去干预测试,这让就消耗了
大量的人力资源,这时候就体现了自动化测试的必要性,其实市面上已经提供了很多的自动化测试平
台,这些平台在自动化测试方面都已经相对的成熟以及稳定,就如:
华为开发者联盟(收费)
TestOne测试平台(收费)
泽众一站式测试平台(收费)
LuckyFrame测试平台(免费)
TestProject (免费)

本着我们为学习阶段去学习我们的自动化测试,我们就自己动手去写一些小脚本自己去跑自动化测试,
这样才能提高我们的动手能力和测试水准

二、Monkey命令介绍

monkey命令格式:adb shell monkey [options] <event_count>

[options]:这个是一个多选值,我们可以通过adb shell monkey -help来查看这个值有什么选项,或者
	   打开monkey官网也可以查看到选项值
	   
<event_count>:这是一个必须参数,这个参数表示我们monkey测试应该在这次测试中出现的数量,
	              比如你设置这个参数是100,那么monkey就会随机产生100随机用户事件
	              
例如:adb shell monkey -p com.example.app 100

adb shell monkey -help 可以帮助我们查看有什么命令
在这里插入图片描述

基本配置选项

-p:指定一个或多个包名,让monkey只向这些应用发送事件,可以指定多个包名,例如:
adb shell monkey -p com.example.app1 -p com.example.app2,如果不指定包名,那么monkey将向所 有安装的应用发送事件

-v:设置反馈信息的详细级别,可以添加多个-v来增加详细程度,例如:
-v:表示默认的详细级别
-vv:表示更加详细的内容
-vvv:表示最详细的内容信息

操作约束

-s:设置随机事件生成器的种子值(seed value),使用相同的种子值可以重现相同的事件序列,种子值在
随机事件中异常重要,例如:当我们在第一次运行 adb shell monkey -s abc -p com.example.app 100时,
问题在这个阶段出现,当我们再次运行adb shell monkey -s abc -p com.example.app 100时,monkey就会
再次生成相同事件序列,通过对比两次的日志输出,就容易发现问题的所在

–throttle:设置用户操作间的时延,以毫秒为单位,还可以模拟用户操作的速度,用于控制事件之间的速率,
例如: adb shell monkey -p com.example.app --throttle 200 -v 10000
当我们输入如上命令,这个命令会让monkey在com.example.app应用里面生成10000个事件,每个
事件之间都会等待200毫秒,通过 --throttle 我们可以控制事件速率

调试及按键选项

–ignore-crashes:忽略应用程序的崩溃或ANR(应用无响应)错误,继续发送
–ignore-timeouts:忽略超时错误,继续发送事件
–ignore-security-exceptions:忽略安全异常,继续发送事件
–kill-process-after-error:在发生错误后,结束正在运行的应用进程
–monitor-native-crashes:监控并报告应用程序的本地代码崩溃
–herof:在事件序列结束时生成herof文件,该文件可用于分析应用发内存使用情况
–pct-touch<百分比>:设置触摸事件在monkey生成发事件流中所占的百分比,包括屏幕的滑动以及触摸
–pct-motion<百分比>:设置轨迹球(移动轨迹)事件在事件流中所占的百分比
–pct-trackball<百分比>:设置轨迹球(点击轨迹)事件在事件流中所占的百分比
–pct-nav<百分比>:设置基本导航事件在事件流中所占的百分比
ege:adb shell monkey --pct-nav 5 1000 {生成1000个随机事件,其中百分之五是基本导航键随机点击}
–pct-majornav<百分比>:设置主要导航键事件在事件流中所占的百分比
–pct-syskeys<百分比>:设置系统按键事件在事件流中的百分比
–pct-appwitch<百分比>:设置启动活动(应用切换)的事件在事件流中的占比
ege:adb shell monkey --pct-appwitch 10 800 {生成800个随机事件,其中百分之十是切换应用事件}
–pct-anyevent<百分比>:设置任意类型的事件在事件流中的百分比

三、monkey的使用

演示一段打开天气应用,使用monkey操作并打印的命令,可以使用adb shell am monitor 来查看包名,
也可以进入手机上的data/data文件里面查看包名
在这里插入图片描述

但是假设我们在跑测的时候出现了问题,这种在命令行看问题就显得很累赘,为此我们就通过重定向的方式保存
到我们的本地这样子,我们就容易清晰看到问题出现的日志
在这里插入图片描述
如下可以看出两个的打印信息基本上是一致的,只是由于两次monkey不同的操作,轨迹球有些许的不同
在这里插入图片描述
以下是三次monkey跑测,不同层次程度的详细日志打印
在这里插入图片描述

四、monkey脚本

MonkeyScript脚本:

MonkeyScript脚本是一种针对Android Monkey工具编写的文本格式脚本,用于描述一系列连续的,非随机的用户
交互事件,相对于标准的Monkey工具,后者生成从是随机的用户事件流,而MonkeyScript允许开发者编写更具有针对性的 测试脚本
在MonkeyScript中,可以编写自定义的命令,这些命令可以被monkey自动识别且按照顺序正常执行,这些命令包
括但并不限于滑动、应用启动、触摸按键输入等待特定时间等操作,通过这种方式,可以模拟用户动作行为行径

MonkeyScript缺点:

不直接支持高级复杂的功能,比如:截图或识别图像等复杂功能

MonkeyScript脚本格式:

# 脚本头部分
type=raw
events=
count=500      # 执行的事件总数
speed=1.0      # 事件发送的速度(单位时间内的事件数,默认是1.0,即每秒一个事件)

# 开始数据区
start data <<<

在这里插入图片描述

MonkeyScript常用API

1、Activity(LaunchActivity)
方法签名:LaunchActivity ( pkg_name , act_name )
解释:用于打开指定的页面,它的两个参数,分别表示打开的 App 的包名和打开的 Activity 的名称。
注意:LaunchActivity 命令用于打开的Activity 需要属性 android:exported 被设定为true,才可以通过 LaunchActivity 打开

2、点击事件(DispatchPointer)
方法签名:DispatchPointer ( downTime , eventTime , action , x , y , pressure , size , metaState , xPrecision , yPrecision , device , edgeFlags)
解释:用于向一个指定的坐标位置,发送单个手势消息,相当于模拟点击的操作。
action的值:0 表示按下,1 表示抬起。
x、y的值:模拟点击位置的横、纵坐标值。
技巧点拨:当你需要模拟一个滑块的滑动操作,可以将终点位置的action的值设为2
eg:(滑块横向滑动)
#滑动方块解锁
DispatchPointer(10,10,0,236,1502,1,1,-1,1,1,0,0)
UserWait(1000)
DispatchPointer(10,10,2,872,1502,1,1,-1,1,1,0,0)

3、等待(UserWait)
方法签名:UserWait ( sleepTime )
解释:用于让脚本中断执行一段时间

4、输入字符串(DispatchString)
方法签名:DispatchString( input )
解释:直接输入英文数据,不需要引号
注意:对中文不友好

5、键盘事件(DispatchPress)
方法签名:DispatchPress( keyName )
解释:用于模拟敲击键盘的事件

6、打开关闭软键盘(DispatchFlip)
方法签名:DispatchFlip (keyboardOpen)
解释:用于打开或者关闭软键盘;参数:true 表示打开,false 表示关闭

7、按键事件( DispatchKey )
方法签名:DiapatchKey ( downTime ,eventTime ,action ,code ,repeat ,metaState ,device ,scancode)
解释:主要是用于发送一些 Android 标准的 EventKey 按键消息。但是需要写对应的值
只需要关注,action、code、repeat即可
action : 消息的类型。0 表示按下,1 表示抬起
code:按键的值。参考 KeyEvent
repeat:按键重复的次数

8、轨迹球(DispatchTrackball)
解释: DispatchTrackball 命令用于像一个指定位置发送单个轨迹球的消息。它的方法前面也与 DispatchPointer 一样

9、旋转屏幕(RotateScreen)
方法签名: RotateScreen ( rotationDegree , persist)
解释: rotateDegree:旋转的角度;persist:是否保持旋转前的状态。0 为不保持,1 为保持

10、长按(LongPress)
解释: LongPress 命令用于模拟长按时间,标准为长按 2s 。它是一个无参的方法,直接调用即可

11、手指单击(Tap)
方法签名:Tap( x ,y ,tapDuration)
解释:Tap 命令用于模拟一次手指单击事件

12、唤醒设备并解锁(DeviceWakeUp)
解释:DeviceWakeUp 命令可以唤醒设备,并进行解锁。当然需要是一个无加密的设备才可以,有数字密码或者图形密码,都会导致失败

13、长按消息(PressAndHold)
方法签名: PressAndHold( x, y, pressDuration)
解释: PressAndHold 命令用于模拟一个长按事件,和 LongPress 类似,但是它是可以定制长按时长的

14、拖拽(Drag)
方法签名: Drag( xStart, yStart, xEnd, yEnd, stepCount)
解释:前面四个参数分别表示了事件开始的坐标点,和结束的坐标点; stepCount ,因为拖拽事件是一组连续的事件,这个参数可以指定当前拖拽事件,是由多少个小事件组成的,越多,越连贯

15、缩放事件(PinchZoom)
方法签名: PinchZoom( pt1xStart, pt1yStart, pt1xEnd, pt1yEnd, pt2xStart, pt2yStart, pt2xEnd, pt2yEnd, stepCount)
解释:它的参数分别表示了两个手指的开始位置和结束位置,并且设定了完成了多少次缩放操作

脚本源码分析

源码地址:https://github.com/gb112211/Android-Platform-Development/tree/master/cmds/monkey/src/com/android/commands/monkey
MS 的源码文件是:MonkeySourceScript.java

如图所示:所有的API都是被static final声明,为全局常量在这里就抽举一个为例,都分析属实太多,其他也大同小异,就以 LaunchActivity 进行分析
在这里插入图片描述
在这里插入图片描述

KEYCODE列表

电话健
在这里插入图片描述
控制键
在这里插入图片描述

脚本案例

启动app,搜索1次,退出。重复1万次
在这里插入图片描述

运行

1.将脚本保存命名(例monkeyscr) 2.将脚本文件放置测试机中

adb shell mkdir /sdcard/script
#创建脚本文件夹
adb push test_search /sdcard/script
#将脚本文件push到文件夹


3.运行脚本文件1万次

adb shell monkey -f /sdcard/script/monkeyscr 10000

Monkey script是按照一定语法规则编写有序的用户事件流并且适用于monkey命令工具的脚本,也可以用txt写脚本编写完毕放入手机的sdcard目录下,cmd中运行命令

adb shell monkey -f/sdcard/脚本名字 运行次数

结合monkey的-v和–hhprof输出日志和性能报告

adb shell monkey --hprof -f/sdcard/monkeysrc.txt -v -v -v 3 > c:\monkey.txt

五、Monkey日志分析

Monkey测试出现错误之后,一般的分析步骤分为以下几种:
看Monkey日志(注意第一个switch以及异常信息等)
程序无响应问题,在日志中搜索 “ANR”
奔溃问题: 在日志中搜索 “Exception”
ANR问题:在日志中搜索“ANR”

六、如何确定内存泄漏问题

前期准备:
监控工具:使用Android Profiler或者DDMS(Dalvik Debug Monitor Server)监控应用的内存使用情况
Hprof文件:熟悉如何生成和分析hprof堆转储文件,这是查找内存泄漏的关键

Monkey测试与内存监控结合:
执行Monkey测试:使用Monkey命令行工具,设置合适的参数运行Monkey测试
例如,adb shell monkey -p your.package.name --throttle 500 -v 5000,这将对指定的应用进行5000次随机事件的测试,每个事件间有500毫秒的延迟
实时监控内存:在Monkey测试的同时,通过Android Studio的Profiler或者命令行工具(如adb shell dumpsys meminfo your.package.name)实时监控应用的内存使用情况

分析Hprof文件:
1、生成Hprof:在测试前后,使用命令adb shell am dumpheap /data/local/tmp/dump.hprof来生成堆转储文件。注意,需要root权限或适当配置才能执行此操作
2、导出Hprof文件:
将生成的hprof文件从设备导出到开发机器上
3、分析Hprof:使用MAT(Memory Analyzer Tool)、VisualVM或其他内存分析工具打开hprof文件,比较测试前后的内存快照,寻找内存泄漏的迹象。重点关注对象的引用链,寻找不再使用的对象为何仍被持有引用

集成LeakCanary:
集成第三方库:LeakCanary是一个流行的内存泄漏检测库,可以在开发阶段集成到应用中,它能自动检测并报告内存泄漏
结合Monkey使用:在Monkey测试的同时,LeakCanary可以在后台工作,当检测到内存泄漏时,它会通知开发者

日志分析:
Logcat监控:在Monkey测试期间,关注Logcat输出,尤其是GC(垃圾回收)相关的信息。频繁的GC活动或内存溢出错误可能指示内存管理问题

  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值