Monkey自己就能写脚本,你不试试吗?

开发 开发工具
虽然之前是利用 Python + Monkey + adb 命令,完成的一连串自动化测试的脚本。而 Monkey 本身也是支持编写脚本的,这个脚本叫 MonkeyScript(下文简称MS),只是 Google 官方,并没有相关的文档进行描述。可我们依然可以从源码中找到蛛丝马迹。

[[213032]]

 一、前言

之前有讲解过 Android 下 Monkey 的脚本命令,而且还用 Python 写了一个非常简单的利用 Monkey 的测试脚本。

虽然之前是利用 Python + Monkey + adb 命令,完成的一连串自动化测试的脚本。而 Monkey 本身也是支持编写脚本的,这个脚本叫 MonkeyScript(下文简称MS),只是 Google 官方,并没有相关的文档进行描述。可我们依然可以从源码中找到蛛丝马迹。

本片文章适用于程序员和测试人员,会从源码的角度来分析 Monkey Script,如果仅仅是测试人员,对此不感兴趣,可以跳过相关小结进行阅读。希望阅读者有一点 ADB 和 Monkey 脚本的经验,这样更方便阅读。

二、什么是MonkeyScript

MS 是官方提供的,除了直接使用 Monkey 命令,像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。MS 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。

1、MonkeyScript的使用

MS 虽然需要编写测试脚本,但是它还是属于 Monkey 命令的一部分,需要通过 Monkey 命令进行启动、运行。

Monkey 启动 MonkeyScript 的命令如下:

  1. adb shell monkey -f <MonkeyScript> <EventCount> 

通过 -f 参数即可指定一个 MS 脚本进行执行。需要注意的是,因为 adb shell 的运行环境是在待测试的 Android 设备上,所以需要将 MS 脚本 ,使用 adb pull 命令,传到待测试的设备上,然后再进行运行。

2、MonkeyScript的常用API

MS 其实提供了非常完备的 API ,但是本篇文章并不想只是一个帮助文档,这里仅介绍一些常用的 API ,想查看完整的 API ,可以选择阅读 MS 相关的源码,或者可以在本公众号,回复关键字『MonkeyScriptAPI』即可得到完整的 API 文档。

1、点击事件(DispatchPointer)

DispatchPointer 命令用于向一个指定的坐标位置,发送单个手势消息,一般用它来模拟点击的操作。

它完整的方法签名是:

DispatchPointer ( downTime , eventTime , action , x , y , pressure , size , metaState , xPrecision , yPrecision , device , edgeFlags)

其实这么多参数,只需要关注action 、 x 、y 三个参数即可。

  • action :事件是按下还是抬起,0 表示按下,1 表示抬起。
  • x、y:表示当前事件触发的X轴和Y轴的坐标。

也就是说,两个 DispatchPointer 命令加在一起,分别表示 按下 和 抬起 ,一组按下和抬起,就代表了一次点击操作,其余的参数,统一设置为 0 即可。

2、按键消息(DispatchKey)

DispatchKey 主要是用于发送一些 Android 标准的 EventKey 按键消息。只需要传递对应的值就好了。

具体的键值,可以通过官网查询:

https://developer.android.com/reference/android/view/KeyEvent.html

DispatchKey 消息的方法前面和 DispatchPointer 一样,所以同样也只需要关注 action、x、y 三个参数即可。

3、开启关闭软键盘(DispatchFlip)

DispatchFlip 命令用于打开或者关闭软键盘。它的方法签名如下:

  1. DispatchFlip (keyboardOpen) 

其中的参数,true 表示打开,false 表示关闭。

4、打开指定的Activity(LaunchActivity)

LaunchActivity 命令用于打开任意应用的一个页面,但是前提条件是打开的Activity 需要属性 android:exported 被设定为true,才可以通过 LaunchActivity 打开。它的方法签名如下:

  1. LaunchActivity ( pkg_name , act_name ) 

它的两个参数,分别表示打开的 App 的包名和打开的 Activity 的名称。

5、等待(UserWait)

