版权声明:
本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。
允许有条件转载,转载请附带底部二维码。
一、前言
之前已经讲解过在 Android 中,Monkey 命令和 MonkeyScript 脚本的使用方式。了解完 Monkey 相关的内容,就不得不再说说 MonkeyRunner 了。
本篇文章就如何使用 MonkeyRunner (下文简称 MR)编写自动化的测试脚本进行一个全面的讲解。
在本篇文章中,你将了解到 MonkeyRunner 的使用方式,最后依然会以一个简单的 Demo 结尾。
二、什么是MonkeyRunner
MR 是Android SDK 中提供的一个测试工具,它的路径为 ~/sdk/tools/monkeyrunner 。
MR 可以在测试用例中,通过屏幕的坐标位置、控件的IDE、控件上的文字等相关属性,唯一确定一个控件,进行点击操作。
这样就弥补了 MonkeyScript 那种只能通过屏幕坐标位置来指定操作的简单方式,同时提供了非常丰富的 API 供我们使用,例如,MR 就提供了截图的 API 可以很方便的在测试的过程中,生成一个屏幕截图的图片文件。
MR 的脚本通过 Python 编写的,而运行环境,是采用的 C/S 的架构,实际上脚本是运行在 PC 上的,它会逐行去解释 Python 脚本代码,将命令发送到待测试的 Android 设备上。这一点是和 Monkey 最大的不同,Monkey 完全是运行在待测试的 Android 设备上的。
MR 提供了非常丰富的 API ,可以让测试人员非常方便的编写测试脚本。但是 MR 还提供了录制脚本的方式,录制脚本的方式之后有时间我们再说,本片文章先介绍 MR 的一些 API ,然后手工的编写一个测试脚本。
三、MonkeyRunner的API
前面提到 MR 使用的是 Python 语言进行编写的,但是它是实际上通过 Jython 来解释执行的。Jython 是一种 Python 的 Java 实现,它会将 Python 代码解释成 Java 虚拟机上可运行的字节码,并执行它。
这样的方式就可以允许在Python 中,应用和继承一个 API 中 Java 的类,可以调用任意允许被调用的 Java API了。由于 Android 的主要开发语言为 Java,所以实际上我们有大量的 API 是可以直接通过 Jython 调用的。
在编写 MR 的测试脚本的时候,是在和他提供的三个类进行交互操作。它们都是由 com.android.monkeyrunner 包下的,分别是:MonkeyRunner、MonkeyDevice 和 MonkeyImage 。下面我们就这三个类所支持的 API 进行讲解说明。
1、MonkeyRunner的API
MonkeyRunner 这个类,提供了将当前运行环境,连接到 Android 设备上的方法。
它提供的主要方法就是 waitForConnection() ,方法签名如下:
MonkeyDevice waitForConnection( float timeout, string deviceId)
此方法主要用于在当前运行环境中,和一个指定设备进行连接,并且得到此设备的一个可被操作的对象 MonkeyDevice,MonkeyDevice 就是这个可以被 MR 操作的设备对象,细节后面会讲到。
在waitForConnection 方法中,各个参数代表的意思也非常的明显,连接尝试的超时时间,deviceId 表示被链接设备的 ID ,如果当前 PC 上有连接到 Android 设备,可以使用 adb devices
这个 ADB 命令,查看到当前连接设备的 ID。
2、MonkeyDevice
前面介绍的 waitForConnect 方法,返回的就是一个 MonkeyDevice ,从取的名字也能猜到 ,它是一个 MR 可以操作的设备对象。它可以被代表当前 ADB 连接的一个物理设备,也可以是一个模拟器。
MonkeyDevice 类,主要将一些对设备相关的操作封装了起来。其中包括:安装apk、卸载apk、启动一个Activity、向设备发送按键和触摸消息等操作。
下面开始介绍它的最常用 API。
1、安装Apk
利用 MonkeyDevice 安装 Apk,需要使用 installPackage 方法,它的完整签名如下:
void installPackage( String path)
注意因为 MR 是运行在 PC 机上的,所以这里的参数 path 表示了当前 PC 机上的路径,而不是待测设备上的路径。
2、按键
press 方法,可以向指定设备发送一个按键事件。
它的完整方法签名如下:
void press( string name, dictionary type)
其中参数的含义:
- name:要发送的按键名称。可以在KeyEvent中查看。
- type:输入的按键事件类型,可以是:DOWN、UP、DOWN_AND_UP。
3、卸载Apk
remotePackage 方法可以用于卸载一个已经安装的 Apk。
它的完整方法签名如下:
void remotePackage( string package)
它通过package 参数 ,指定需要卸载的 Apk 的包名。
4、启动Activity
启动 Activity 可以使用 startActivity 方法。
它的完整签名如下:
void startActivity( string uri, string action, string data, string mimeType, Collection categories , Component component ,iterable flags)
对Android 有了解的应该能看出来,这些同 Android 中 startActivity 类似,通过一系列的参数,去指定需要启动的 Activity。
它的参数都是可选的,一般而言,我们只需要使用component参数即可通过包名和Activity 的类名,来唯一确定启动的一个Activity。
例如:
startActivity(com.package.name/com.package.name.activityname)
5、截图
使用 takeSnapshot 方法可以为设备截图,并且返回一个 MonkeyImage 对象。
它的完成签名如下:
MonkeyImage takeSnapshot()
可以看到,它获取到的是一个 MonkeyImage 对象,而不是一个直接的图片文件,可以通过这个对象,进行一些图片相关的操作,这个后面会讲到。
6、输入字符串
使用 type 方法可以输入一个我们需要的字符串。
它的完整签名如下:
void type(string message)
7、唤醒设备
唤醒设备使用 wake 方法,它的签名如下:
void wake()
3、MonkeyImage
前面提到,在 MonkeyDevice.takeSnapshot() 方法的返回值,就是 MonkeyImage 对象,它表示当前设备的一个屏幕图片信息,其中也包含了一些 API 供我们使用。
1、图像对比
截屏之后,如果需要对两个图像进行对比,可以使用sameAs() 方法,它的完整签名如下:
boolean sameAs ( MonkeyImage otherImage, float percent)
otherImage 表示需要进行对比的 MonkeyImage 对象。而既然是对比,就涉及到两个图像相似度的问题,这里可以通过一个 percent 参数,来配置对比相似度的百分比。如果要完全一致,则需要配置相似度为 100 。
2、图像保存
得到 MonkeyImage 对象并不是得到了这个图像的文件,如果需要保存截屏的图像的话,需要使用 writeToFile() 方法,将其保存为一个图像文件。
它的完整签名如下:
void writeToFile( string path, string format)
path 参数用于指定保存图像文件的路径,而 format 参数用于指定保存图像的格式,可以是 png 、jpg 之类的。
源码分析
MonkeyRunner 是有官方文档的,这一点比MonkeyScript ,但是官方文档写的比较槽,很多细节还是要通过源代码来找到。
官方文档:https://developer.android.com/studio/test/monkeyrunner/index.html
官方文档可能需要科学上网的方式打开。
一些 API 的细节,其实是可以参考源码的。
在线源码的网址:
http://androidxref.com/5.1.1_r6/xref/prebuilts/devtools/tools/lib/monkeyrunner.jar
Monkeyrunner.jar 的源码里,也看不到对应的实现,但是可以看到一些 API 的方法签名。
举个例子
还是拿之前 MonkeyScript 编写的脚本一样,写一个针对简单登录页面 App 的测试环境,举例子。
一个简单的App ,只有一个 Activity ,在启动有两个 输入框,分别表示用户名和密码, 一个按钮,点击提示登录成功,并且情况输入框的内容。
测试步骤如下:
- 启动App。
- 点击用户名的输入框,输入 250。
- 点击密码的输入框,输入 abcdef。
- 对设备进行截图,保存当前截图到目录下。
- 点击 LOGIN 按钮,弹出 Toast 提示登录成功。
- 此次测试结束。
确定了测试步骤,接下来就可以开始编写脚本了,直接上例子了,根据上面对 API 的解释和测试步骤,应该不难理解。
编写完脚本,我们将其保存为 sc.py 文件。然后使用 monkeyrunner 命令进行执行。
monkeyrunner sc.py
最终在设备上,就会发现在自动自动完成我们需要的操作。
执行完之后,在脚本目录下,也会有一个 screen.png 的图片文件,为之前输入内容的截图。
结语
MonkeyRunner 提供了非常便利的 API 供我们使用,利用好他们,是可以写出我们需要的自动化测试脚本。
还是老规矩,需要Demo的,可以在公众号回复『MonkeyRunner』获得本文中的例子。