Android自动化测试之Monkey

时间:2021-05-11 05:39:56

最近由于公司在组织一个Free CoDE的项目,也就是由大家自己选择研究方向来做一些自己感兴趣的研究。由于之前我学过一点点关于android的东西,并且目前android开发方兴未艾如火如荼,但自动化测试还基本上属于新兴领域,接触的人并不多,所以我给我们团队提出研究android自动化测试方面的项目,果然得到大家一致的赞同,大家的兴致都很高,呵呵。于是二话不说,我们开始看看现在android平台上现有的一些自动化测试工具。经过网上的一番搜索和学习,我了解目前android SDK里自带的现成的测试工具有monkey 和 monkeyrunner两个。大家别看这俩兄弟名字相像,但其实是完完全全不同的两个工具,应用在不同的测试领域。总的来说,monkey主要应用在压力和可靠性测试上,运行该命令可以随机地向目标程序发送各种模拟键盘事件流,并且可以自己定义发送的次数,以此观察被测应用程序的稳定性和可靠性,应用起来也比较简单,记住那几个命令就行了。而monkeyrunner呢,相比之下会强大一些,它主要可应用于功能测试,回归测试,并且可以自定义测试扩展,灵活性较强,并且测试人员可以完全控制。

好了,废话不多说,我们直接进入主题吧。之所以想把这个过程写下来,是由于经过我这段时间在网上的搜索和学习,发现关于monkeyrunner的教程极少,几乎都是把android官方材料自己翻译了一下摆上去的,对于第一次接触的同学来说,可能还不太详细。我在这里就想以完全初学者的角度出来,真正从0开始,记录我的学习过程。本文仅针对真正的菜鸟,大虾们请飘过哈,嘿嘿。Android自动化测试之Monkey

要使用Monkeyrunner,我们首先得干神马呢?当然得准备使用环境。这个不外乎就是我们得事先安装好android的SDK,配置好开发环境(如Eclipse),安装好Python(因为Monkeyrunner其实是由Jython写的,直接调用android API来整的)。这些步骤网上都有非常详细的教程,教大家手把手地搭环境,我这里就不多废话了。

环境搭好后,接下来就开始我们的使用之旅了。网上的monkeyrunner很多都直接从实例代码入手,写得很粗略,也没有把详细步骤说明下来,搞得我确实废了两三天才摸到头绪。所以我这里会写得很详细,尽量帮助大家能够轻易地看懂。详细步骤如下(在模拟器上运行,由于不知道什么原因图片不能正常显示,所以我还是直接写命令吧Android自动化测试之Monkey):

1. 用Elipse打开andorid的模拟器或者在CMD中用andorid命令打开模拟器,如下:

D:\Software\Android SDK2.3\android-sdk-windows\tools>emulator -avd AVD2.3.3 Comments: 定位到android SDK的路径下的tools目录,运行上面这个命令。“AVD2.3.3”是我的模拟器的名字,这个命令是每个人自己命名的,用的时候需改成实际的名字。 2. 这个时候,如果一切正常的话,模拟器应该可以启动起来了。(运行monkeyrunner之前必须先运行相应的模拟器,不然monkeyrunner无法连接设备。这点很多教程上都没有说,我也试了好多次才明白过来)。接着,我们打开另一个CMD窗口(前一个不要关),还是定位到tools目录,输入命令"monkeyrunner",回车,将进入shell命令交互模式。

好了,接下来就可以导入monkeyrunner所要使用的模块了。当然是我们的"From...import..."

直接在shell命令中输入: from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice  回车

OK,这步完成之后,我们就可以开始和模拟器“勾兑”了,哈哈,命令如下:

device = MonkeyRunner.waitForConnection()

没有报错的话,就代表和模拟器勾兑成功,我们可以接着“骚扰”它了。接下来,我们可以在里面装点东西了。输入如下命令,并传入你的apk所在相对路径即可。我这安装的是著名的ApiDemos。成功了会返回true。如果没有返回true,一般都是语法错误或者你传入的相对路径有问题,仔细检查下就没问题了。

device.installPackage("../samples/android-10/ApiDemos/bin/Apidemos.apk")

接下来,我们就可以启动其中的任意activity了,只要传入package和activity名称即可。命令如下:

device.startActivity(component = "com.example.android.apis/com.example.android.apis.ApiDemos")

此时模拟器会自动打开ApiDemos这个应用程序的主页。

接下来我们还可以给模拟器发送更多的操作,如模拟任何按键时间和滚动等,并且可以截图。命令格式和上述命令类似,我就不再累述了。

当然,我们也可以不这样麻烦得一行行地输入命令,可以将从“from...import...”开始的所有后面的语句都写到一个python文件里面,例如 monkeyrunnerTest.py,然后我们再从命令行直接通过monkeyrunner运行它即可。比如,我们还是用上面的例子,语法如下:

D:\Software\Android2.3.3\android-sdk-windows\tools>monkeyrunner monkeyrunnerTest.py

接下来monkeyrunner会自动调用monkeyrunnerTest.py,并执行其中的语句,相当方便。

今天暂时先写到这里,今天主要的关键是明白了如何使得monkeyrunner和模拟器进行正确的连接和相关的操作,具体的monkeyrunner的方法和属性大家可以参考官方的文档,上面非常详细了,呵呵。

