Android自动化测试之Monkey 转自:LupuX

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011436666/article/details/53998332

在之前的文章Android自动化测试之Monkey中我们了解过了Monkey的4大类命令和基本使用,当我们运行Monkey之后,我们会发现它的日志输出是很有规律的,因此很有必要对Monkey事件及其输出日志做一个了解。

1、Monkey事件

Monkey事件是用来模拟用户的常规操作的,对手机进行稳定性测试,主要可以分为11大类事件。

注意:以下的pct前面是两个连在一起的中划线- -,网页上显示在了一起。

1、触摸事件

是指在屏幕的点击事件,按下并抬起的操作,由一个ACTION_DOWN–>一个ACTION_UP组成。可通过–pct-touch参数来配置此事件的比例,我们可以从运行Monkey后输出的log看到:

:Sending Touch (ACTION_DOWN): 0:(657.0,287.0)
:Sending Touch (ACTION_UP): 0:(662.1641,290.94638)

 

2、手势事件

在屏幕的某处按下、随机滑动、抬起的事件,由一个ACTION_DOWN–>多个ACTION_MOVE–>一个ACTION_UP组成。实际上是一个直线滑动操作。可通过–pct-motion来配置其百分比。

:Sending Touch (ACTION_DOWN): 0:(111.0,898.0)
:Sending Touch (ACTION_MOVE): 0:(107.93105,888.1464)
:Sending Touch (ACTION_MOVE): 0:(106.85465,885.9339)
:Sending Touch (ACTION_MOVE): 0:(104.74859,881.0618)
:Sending Touch (ACTION_MOVE): 0:(103.88795,880.0649)
:Sending Touch (ACTION_MOVE): 0:(103.34122,874.6459)
:Sending Touch (ACTION_UP): 0:(102.85543,864.8377)

 

3、二指缩放事件

此事件是指双指在屏幕同时按下,并滑动,最后在抬起,最常用的如图库中查看图片时的双指缩放操作。由一个ACTION_DOWN&ACTION_POINTER_DOWN–>多个ACTION_MOVE–>一个ACTION_UP&ACTION_POINTER_UP组成。可通过–pct-pinchzoom参数来配置此事件的百分比。

:Sending Touch (ACTION_DOWN): 0:(501.0,466.0)
:Sending Touch (ACTION_POINTER_DOWN 1): 0:(496.17197,465.6653) 1:(217.0,144.0)
:Sending Touch (ACTION_MOVE): 0:(495.73535,463.35156) 1:(209.00148,146.82776)
:Sending Touch (ACTION_MOVE): 0:(485.36288,461.93683) 1:(203.72124,151.1682)
:Sending Touch (ACTION_MOVE): 0:(471.66867,459.6027) 1:(186.45467,155.50856)
:Sending Touch (ACTION_POINTER_UP 1): 0:(443.38687,451.881) 1:(143.06265,161.267)
:Sending Touch (ACTION_UP): 0:(438.07867,448.4626)

 

4、轨迹事件

轨迹球在现在的手机上已经没有了,但我们仍可以用此事件来模拟曲线滑动操作。通过–pct-trackball参数来配置其事件百分比。

:Sending Trackball (ACTION_MOVE): 0:(0.0,-1.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,3.0)
:Sending Trackball (ACTION_MOVE): 0:(-3.0,0.0)

 

5、屏幕旋转事件

模拟手机的横竖屏操作,可通过–pct-rotation参数来配置其比例。由一个rotation事件组成,degree表示的是旋转方向,顺时针方向,0表示90度的方向,1-180度、2-270度方向、3-360度方向。

:Sending rotation degree=0, persist=false
:Sending rotation degree=3, persist=true

 

6、基本导航事件

基本导航事件是指上下左右按键的操作,在几年前的智能机上很常见,现在很少见了。由一个Key的ACTION_DOWN和ACTION_UP组成。可以用–pct-nav参数来配置其百分比。

