我不能保证我在这里写下的每一句话都正确,但写在这里的每一句话都包含着我的思考和总结。是对也好,是错也好,希望大家看完后有自己的思考,那就说明您没有白看,我没有白写。探索测试的深度,享受测试的乐趣。

Android自动化测试之Monkeyrunner从零开始

上一篇 / 下一篇  2011-05-22 10:56:48 / 个人分类:自动化杂谈

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

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

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

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

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的方法和属性大家可以参考官方的文档,上面非常详细了,呵呵。
 
如蒙转载,请注明出处与原作者,谢谢合作。
 

TAG: Android Monkeyrunner 自动化测试

引用 删除 宓希殿下   /   2017-08-16 16:10:20
弹出m.android.monkeyrunner import MonkeyRunner,MonkeyDevice/system/bin/sh:from:not found
127|shell@m7cdug:/$
这是什么?
Tsinghua花的个人空间 引用 删除 Tsinghua花   /   2015-12-17 16:56:13
5
leexiaona2012的个人空间 引用 删除 leexiaona2012   /   2015-05-18 15:13:09
没看懂,有没有详细的哦或者视频啥的?
引用 删除 zhaomeng258   /   2013-10-04 16:20:57
请问楼主 关于monkeyrunner测试,如何写一个bat文件执行多个测试脚本?
我在文本文件里面写的内容如下:
monkeyrunner D:\Python\sanity\test1.py
monkeyrunner D:\Python\sanity\test2.py
monkeyrunner D:\Python\sanity\test3.py
双击这个文件不知道为什么只能执行test1.py这个用例,其他都不执行。??
一个在路上的tester的个人空间 引用 删除 lxf909   /   2013-07-25 15:08:38
你好,要安装的apk文件放在什么相对路径啊?这个路径搞不清楚,能否详细说明下?
木沙的个人空间 引用 删除 木沙   /   2012-07-26 16:06:08
5
引用 删除 sean_yin   /   2012-07-03 08:54:51
原帖由qingchunjun于2011-09-11 11:40:09发表
原帖由xiaolongqi于2011-09-08 14:59:27发表
楼主,请问一下eclipse安装的是哪个版本呀,eclipse的官网.

请问这个问题最后怎么解决的呀?
◆◇丶执念 引用 删除 空念   /   2012-05-22 11:41:35
1
引用 删除 wangqiuye   /   2012-02-17 11:37:41
大家好,我想用monkeyrunner和真机测试,怎么连接真机啊  多谢
薇_笑的个人空间 引用 删除 薇_笑   /   2011-12-13 15:48:23
5
woの测试名堂 引用 删除 yvon_ren   /   2011-10-20 11:53:10
不错,很入门 项目正在做这个。。。在实践中不会通过模拟器,安装adb后,直接设置ADBHOST便可与设备通信了
woの测试名堂 引用 删除 yvon_ren   /   2011-10-20 11:53:10
5
我的测试人生 引用 删除 qingchunjun   /   2011-09-25 19:04:30
原帖由coco111于2011-09-22 16:43:19发表
请问进行到步时
device = MonkeyRunner.waitForConnection()

出现一连串字符,其中最后一行是:
ja.

出现这个问题很有可能是你在连接之前没有启动android的模拟器,导致waitForConnection方法返回空指针。建议手动先启动模拟器或者用脚本启动模拟器。
引用 删除 coco111   /   2011-09-22 16:43:19
请问进行到步时
device = MonkeyRunner.waitForConnection()

出现一连串字符,其中最后一行是:
java.lang.NullPointerException: java.lang.NullPointerException

这是什么意思?什么原因失败了?
我的测试人生 引用 删除 qingchunjun   /   2011-09-11 11:40:09
原帖由xiaolongqi于2011-09-08 14:59:27发表
楼主,请问一下eclipse安装的是哪个版本呀,eclipse的官网有好多个,不知道选哪一个,谢谢了

我用的是3.5.2 GALILEO。这个版本的eclipse比较稳定,不推荐用最新的版本。
引用 删除 xiaolongqi   /   2011-09-08 14:59:27
楼主,请问一下eclipse安装的是哪个版本呀,eclipse的官网有好多个,不知道选哪一个,谢谢了
我的测试人生 引用 删除 qingchunjun   /   2011-08-10 16:14:32
原帖由youxu10于2011-08-09 16:01:05发表
device.installPackage("../samples/android-10/ApiDemos/bin/Apidemos.apk")
这一步弹出错误.

这主要是由于你的机器上已经有一个ApiDemos的application了,并且这个application的证书跟你要装的这个证书不一致。解决办法是先卸载你现有的ApiDemos,再使用installPackage就OK了。
引用 删除 youxu10   /   2011-08-09 16:01:05
device.installPackage("../samples/android-10/ApiDemos/bin/Apidemos.apk")
这一步弹出错误提示 install-parse-failed-inconsistent-certificates 怎么解决啊?
我的测试人生 引用 删除 qingchunjun   /   2011-08-03 23:17:21
原帖由十期学员于2011-07-27 18:58:15发表
“接下来,我们就可以启动其中的任意activity了,只要传入package和activity名称即可。”
请问LZ,这里.

如果你有源码的话,那相信不成问题哈。如果没有源码,我们可以通过以下方法获取包名和入口主activity的名称:
1. 运行 emulator
2. 运行命令: adb install test.apk
3. 运行adb logcat
在这个打印出来的log里面你就可以找到包名和主activity的名称了。
藏经阁 引用 删除 十期学员   /   2011-07-27 18:58:15
“接下来,我们就可以启动其中的任意activity了,只要传入package和activity名称即可。”
请问LZ,这里的package和activity名称在哪里找?谢谢答复!
 

评分:0

我来说两句

qingchunjun

qingchunjun

十年软件测试经验,三年测试项目和团队管理经验,非典型性程序员。注重测试理论体系的研究和测试实际项目的结合。目前专注于移动平台自动化测试项目经验探索和自动化测试平台建设。同时也对python和android较感兴趣,希望和大家一起交流学习。新浪微博@pure0927

日历

« 2024-04-18  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 233245
  • 日志数: 16
  • 建立时间: 2011-01-05
  • 更新时间: 2015-01-07

RSS订阅

Open Toolbar