Monkeyrunner小结

Monkeyrunner—-Android tools中的测试工具 ,主要通过脚本,实现模拟用户对appUI界面的操作,完成对app的黑盒测试。

 

利弊:
1、可以完成一定复杂程度的测试用例,避免重复的人工工作量;
2、结合heap、strict mode等工具,可以实现压力测试,性能优化等任务;
3、某些API对机型兼容不好,例如4.0以下的机型,对viewnode server支持不友善,导致drag api不能正常工作;
4、由于monkeyrunner的实现基于python脚本,性能比较低下,对脚本的编写有质量要求。
tips:
路径:sdk\tools\monkeyrunner.bat,主要依赖sdk\tools\lib下的:chimpchat.jar, hierarchyviewer2.jar, hierarchyviewer2lib.jar,可以通过分析上述三个jar的源码获得一些高级的API支持:
 1.  MonkeyRunner和MonkeyDevice是最基础的类.
 2.  EasyMonkeyDevice提供了一些根据ID进行touch, type, locate, getText的方法
 3.  By提供了根据ID返回PyObject的方法,使用EasyMonkeyDevice和By的配合可以利用ID做很多事情.
 4.  HierarchyViewer提供了根据ID找到ViewNode,对viewnode的一些操作等
 5.  ViewNode类的一个对象就代表了一个控件。控件上的所有属性,包括mID,mText,height,width都可以从这个类得到,从viewnode的java源码中可以得到非常多的信息。

 

通常实现控件的点击,可以这样子:

easy_device.touch(By.id(id),MonkeyDevice.DOWN_AND_UP)

 

上面的By.id(id)返回的只是一个PyObject,在easy_device.touch方法中,实现时再回调PyObject中的findView方法,然后再去hierarchyviewer中遍历viewnode,并计算viewnode的坐标,最后就是调用device.touch。咋一眼看,没什么问题,但是从hierarchyviewer遍历viewnode这一节,如果程序的界面十分复杂,hierarchyviewer会十分巨大,从中遍历指定id的viewnode,会超级耗时,由此会引发超时异常,往往会导致点击失败。视图的hierarchyviewer有多大?可以点击eclipse的Load View Hierarchy,即可看到视图控件的层级关系。

 

根据easy_device.touch(By.id(id),MonkeyDevice.DOWN_AND_UP)的实现原理,我们可以做一下流程的优化:

hierarchy_viewer = device.getHierarchyViewer()    
print hierarchy_viewer  #返回的对象是com.android.chimpchat.hierarchyviewer.HierarchyViewer,见于chimpchat.jar

view_node = hierarchy_viewer.findViewById('id/helpinfo_btn')
print view_node   #返回的对象是com.android.hierarchyviewerlib.models.ViewNode,见于hierarchyviewer2lib.jar

point = hierarchy_viewer.getAbsoluteCenterOfView(view_node)   #getAbsoluteCenterOfView是HierarchyViewer中的public方法
help_btn_x = point.x
help_btn_y = point.y

 

上面的代码在连接device时执行,下面的点击实现代码,则可以在任何测试逻辑环节中调用,响应时间将大大减少。

device.touch(help_btn_x, help_btn_y, MonkeyDevice.DOWN_AND_UP)  #实现view中指定id控件的点击

 

关于编码

MonkeyRunner中负责解析python的其实是Jython,即是Java版本的python解析器,两种语言之间的调用当然就会存在编码问题:
value = device.getProperty('build.version.sdk')
print ">>>%s = %s" % ('sdk version', value)

上面在print 这句代码中,会抛出 unknown encoding ‘ms936’

 

打开命令行工具,输入:chcp 437
Active code page: 437
即可解决!

Tagged:

Comments are closed.