:Sending Key (ACTION_DOWN): 19    // KEYCODE_DPAD_UP
:Sending Key (ACTION_UP): 19    // KEYCODE_DPAD_UP
:Sending Key (ACTION_DOWN): 20    // KEYCODE_DPAD_DOWN
:Sending Key (ACTION_UP): 20    // KEYCODE_DPAD_DOWN
:Sending Key (ACTION_DOWN): 21    // KEYCODE_DPAD_LEFT
:Sending Key (ACTION_UP): 21    // KEYCODE_DPAD_LEFT
:Sending Key (ACTION_DOWN): 22    // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22    // KEYCODE_DPAD_RIGHT

 

7、主要导航事件

和基本导航事件不同的是,主要导航事件通常会导致UI界面发生变化,如5键按钮中的中间件、Back Key、Menu Key等。通过–pct-majornav来配置其百分比。

:Sending Key (ACTION_DOWN): 23    // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23    // KEYCODE_DPAD_CENTER

 

8、系统按键事件

系统保留的按键,如Home键、音量键等。可通过–pct-syskeys参数来配置其百分比。

:Sending Key (ACTION_DOWN): 3    // KEYCODE_HOME
:Sending Key (ACTION_UP): 3    // KEYCODE_HOME
:Sending Key (ACTION_DOWN): 24    // KEYCODE_VOLUME_UP
:Sending Key (ACTION_UP): 24    // KEYCODE_VOLUME_UP

 

我们很容易发现几种按键事件都是通过Sending Key这个“方法”来发送的, 在其后加上ACTION和Key_Code即可

9、启动Activity事件

在手机上启动一个Activity的操作,在随机的时间间隔内Monkey将执行一个startActivity方法,最大限度上覆盖被测包中的全部Activity。可通过–pct-appswitch参数来配置其事件百分比。

:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.youdao.dict/.activity.LaunchActivity;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.youdao.dict/.activity.LaunchActivity } in package com.youdao.dict     

 

10、键盘事件

主要是一些与键盘有关的操作,比图点击输入框键盘弹起、点击其他区域收起键盘灯。可通过–pct-flip参数来配置其事件百分比。

:Sending Flip keyboardOpen=false

 

11、其他类型事件

包括上面10种事件以外的其他所有事件,如具体的数字、字母按键等。现在的手机很少带有全键盘,所以用的并不多。通过–pct-anyevent参数来配置其百分比。

:Sending Key (ACTION_DOWN): 201    // KEYCODE_BUTTON_14
:Sending Key (ACTION_UP): 201    // KEYCODE_BUTTON_14
:Sending Key (ACTION_DOWN): 51    // KEYCODE_W
:Sending Key (ACTION_UP): 51    // KEYCODE_W

 

2、Monkey日志分析

之前的文章提到过,保存日志的方式有三种:

  1. 保存在PC中: adb shell monkey [options] < count> > d:monkey.txt

  2. 保存在手机中:

    • adb shell
    • monkey [options] < count> > /sdcard/monkey.txt
  3. 运行日志和异常日志分开存放: monkey [options] < count> 1>/sdcard/monkey.txt 2>/sdcard/error.txt

通过分析Monkey运行时输出的日志可以知道其一般分为4类信息,测试命令、伪随机事件、异常信息、Monkey执行结果信息。

1、测试命令信息

当前所执行命令的各种参数信息,包括种子、事件数量、应用列表、各事件的百分比等等。部分代码清单如下:

//测试命令信息
//种子值和执行事件数量
:Monkey: seed=1234567 count=1000
//允许的应用列表
:AllowPackage: fm.qingting.qtradio
:AllowPackage: com.youdao.dict
:AllowPackage: me.ele
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
//   + Using main activity com.youdao.dict.activity.LaunchActivity (from package com.youdao.dict)
//   + Using main activity me.ele.Launcher (from package me.ele)
//   + Using main activity fm.qingting.qtradio.WelcomeActivity (from package fm.qingting.qtradio)
// Selecting main activities from category android.intent.category.MONKEY
// Seeded: 1234567
//各事件的百分比
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 2.0%
//   3: 15.0%
//   4: -0.0%
//   5: 25.0%
//   6: 15.0%
//   7: 2.0%
//   8: 2.0%
//   9: 1.0%
//   10: 13.0%

 

2、伪随机事件流信息

