版权声明:本文为博主原创文章,未经博主允许不得转载。 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来进行测试了。但是仍然有很多的限制,比如无法截图、在测试的过程中如何确保网络一直在连接状态等等。这些较为深入的问题就需要我们阅读其源码并进行一些定制了。

Android自动化测试之Monkey 转自:LupuX的更多相关文章

  1. Android自动化测试之Monkey

    本来是做Web后端的,来公司实习变成微信小程序前端了,到这周变成Android APP测试人员了,也是微醺啊. 由于对手工测试终究是有些抵触,所有昨天小试了一下不用写代码的自动化压力测试,在此记下我的 ...

  2. Android自动化测试之Monkey Test 安装(二)

    因为Monkey Test是在eclipse上执行的,所以玩monkey test的时候要先配置安卓开发环境 一.Android开发环境搭建指南 1.安装JDK JDK下载链接:http://www. ...

  3. Android自动化测试之Monkey Test(一)

    Monkey是什么 Monkey是可以运行在模拟器里或实际设备中的程序.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压力测试.   Monkey简 ...

  4. Android自动化测试之Monkey工具

    前言:Android自动化测试工具.方法和框架,包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.test tool等. 一. 什么是MonkeyMonk ...

  5. Android自动化测试之Monkeyrunner学习笔记(一)

    Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...

  6. [转] Android自动化测试之使用java调用monkeyrunner(五)

    Android自动化测试之使用java调用monkeyrunner 众所周知,一般情况下我们使用android中的monkeyrunner进行自动化测试时,使用的是python语言来写测试脚本.不过, ...

  7. Android自动化测试之环境搭建

    Android自动化测试之环境搭建 一.Android-sdk介绍 SDK(Software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台. ...

  8. Android自动化测试之MonkeyRunner录制和回放脚本

    Android自动化测试之MonkeyRunner录制和回放脚本(十一) 分类: 自动化测试 Android自动化 2013-02-22 10:57 7346人阅读 评论(2) 收藏 举报 andro ...

  9. 2、Android自动测试之Monkey工具

    Android自动测试之Monkey工具 APP测试工作中经常会听到领导说,APP压力测试做了吗?刚入行时,不知道什么是 APP压力测试,找了半天没找到自己想要的.过了几年,回头想这个问题,发现牵扯了 ...

随机推荐

  1. svn项目迁移至gitlab

    关于svn项目迁移有人可能会说,新建一个git项目,把原来的代码直接扔进去提交不完了吗.恩,是的,没错.但是为了保留之前的历史提交记录,还是得做下面的步骤 首先确保本地正常安装配置好git,具体步骤不 ...

  2. [译]深度神经网络的多任务学习概览(An Overview of Multi-task Learning in Deep Neural Networks)

    译自:http://sebastianruder.com/multi-task/ 1. 前言 在机器学习中,我们通常关心优化某一特定指标,不管这个指标是一个标准值,还是企业KPI.为了达到这个目标,我 ...

  3. 安利一个github上面的一个神级库thefuck,Linux命令敲错了,没关系,自动纠正你的命令

    没错就是这么神奇,名字相当噶性,thefuck.当你命令输入错误不要怕,直接来一句fuck,自动纠正你输入的命令. 在你输入错误的命令的时候,忍俊不禁的想来一句fuck,没错你不仅可以嘴上说,命令里面 ...

  4. 【POJ1068】Parencodings

    题目传送门 本题知识点:模拟 这是一道恐怖的括号题.题意稍微理解以下还是可以的. 我们针对样例来理解一下 S.P.W 到底是什么意思: S:( ( ( ( ) ( ) ( ) ) ) ) P: \(P ...

  5. 学生会管理系统(JavaWeb与数据库课程小实践)

    学生会文件管理系统使用说明书 一.流程图: 二.具体使用步骤: 1.管理员操作步骤: (1)登录: 输入用户名和密码,登录. (2)跳入欢迎动画. (3)进入主欢迎界面. (4)从主欢迎界面的学生会成 ...

  6. # 61条面向对象设计的经验原则-《OOD启思录》Arthur J.Riel

    61条面向对象设计的经验原则-<OOD启思录>Arthur J.Riel 原文 http://blog.csdn.net/cpluser/article/details/129291 61 ...

  7. springboot项目中使用spring-data-Redis对map序列化时报错

    错误信息: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at org.spri ...

  8. 改进初学者的PID-初始化

    最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...

  9. Android 调试桥介绍 (adb)

    Android 调试桥 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试 ...

  10. 如何使APP开机自启动

    方案一 将app做成系统应用,直接安装在 system/app 目录下 具体步骤为: 1.在AndroidManifest文件中,添加 android:sharedUserId="andro ...