UserWait 命令用于让脚本中断执行一段时间。因为是脚本自动执行,多个事件之间执行的速度会非常的快,有时候我们需要等待一段时间,让设备响应刚才执行的事件,需要在等待一段时间之后,再继续执行脚本,这个时候就可以使用 UserWait 。

它的方法签名如下:

  1. UserWait ( sleepTime ) 

sleepTime 的单位是毫秒。

6、输入字符串(DispatchString)

DispatchString 命令用于输入一个字符串。

它的方法签名如下:

  1. DispatchString( input ) 

没什么好解释的, input 就是一个字符串即可,但是 MS 对中文的支持并不好,所以尽量输入英文的测试数据。

7、运行 Shell 命令(RunCmd)

RunCmd 命令用于在设备上运行 shell 命令。当然这些 shell 命令必须是当前待测试设备支持的 shell 命令。

它的方法签名如下:

  1. RunCmd ( cmd )   

参数 cmd 就是需要执行的 shell 命令。

8、键盘事件(DispatchPress)

DispatchPress 命令用于模拟敲击键盘的事件。

它的方法签名如下:

DispatchPress( keyName )

三、MonkeyScript的源码分析

虽然,Google 官方并没有提供对 MS 详细讲解的 API 文档,但是我们是可以通过源码来分析出 MS 支持的API的。

MS 的源码文件是:MonkeySourceScript.java

可以在 AndroidXref 网站在线查看源代码:

http://androidxref.com/5.1.1_r6/xref/development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java

这里以 5.1.1 为例子,进行讲解,其实这一块的代码变动非常的少,随手找一个版本了解即可。

在源码中,所有我们上面介绍的 API 都是以一个 static final 的形式被声明。这里简单就 LaunchActivity 的方法的源码进行讲解,其他的 API 其实也大同小异。

如源码所示,LaunchActiviity 会以数组的形式接收两个参数,分别表示 PackageName 和 Activity 的 ClassName,下面具体对应的实现,我们就不细看了。再参照上面介绍的 API ,就可以很清晰的定位出方法和参数的含义了。

四、举个例子

介绍了 MS 的 API 和在源码中的实现,当然需要写个 Demo 才是一个完整的技术文章。

1、测试需要一个待测试的App

既然是为了测试,就需要一个待测试的 App ,这里简单编写一个页面,模拟一个用户登录的操作,两个对话框,一个表示 用户名 一个表示 密码,然后点击 Login 进行登录。这个待测试的App,无论填写什么,都是弹出提示登录成功,***将输入的内容清空。

2、编写 MonkeyScript 文件

有了待测试的 App ,我们就可以开始编写 MonkeyScript 脚本文件了。

MS 脚本,只要是文本即可,不关心后缀是什么。一般来说,会以.script 或者 .mks来作为后缀,标识它是一个 Monkey 脚本。

MS 脚本虽然有一些指定的 API ,但是也有一些固定的脚本头,需要写在脚本的最前面。

  1. # 控制 monkey 发送消息的 Monkey 头 
  2. count=10 
  3. speed=1.0 
  4. start data>> 
  5. # 在此之下,编写 monkey 脚本命令 
  6. # ... 

在脚本中,脚本头是一直不变动的,为了避免写错,可以直接复制粘贴最为保险。在 start data>> 之后就可以正式开始编写 monkey 脚本了,在脚本中,使用 # 号,对单行进行注释。

接下来就开始利用 MS 提供的 API 进行脚本的编写。首先我们需要熟悉测试的步骤。

步骤如下:

  1. 启动App。
  2. 点击用户名的输入框,输入 250。
  3. 点击密码的输入框,输入 abcdef。
  4. 点击 LOGIN 按钮,弹出 Toast 提示登录成功。
  5. 此次测试结束。