Monkey开始执行测试后,会顺序的输出执行的事件流信息,即本篇开始的讲到的11大事件。部分代码清单如下:

//执行的事件流信息
//启动APP事件
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.youdao.dict/.activity.LaunchActivity;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.youdao.dict/.activity.LaunchActivity } in package com.youdao.dict
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.youdao.dict/.activity.LaunchActivity } in package com.youdao.dict
//延时
Sleeping for 200 milliseconds
//导航按键事件
:Sending Key (ACTION_DOWN): 22    // KEYCODE_DPAD_RIGHT
//还有其他各种事件
...

3、异常信息

在此,举一个native crash的例子给大家看看,部分代码如下。当然,还有应用层面的Crash、ANR等各种异常信息。

//发生Crash的应用包名和pid
// CRASH: fm.qingting.qtradio (pid 20487)
//Crash的简要信息
// Short Msg: Native crash
//Crash的详细信息
// Long Msg: Native crash: Aborted
//机型和系统信息
// Build Label: Xiaomi/dior/dior:4.4.4/KTU84P/6.12.29:user/release-keys
// Build Changelist: 6.12.29
// Build Time: 1482861145000
// *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
// Build fingerprint: 'Xiaomi/dior/dior:4.4.4/KTU84P/6.12.29:user/release-keys'
// Revision: '0'
// pid: 20487, tid: 20487, name: ingting.qtradio  >>> fm.qingting.qtradio <<<
//Crash的详细日志
// signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
//     r0 00000000  r1 00005007  r2 00000006  r3 00000000
//     r4 00000006  r5 0000000b  r6 00005007  r7 0000010c
//     r8 60350e98  r9 577a6508  sl 57734830  fp 577a6378
//     ip 40160398  sp beda6828  lr 401251d1  pc 4013412c  cpsr 00030010
//     d0  732e6b69766c6164  d1  614e2e6d65747379
...

4、Monkey执行结果信息

执行成功时的结果信息:

Events injected: 1000
:Sending rotation degree=0, persist=false
:Dropped: keys=2 pointers=85 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=79214ms (0ms mobile, 0ms wifi, 79214ms not connected)
// Monkey finished

 

执行失败时的结果信息:

//显示Monkey执行失败
** Monkey aborted due to error.
//执行的事件数量
Events injected: 730
//旋转角度为0
:Sending rotation degree=0, persist=false
//丢失的事件数量
:Dropped: keys=0 pointers=1 trackballs=0 flips=0 rotations=0
//网络状况
## Network stats: elapsed time=45652ms (0ms mobile, 0ms wifi, 45652ms not connected)
//提示在执行到730个事件时出现Crash,及使用的seed
** System appears to have crashed at event 730 of 1000 using seed 1234567

 

3、使用adb命令,获取更多信息

很多时候,测试除了想知道执行过程是否有异常,还需要获取执行过程中的一些详细数据和性能信息,这时候monkey自带的log就不能满足我们的要求了。我们可以使用一些adb命令来获取更多的信息,比如:

  • 获取logcat日志信息:
    • adb shell logcat -v time > log.txt
  • 获取内存信息:
    • adb shell dumpsys meminfo <进程名>
  • 获取CPU消耗信息:
    • adb shell top -n 1 | find “进程名”
  • 获取电量信息:
    • adb shell dumpsys battery
  • 获取GPU信息:
    • adb shell dumpsys grcxinfo <进程名>
  • 获取流量信息:
    • adb shell cat/proc/uid_stat/< app uid>/tcp_rcv

如何得到app uid?可分为以下两步:

  1. 查看被测app的进程ID(pid)
    adb shell ps | grep <被测应用名>
  2. 查看用户ID(uid)
    adb shell cat /proc/$pid/status

通过以上对Monkey事件的解释和执行日志的分析,想必我们已经可以流畅的使用Monkey来进行测试了。但是仍然有很多的限制,比如无法截图、在测试的过程中如何确保网络一直在连接状态等等。这些较为深入的问题就需要我们阅读其源码并进行一些定制了。

原文地址:https://www.cnblogs.com/lixy-88428977/p/9566218.html