WeTest导读
说起Android的自动化测试,相信有很多小伙伴都接触过或者有所耳闻,本文从框架最基本的功能介绍及API的使用入手,结合简单的项目实战来帮忙大家对该框架进一步理解和加深印象。下面让我们来一睹标准App的四大自动化测试法宝的风采!
法宝1:稳定性测试利器——Monkey
要想发布一个新版本,得先通过稳定性测试。理想情况是找个上幼儿园的弟弟妹妹,打开应用把手机交给他,让他胡乱的玩,看你的程序能不能接受这样的折腾。但是我们身边不可能都有正太和萝莉,也不能保证他们拿到手机后不是测试软件的健壮性,反而测试你的手机经不经摔,这与我们的期望差太远了…
Google公司考虑到我们的需要,开发出了Monkey这个工具。但在很多人的印象中,Monkey测试就是让设备随机的乱点,事件都是随机产生的,不带任何人的主观性。很少有人知道,其实Monkey也可以用来做简单的自动化测试工作。
Mokey基本功能介绍
首先,介绍下Monkey的基本使用,如果要发送500个随机事件,只需运行如下命令:adb shell monkey 500
插上手机运行后,大家是不是发现手机开始疯狂的运行起来了。So Easy!
在感受完Monkey的效果后,发现这“悟空”太调皮了,根本招架不住啊!是否有类似“紧箍咒”这种约束类命令,让这只猴子在某个包或类中运行呢?要想Monkey牢牢的限制在某个包中,命令也很简单:adb shell monkey –p your-package-name 500
-p后面接你程序的包名。多想限制在多个包中,可以在命令行中添加多个包:
adb shell monkey –p your-package1-name –p your-package2-name 500
这样“悟空”就飞不出你的五指山了。
Mokey编写自动化测试脚本
若控制不住“悟空”,只让它随机乱点的话,Monkey是替代不了黑盒测试用例的。我们能不能想些办法,控制住“悟空”让他做些简单的自动化测试的工作呢?下面来看一下,如何用Monkey来编写脚本。
先简单介绍下Monkey的API,若有需要详细了解的小伙伴,可自行百度或谷歌一下查阅哈。
(1) 轨迹球事件:DispatchTrackball(参数1~参数12)
(2) 输入字符串事件:DispatchString(String text)
(3) 点击事件:DispatchPointer(参数1~参数12)
(4) 启动应用:LaunchActivity(String pkg_name, String class_name)
(5) 等待事件:UserWait(long sleeptime)
(6) 按下键值:DispatchPress(int keyCode)
(7) 长按键值:LongPress(int keyCode)
(8) 发送键值:DispatchKey(参数1~参数8)
(9) 打开软键盘:DispatchFlip(Boolean keyboardOpen)
了解完常用API后,我们来看一下Monkey脚本的编写规范。Monkey Script是按照一定的语法规则编写的有序的用户事件流,使用于Monkey命令工具的脚本。Monkey脚本一般以如下4条语句开头:
1 2 3 4 5 |
|
下面来看一个简单应用的实战,实现的效果很简单,就是随便输入文本,选择选项再进行提交,提交后要验证提交后的效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
将上述代码另存为HelloMonkey文件,然后将该脚本推送到手机的sd卡里。
1 |
|
然后运行:
1 |
|
脚本后面的数字1表示运行该脚本的次数。小伙伴们可以安装附件里的Bugben.apk再执行下脚本感受下哦!
Monkey工具总结
Monkey可以编写脚本做简单的自动化测试,但局限性非常大,例如无法进行截屏操作,不能简单的支持插件的编写,没有好的办法控制事件流,不支持录制回放等。我们在平时的使用中,关注较多的是利用好Monkey的优势,如不需源码,不需编译就可以直接运行。
法宝2:Monkey之子——MonkeyRunner
Monkey虽然能实现部分的自动化测试任务,但本身有很多的局限性,例如不支持截屏,点击事件是基于坐标的,不支持录制回放等。我们在实际应用中,尽量关注利用好Monkey测试的优势。若平时的工作中遇到Monkey工具无法满足的,这里给大家推荐另一款工具MonkeyRunner。
同样先简单的介绍下MonkeyRunner的API,这里重点介绍能够实现上文Monkey脚本的API,其余的API感兴趣的小伙伴可以自行查阅。
(1) 等待设备连接:waitForConnection()
(2) 安装apk应用:installPackage(String path)
(3) 启动应用:startActivity(String packageName+activityName)
(4) 点击事件:touch(int xPos, int yPos, dictionary type)
(5) 输入事件:type(String text)
(6) 等待:sleep(int second)
(7) 截图:takeSnapshot()
(8) 发送键值:press(String name, dictionary type)
MokeyRunner编写自动化测试脚本
下面我们来看下,用MonkeyRunner实现的自动化脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
将脚本保存为HelloMonkeyRunner.py,并和Bugben.apk一起拷贝到Android SDK的tools目录下,执行monkeyrunner HelloMonkeyRunner.py
执行完成后,效果如上,并且会在当前目录生成HelloMonkeyRunner.png截图。
MokeyRunner的录制回放
首先是环境配置,在源码“~\sdk\monkeyrunner\scripts”目录下有monkey_recZ喎�"/kf/ware/vc/" target="_blank" class="keylink">vcmRlci5webrNbW9ua2V5X3BsYXliYWNrLnB5o6y9q9Xiwb249s7EvP4ouL28/tbQ09DV4sG9zsS8/im/vbG0tb1TREu1xHRvb2xzxL/CvM/Co6y+zb/J0tTNqLn9yOfPwrT6wuu9+NDQxvS2r6O6PC9jb2RlPjwvY29kZT48L2NvZGU+PC9wPg0KPHByZSBjbGFzcz0="brush:java;">monkeyrunner
monkey_recorder.py
运行结果如下图所示:
下面用MonkeyRecorder提供的控件,来进行脚本的录制。
录制完成后,导出脚本保存为HelloMonkeyRunnerRecorder.mr,用文本编辑器打开代码如下:
1 2 3 4 5 6 |
|
脚本录制完毕,接来下看看回放脚本是否正常。回放脚本时执行以下命令:
monkeyrunner monkey_playback your_script.mr
由于脚本中未加入拉起应用的代码,这里运行前需手动拉起应用。
结果运行正常,符合我们的预期。
MonkeyRunner工具总结
MonkeyRunner有很多强大并好用的API,并且支持录制回放和截图操作。同样它也不需源码,不需编译就可以直接运行。但MonkeyRunner和Monkey类似,也是基于控件坐标进行定位的,这样的定位方式极易导致回放失败。
法宝3:单元测试框架——Instrumentation
Monkey父子均可通过编写相应的脚本,在不依赖源码的前提下完成部分自动化测试的工作。但它们都是依靠控件坐标进行定位的,在实际项目中,控件坐标往往是最不稳定的,随时都有可能因为程序员对控件位置的调整而导致脚本运行失败。怎样可以不依赖坐标来进行应用的自动化测试呢?下面就要亮出自动化测试的屠龙宝刀了——Instrumentation框架。
Instrumentation框架主要是依靠控件的ID来进行定位的,拥有成熟的用例管理系统,是Android主推的白盒测试框架。若想对项目进行深入的、系统的单元测试,基本上都离不开Instrumentation这把屠龙宝刀。
在了解Instrumentation框架之前,先对Android