按照此步骤,编写测试脚本,如下:

  1. count = 1 
  2. speed = 1.0 
  3. start data >> 
  4.  
  5. LaunchActivity(com.example.cxmy.monkeyscriptdemo,com.example.cxmy.monkeyscriptdemo.MainActivity) 
  6. UserWait(1000) 
  7.  
  8. # 点击密码框 
  9. DispatchPointer(10000,10000,0,68,345,0,0,0,0,0,0,0) 
  10. DispatchPointer(10000,10000,1,68,345,0,0,0,0,0,0,0) 
  11. UserWait(100) 
  12.  
  13. DispatchPress(KEYCODE_2) 
  14. UserWait(100) 
  15. DispatchPress(KEYCODE_5) 
  16. UserWait(100) 
  17. DispatchPress(KEYCODE_0) 
  18. UserWait(100) 
  19.  
  20. # 点击密码框 
  21. DispatchPointer(10000,10000,0,68,446,0,0,0,0,0,0,0) 
  22. DispatchPointer(10000,10000,1,68,446,0,0,0,0,0,0,0) 
  23. UserWait(100) 
  24.  
  25. DispatchString(abcdef) 
  26. UserWait(100) 
  27.  
  28. DispatchPointer(10000,10000,0,548,627,0,0,0,0,0,0,0) 
  29. DispatchPointer(10000,10000,1,548,627,0,0,0,0,0,0,0) 
  30. UserWait(100) 

注意这里分别使用了 DispatchPress 和 DispatchString 来分别使用,就是为了做演示,实际你可以依赖场景选择使用的 API 。而其中涉及到坐标点的问题,这个在后面会讲解如何获取控件的坐标点。

编写好脚本,保存为 monkey.mks 文件,并通过 adb push 将其上传到待测试的设备中。

  1. adb push monkey.mks /data/local/tmp/ 

然后通过 monkey -f 执行此脚本,例如下面执行 10 次。

  1. adb shell monkey -f /data/local/tmp/monkey.mks 10 

执行完成之后,可以在控制台,看到输出的 Log 信息。

在执行的过程中,就可以看到 MS 会自动启动我们待测试的 App ,然后按照我们的编写的测试脚本,进行重复执行 10 次。

 

3、控件坐标点的获取

网上很多推荐获取坐标点的方式,是使用 android-sdk/tools 目录下,提供的 uiautomatorviewer 工具来获取。但是这种方式非常的繁琐,而实际上,我们又不需要如此精确的坐标点,毕竟控件那么大,只要点击的坐标落在控件的位置上,就满足我们的需要。

那么我推荐另外一种更简单的方式,来获取当前你看见的,在待测试设备上的控件的坐标点的定位方式。那就是利用 Android 设备的开发者选项。

设置 → 开发者选项 → 指针位置 ,将这个属性开启之后,当手指在屏幕上滑动的时候,就可以在顶部看到当前触摸点的 X、Y 轴的坐标,这就是我们需要的。

开发者选项不是默认可见的,你需要自行开启开发者模式,之后再进行此操作。

五、总结

MS 提供的API非常的方便,可以利用它们做一些自动化操作。

【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】

戳这里,看该作者更多好文

 

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2010-08-16 10:10:22

SQL脚本

2024-03-11 08:21:49

2016-09-07 12:44:43

2021-11-12 06:11:00

M1 MacLinuxCanonical

2022-07-19 07:30:06

BigDecimal运算float

2010-08-23 10:46:52

英特尔

2020-08-17 15:25:25

HTMLPython网页

2019-10-10 09:35:01

分库分表JDK

2021-01-27 11:36:34

代码开发工具

2023-09-07 17:11:07

画质评估工具

2018-10-15 15:24:18

Python函数代码

2013-06-07 09:42:45

微信移动应用营销工具

2020-07-14 07:48:19

Java对象JVM

2022-11-11 10:01:35

代码Copilot函数

2022-08-14 22:35:37

EurekaConsul

2012-04-27 10:13:08

云计算数据IaaS

2016-01-21 09:55:51

2021-08-10 22:49:20

Windows 11Windows微软

2022-04-01 09:01:55

Dubbo接口系统

2020-01-14 17:02:20

Windows 7Windows 10微软
点赞
收藏

51CTO技术栈公众号