2015年5月23日星期六

Android自动测试工具monkey还是不靠谱啊

详细的monkey源码在Source or jar
monkey名字真难听,

这东西有两种用法,一种是网络命令行模式
term1:
adb forward tcp:4444 tcp:4444
adb shell monkey --port 4444


nc localhost 4444
wake
type hello
quit


还有一种用法是script file模式
monkey.txt:
start data >>
DispatchString(hello)
RotateScreen(1,0)
UserWait(1000000)

adb push monkey.txt /data/local/tmp/monkey.txt
adb shell monkey -f /data/local/tmp/monkey.txt 1

这种用法里可以设定屏幕方向,内部是冻结方向感应器。
RotateScreen(1/*横向*/,0/*monkey退出后恢复自动旋转*/)
RotateScreen(1/*横向*/,1/*monkey推出后依然禁止自动旋转*/)

这两个方法都比较温柔,如果一个app明示自己只喜欢纵向,那么这个命令没有效果。

内部是调用了
  1. iwm.freezeRotation(mRotationDegree);
  2. if (!mPersist) {
  3. iwm.thawRotation();
  4. }

奇怪的是,在网络命令模式下,不接受rotate命令,原因可能是因为fressRotation一旦被调用了,monkey退出时才能够自动解除方向冻结,因为ibinder没有提供disconnect方法。

这个monkey不靠谱,在网络命令模式下还能够wake 屏幕,但是script file模式下的DeviceWakeUp() 命令明明是允许的,但是timeout,是因为他内部试图调用一个不存在的内部Activity: com.google.android.powerutil.WakeUpScreen


    if (s.indexOf("DeviceWakeUp") >= 0) {
      String pkg_name = "com.google.android.powerutil";
      String cl_name = "com.google.android.powerutil.WakeUpScreen";
      long deviceSleepTime = this.mDeviceSleepTime;

      ComponentName mApp = new ComponentName(pkg_name, cl_name);
      this.mQ.addLast(new MonkeyActivityEvent(mApp, deviceSleepTime));

      this.mQ.addLast(new MonkeyKeyEvent(0, 7)); //POWER key down
      this.mQ.addLast(new MonkeyKeyEvent(1, 7)); //POWER key up

      this.mQ.addLast(new MonkeyWaitEvent(deviceSleepTime + 3000L));

      this.mQ.addLast(new MonkeyKeyEvent(0, 82)); //MENU key down
      this.mQ.addLast(new MonkeyKeyEvent(1, 82)); //MENU key up

      this.mQ.addLast(new MonkeyKeyEvent(0, 4)); //ESC key down
      this.mQ.addLast(new MonkeyKeyEvent(1, 4)); //ESC key up

      return;
    }

这个方法真不靠谱,还要sleep, 不仅速度慢,而且依靠menu key(其他的键也可以)解除无密码的锁屏画面,要是当时已经解锁了,这个menu键就会导致app弹出一个菜单,或者app自定义的动作。怎么可以做得着么马虎呢?

monkey里有些event产生的方法例如PinchZoom可以借鉴。

没有评论:

发表评论