如蒙转载,请注明出处与原作者,谢谢合作。

 

 

时间过得真快,一晃离第一篇Monkeyrunner日志已经*个月了。虽然在这段时间里没怎么研究Monkeyrunner,但看到众多致力于Monkeyrunner的小盆友们对此话题如此沉醉,忍不住冲动再次提笔,想把自己知道一些东西跟大家再做一些分享,毕竟网上对此工具的资料少之又少,任何可用的一点资料可能对于有些童鞋来说都是一点点希望之光,呵呵。当然,我也希望自己的拙作能够起到抛砖引玉的效果,大家共同进步!

好了,闲话少说,今天我们讨论点什么呢?其实想想自己对Monkeyrunner的了解也不太深入,实在找不到太多东西给大家分享,那就还是从上一篇帖子中一些回复提到的问题说起吧。很多童鞋都问我,网上有没有什么比较好的Monkeyrunner的教程?我的回答是:没有。至少我找了很久都没有找到比较好的。信不信由你,反正我是信了Android自动化测试之Monkey幸好,*早就告诉我们:自己动手,丰衣足食,网上没有,自己研究呗。其实Monkeyrunner自身是带有帮助手册的,里面有所有API的说明,可以输出为HTML或者TXT格式的文档。这对于我们学习来说,已经足够了。可是,这个帮助文档在哪呢?根据Android developer网站上的说明,我们可以用这个命令来生成API reference手册:

monkeyrunner<format>help.py<outfile>

其中,format可以是HTML和TXT。outfile就是咱们输出文档的路径。OK,说做咱就做,比如我们运行 monkeyrunner html help.py "mrapi.html",回车。咦,报错了?Can't open sepcified script. 不对啊,这照着做也出错,这不坑die吗?是的,这次google似乎是估计留了个陷阱在这。在monkeyrunner的路径里面确实找不到help.py这个文件,不报错那就是SDK有错了。那该肿么办呢?我们可以看看monkeyrunner的源码,在Monkeyrunner.java中,可以看到静态的help方法可以生成所有帮助的字符串,那么可不可以利用这个方法来生成API帮助文档呢?实践证明是可以的。代码很简单,如下:

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

content = MonkeyRunner.help("text");
f = open('help.txt', 'w');
f.write(content);
f.close();

如果要生成html的话,替换第二行的参数为html,并将第三行的help.txt改为html即可。完毕后,我们可以保存为help.py文件(为方便起见我们最好将该文件放到monkeyrunner.bat同一目录)。然后我们直接运行 monkeyrunner help.py,等待2,3秒钟,OK,运行完毕,help.txt是不是已经在你眼前了?呵呵,好好看看吧,所有API函数都在里面了。其实大家如果不想生成文档,想看在线的,也是可以的,android developer上都有,个人所爱吧。

另外还有一个问题是,有童鞋使用MonkeyImage的sameAs方法老是出错,我自己试了试,确实要出错,错误提示是:不能将IChimpImage对象转换为IMonkeyImage对象时要出错。再次查看源码,MonkeyImage.java中的sameAs函数有这么一个注释:// TODO: check if thisconversion works

IChimpImage ther = (IChimpImage) otherObject.__tojava__(IChimpImage.class);

看来明显google的工程师还没有验证过这个转换的正确性,并且很杯具地失败了。哎,真是天意弄人。幸好,有万能的python在,我们还是有办法滴。建议大家使用python的PIL库进行图片比较,一样可以达到非常好的效果并且要稳定很多。

还有一个常见的问题是模拟按键时的press方法,比如我们要模拟按一下向下键,本来可以这样写:device.press('KEYCODE_DPAD_DOWN', 'DOWN_AND_UP')但大家会发现要报错,并且是很奇怪的错: TypeError: press: The 3rd argument is required. 咋会这样呢?再看看MonkeyDevice的源码,原来DOWN_AND_UP是MonkeyDevice的静态字符串成员,应该是可以直接调用的。我们再换成 device.press('KEYCODE_DPAD_DOWN', MonkeyDevice.DOWN_AND_UP)

这下终于OK了,呵呵。

还有一个常见的问题是,能否将monkeyrunner集成到eclipse中?答案是看你使用什么平台。如果是linux环境下,那没问题,完全可以,具体操作可以看看国外有个高手写的博客,需*:http://dtmilano.blogspot.com/2011/03/using-android-monkeyrunner-from-eclipse.html 但如果你是用的window环境,那情况似乎就没有那么乐观了。因为google没有提供在windows环境下用于eclipse的monkeyrunner解释器,所以...基本上是8可能配置的,除非哪个高手将这个解释器做出来,呵呵。还是辛苦点,手写吧,也有利于真正锻炼大家的编程能力。

Monkeyrunner是基于python的脚本自动化工具,虽然有一定的局限性,不过使用起来确实入门门槛较低,大家看看帮助,自己利用ApiDemos的example做例子多练练,应该还是可以很快入门的。

今天就先写到这里,大家在实际使用过程中有问题可以留言一起讨论讨论,共同进步!

http://www.51testing.com/?uid-22381-action-viewspace-itemid-242682