monkeyrunner使用小心得

作者:admin 发布时间:July 10, 2011 分类:android

Android SDK提供的monkeyrunner(不是Monkey)用来做功能性测试还是比较给力的,而且使用也很容易上手,按着使用文档来就可以。

使用过程中,发现gesture的模拟不是那么好用,也就是drag()方法。在HOME下,倒没问题,能看到屏幕拖动动作,但是在自己应用中没有反应。通过logcat发现实际触发的是OnGestureListener.onLongPress () 这个接口, 所以需要把他禁掉,调用setIsLongpressEnabled(false)即可。这个在模拟双击的时候也是如此,发现monkeyrunner的press() 也会被onLongPress ()截走。但在实际使用自己的应用中,并没有这个情况,即在setIsLongpressEnabled (true)的时候,拖动和双击都没问题,并没有触发onLongPress()。

没看过 monkeyrunner的源码,这只是从log得出的一个解决方法,供参考。如果有别的解决方法,希望讨论讨论。

另外,在monkeyrunner中尽量避免对于坐标的依赖,特别是针对需要多SDK版本、多种不同大小屏幕下的自动测试(不知道是不是能动态通过getPropery(display.width/height)来调整,这个还没研究过)。而且大多数情况下,确实也可以避免(只要这个操作是可以通过模拟器按钮来完成):

1)比如对话框不同按钮点击,这个可以通过先LEFT _KEY 和ENTER来模拟。

2)比如菜单选择,根据菜单个数和需要选择的菜单位置,也可以用LEFT_KEY, DOWN_KEY来定位, 等等。

当然对于那些没有焦点的组件点击,就没什么好的办法了。

针对单个设备的测试,可以用recorder类来录制测试用例即可。

----------------

更新,刚才看了一下最新的MonkeyRunner代码,已经开始实现用id来和应用交互了,而不是通过坐标,那就更好用了,贴一段里面的README。

 1     com.android.monkeyrunner.easy contains classes intended to make it easier
 2     to interact with applications using the MonkeyRunner framework. Instead of
 3     referencing a button or input box by x,y coordinate, they can be referenced
 4     by identifier, as in the following Python example:
 5 
 6     ##############################################################################
 7 
 8     from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
 9     from com.android.monkeyrunner.easy import EasyMonkeyDevice
10     from com.android.monkeyrunner.easy import By
11 
12     # Connect to the current device.
13     device = MonkeyRunner.waitForConnection()
14 
15     # Use the EasyMonkey API, all methods on device are available in easy_device.
16     easy_device = EasyMonkeyDevice(device)
17 
18     if not easy_device.visible(By.id('id/all_apps_button')):
19         raise Error('Could not find the "all apps" button')
20 
21     print "Location of element:", easy_device.locate(By.id('id/all_apps_button'))
22 
23     easy_device.touch(By.id('id/all_apps_button'), 'DOWN_AND_UP')
24 
25     ##############################################################################
26 
27     WARNING: This API is under development and may change without notice.
28 

关于重构(refactory)

作者:admin 发布时间:July 8, 2011 分类:软件开发

项目暂告段落,写一些关于refactory的想法,算是总结。

一个项目,就算有很好的设计,从某个层次,比如一个小模块,也总是从draft开始的。更不必提agile流程下的代码实践,从最快的、能恰好满足当前需求的实现入手,而不必过于花心思在比如性能、可重用等等方面的纠结,但是有洁癖的程序员、或者“高瞻远瞩”的设计者很难做到这一点。其实换个角度,这些本身也是一种需求,但是对于需求,还是让这些“需求”来的时候再仔细考虑吧。这点上,比较喜欢引用的一句话就是:如果你被骗一次,那不是你的错, 如果你被骗两次,那就是你的问题了。对于一个模块,你忽然发现可重用,你却没有设计合理的接口,那也不是你的错。但是等下下次又有类似需求的时候,希望已经有良好的接口在那里了。所以对于refactory的第一原则应该就是: “if it works, don't fix it.” 这里work不仅仅指代码或者模块能工作(functionality),还有其他的含义,比如重用性,维护性等等。只有在不work的时候,我们的fix也更加有的放矢。

但是这点必须要有完备的测试,特别是自动测试,来作为保障。如果没有完备的测试,每一次的refactory都可能留下隐患。而自动测试,则能鼓励程序员在需要refactory的轻装上阵,很少有重复劳动。

其实以上两点,都是基于效率的考虑:不做无用的需求,不重复劳动,专注于最有产出的事情。而随着项目的推进,当发现从最初的一堆draft,慢慢的变成一个个接口明确的小模块,而且测试完备,这真的是一件愉快的事情。

Conversion to Dalvik format failed with error 1

作者:admin 发布时间:July 6, 2011 分类:android

这个错误是android开发过程中遇到的最恼人,出现频率最高的错误(没有之一)。

第一次遇到这个错误,是需要在项目中进行proguard, 使用缺省的config文件,就因为在default.properties中加入了这个文件,在export signed Application Package最后一步出现这个错误。google... 发现很多类似问题,因为第三方库,因为Ant的,解决方法很多,有不断clean,不断重启eclipse,有好使的也有不好使的。因为我的项目中也有第三方库,所以按部就班按各个方法试了试,全部失败。最后竟然发现即使新建一个“干净”的project也不能在 proguard情况下export signed application package, 直接奔溃...

醒来后,无奈之余,开始用Ant。问题暴露出来了,没装JDK!因为之前一直用的eclipse,只有JRE。装了JDK,配置项目Ant,一切顺利,得到 proguard的release版本。

回头在ADT又试了一下,Conversion ... error 1竟然不见了。

不完全(因为不知道背后逻辑关系)总结一下,不装JDK会引起这个问题,特别是在export(非build期间)最后出现这个问题,可以看看机子JDK装了没,也算是一根稻草。

自我安慰一下,付出总有回报,因为这个问题,尝试了Ant和Eclipse ADT同时使用于一个项目发挥两者所长,挺爽的。人有惰性的,如果ADT用的好好的,就懒得试Ant了。

然而,忽然发现某次,在Ant了几把后,发现ADT下又出Conversion...error 1。这次是build的时候,和网上别人碰到的一样,于是非常淡定的clean..clean..close eclipse....奔溃.....

灵光一闪, Ant的时候也偶尔会出现一个问题就是,不能清除bin/proguard/original.jar,需要手动删除(这是为啥?)

抱着希望去删除这个文件后,Conversion ...error 1错误马上消失了... 这个错误和网上很多人抱怨的现象基本吻合,所以基本可以得出: 如果出现这个问题,clean也没用,那么可以去看看bin目录下是不是有类似问题,或者ant clean一下再去用ADT。

希望不要再让我碰到这个错误了。