作为一个客户端开发者选手来说,了解熟悉一些测试技巧还是很有必要的。最近这段时间特意去钻研了下当下比较流行的一些测试框架。这一篇先来讲讲Monkey以及与之相关的MonkeyRunner。
那么Monkey到底有什么用处呢?来看官方解释:
The Monkey is a program that runs on your emulator or device and generates pseudo-random streams of user events such as clicks, touches, or gestures, as well as a number of system-level events. You can use the Monkey to stress-test applications that you are developing, in a random yet repeatable manner.
Monkey就是一个跑在你的设备或者虚拟机上的一段程序,生成一些类似点击,触摸或者手势相关的用户事件的事件流,以及许多的系统级事件。可以使用Monkey来随机且重复的形式对正在开发的应用进行压力测试。
压力测试的意义其实大家都知道,为了程序的健壮性跟稳定性,这些虚的东西就不多说了。
先来看Monkey的基础用法:
adb shell monkey [options]
如果不指定任何options,默认会对Android模拟器或者你连接的真机设备进行Monkey测试,event-count也就是压力测试随机事件随机事件的次数。
下面是给制定的应用进行压力测试的命令:
adb shell monkey -p your.package.name -v 500
当然这个命令的事件也都是随机事件。
除此以外,Monkey还有很多其他用法。
adb shell monkey -s
seed命令的意义何在呢?ok,来讲这么一个场景。测试人员对应用进行随机事件的压力测试,测试过程中发现了一个bug。然后交给开发人员,开发人员对这个bug进行修复,修复完了测试要进行检验。那么因为之前是随机事件的压测,所以测试人员根本不知道怎么去复现出来对吧,这个时候seed参数就有用处了。。压力测试的时候制定seed多少,同一个seed参数,压力测试的过程是一样的。所以,当出现上述情况的时候,测试人员只要制定相同的seed就可以复现之前的测试过程了。
实际操作中,Monkey这里有一个很人性化的设计,我走了一遍流程发现即使你第一次压力测试忘记制定seed了,但是应用crash了,monkey会把这次命令的seed值返回给你,测试人员记下这个seed就可以了。这个命令在实际开发过程中是最基本的。
adb shell monkey --throttle
这个命令的意义就是在两个事件之间插入一个时间间隔。开发者可以使用这个命令去减缓事件的操作速度。
这里就讲这两个主要命令,其他命令基本上都是指定相对应的随机事件的比例,比如触摸事件和菜单上的键位比例等。。。我觉得实际开发中不太用得到,也比较简单感兴趣的可以看下官网,所有命令都有罗列:
https://developer.android.com/studio/test/monkey.html
ok,上面讲的都是随机事件的操作。接下来看固定事件的压力测试,也就是写一个Monkey脚本,然后模拟器或者真机去不断的去执行这个脚本。
adb shell monkey -f
这里的scriptfile也就是我们要写的Monkey脚本文件,那么这个脚本文件应该怎么来写呢?下面来看MonkeyScript相对应的命令API:
接下来对MonkeyScript讲一个简单的小例子:
typ=user
count=10
speed=1.0
start data >>
LaunchActivity(com.jjq.example, .MainActivity)
UserWait(2000)
DispatchPointer(........)
UserWait(2000)
前面四行在写的时候直接copy就可以了,接下来启动app,最后在每次操作期间都给一定时间缓冲。然后就可以做很多其他操作了,点击啊,输入啊什么的。。。。就是上面的各个API的操作,很简单就不详述了。
ok,讲完Monkey脚本之后,再来讲MonkeyRunner,为什么要有MonkeyRunner这个东西呢?其实MonkeyRunner就是一个功能更强大,API更完整的Monkey脚本。比如截图功能,MonkeyScript就是不支持的。官方文档可以看这里:https://developer.android.com/studio/test/monkeyrunner/MonkeyDevice.html
MonkeyRunner分为三种:
MonkeyDevice:MonkeyDevice 主要针对的是一些UI事件,安装和删除应用程序,运行应用程序等。
MonkeyImage:MonkeyImage用来保存设备或者模拟器屏幕的图像。该类下的方法允许开发者将图像转换成任何存储格式,将图像写入文件,复制图像,并将此对象与其他的MonkeyImage进行比较
MonkeyRunner:MonkeyRunner包含了一些弹窗啊,输入啊休眠等方法。
具体每个类下的api方法直接进官网看吧,官网把所有api全部都罗列出来了而且介绍的很详细,这里我就直接举个MonkeyRunner的测试脚本的例子:
我写了一个很简单的一个加法demo(样式什么的不要在意这种细节。。)点击add按钮,textView显示结果,点击clear按钮清除,就对这些整个的操作进行功能性测试写一套MonkeyRunner的python脚本好了。看下界面:
先来捋一下整个页面的操作流程:
1、点击edittext1获取焦点
2、输入1
3、点击back退出小键盘
4、点击edittext2获取焦点
5、输入2
6、点击back退出小键盘
7、点击add按钮
8、截图保存
9、点击clear按钮
流程就是这么简单,接下来的任务就是把这个流程转换为python脚本语句了。
#!/usr/bin/python
# -*- coding: utf-8 -*-
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
#连接设备
device = MonkeyRunner.waitForConnection(3, "192.168.56.101:5555")
#启动App
device.startActivity("com.jjq.add/.MainActivity")
MonkeyRunner.sleep(2)
#点击输入框1
device.touch(172, 390, "DOWN_AND_UP")
MonkeyRunner.sleep(1)
device.type("1")
MonkeyRunner.sleep(1)
#点击back
device.press("KEYCODE_BACK", "DOWN_AND_UP")
MonkeyRunner.sleep(1)
#点击输入框2
device.touch(262, 651, "DOWN_AND_UP")
MonkeyRunner.sleep(1)
device.type("2")
MonkeyRunner.sleep(1)
#点击back
device.press("KEYCODE_BACK", "DOWN_AND_UP")
MonkeyRunner.sleep(1)
#点击ADD按钮
device.touch(253, 924, "DOWN_AND_UP")
MonkeyRunner.sleep(2)
#截图
image = device.takeSnapshot()
image.writeToFile('./test.png', 'png')
#点击clear按钮
device.touch(220, 1195, "DOWN_AND_UP")
MonkeyRunner.sleep(2)
tips:如果你要获取点击的屏幕坐标,你可以去设备开发者选项中打开指针位置选项(屏幕叠加层显示当前触摸数据)。
前面两句话一定不要忘,忘了会报Non-ASCII character in file错误。
至于设备地址,可以通过adb devices来获取,我这里是用的genymotion。
最后打开iTerm,输入:
monkeyrunner monkey.py
当然在这之前你需要先给monkeyrunner配置下环境变量,monkeyrunner在你adb目录下的tools文件夹里。。
ok大功告成,接下来会再写一篇关于Appium自动化测试的。