2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍

2.3 解决方案2.3.1 二次开发

猴子的二次开发,比如maxin,可以通过一些黑白名单来控制,或者输入指定的事件流,或者指定不同的测试随机模式,深度优先或者控制识别等,并添加一些熔断机制执行太多在一个地方。多次后,保险丝可自动触发并上拉。但是这样还是会进入死循环,因为路径环回的问题还是解决不了。

2.3.2 指定测试页面

我们可以指定测试哪些页面,但是我们发现如果指定几个activity,虽然不会陷入路径循环,但随机性的意义并没有那么大。如果我们在几个页面上随机化,并且页面深度不是很深,那么总是在这些页面上进行测试也没有多大意义

2.3.3 调整各种事件的规模

我们可以根据应用的特点,适当调整各种事件的比例,adb也提供了这样的命令参数。

--pct-trackball 
作用:调整滚动球事件百分比。(滚动球事件由一个或多个随机的移动事件组成,有时会伴随着点击事件)如不规则滑动解锁
--pct-nav 导航,现在手机基本没有导航了
---pct-syskeys 按键消息比例,主页、后退、音量增减
--pct-anyevent 其他不常用的按键比例的设置,不常用

2.3.3 编写自定义测试脚本

Monkey测试出现上述问题的原因是它太随机了,所以如果我们减少甚至压制这种随机性,就可以避免上述问题。虽然调整各种事件的比例降低了随机性,但上述问题可能仍然存在。为此,我们可以编写一个具体的脚本自动化测试脚本编写,让事件按照我们设置的顺序发生,这样就可以解决上面的问题:既然我们可以设置事件的顺序,自然就可以到达任意深度的页面,并且可以还定位错误。

但这种方法只适合思路清晰的我们,特别是想在APP中测试一些功能。

2.3.4 分析APP特性,选择合适的解决方案

可见,要同时实现测试的随机性和上述问题的解决方案是很难的,我们必须根据自己的应用特点选择合适的解决方案。

对于页面功能少、控件简单的应用,我们可以使用自定义脚本进行测试,因为这种情况下也可以测试所有功能。

对于页面结构比较规整的应用,比如直播软件,每个页面的结构比较固定(直播间的长度是一样的),或者是电商app(每个产品的页面大致相同) )。由于随机性,点击不会总是在同一个地方点击,所以不容易一直卡在同一个页面。

三、monkey测试基本流程3.1环境准备3.1.1环境3.1.2配置流程

每个安卓手机里都有Monkey工具,但是我们看不到,因为Monkey不是可视化工具。我们需要使用 ADB 与 Monkey 进行通信。

ADB的全称是Android Debug Bridge,是电脑设备和手机之间的桥梁。在开始 Monkey 测试之前,我们需要设置环境。第一个前提是安装Java JDK,第二个是安装android SDK。

配置成功后,打开cmd,输入如下命令:

亚行

出现以下屏幕:

图片[1]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

表示配置成功。

3.2 测试 adb 程序3.2.1 连接设备

配置成功后,打开手机的开发者模式,然后打开USB调试,用数据线连接手机和电脑,然后在cmd中输入如下命令

adb devices

出现如下画面,表示连接成功

图片[2]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

3.2.2 获取包名

方法一:

在cmd中输入以下命令

adb shell pm list packages

可以查看手机所有的安装包(下面只展示部分) 可以通过名字找到你要评估的包

图片[3]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

方法二

进入

adb shell pm list packages -3

可以在手机上查看所有第三方安装包,可以通过名称找到你要评估的包

图片[4]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

方法三

输入命令

adb shell logcat|findstr "Displayed

同时打开要测试的APP,出现如下画面。这里我们以今日头条为例。

其中,com.ss.android.article.news 表示包名后跟APPactivity,可用于自动化评估。

3.2.3 使用猴子测试

测试整机

使用 adb shell monkey -v 100 测试整机

图片[5]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

测试指定的应用程序

用一个简单的命令找到包名和猴子测试,

adb shell monkey -p com.ss.android.article.news -v -v -v 100

-p 表示指定测试的程序

-v 表示查看monkey的执行日志。-v 越多,信息越详细。

它对应三个层次:

Level 0(缺省值)
除启动提示、测试完成和最终结果之外,提供较少信息。
Level 1
提供较为详细的测试信息,如逐个发送到Activity的事件。
Level 2
提供更加详细的设置信息,如测试中被选中的或未被选中的Activity

100 表示执行了 100 个测试事件

执行后会出现详细信息,同时会发现手机App界面自动进行了100次随机操作。

图片[6]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

3.2.4 日志内容分析

Monkey运行时输出的日志一般包含四类信息,分别是测试命令信息、伪随机事件流信息、异常信息、Monkey执行结果信息。

测试命令信息

-----随机种子,执行事件的数目-----
:Monkey: seed=1639214805777 count=100
-----可运行的应用列表-----
:AllowPackage: com.ss.android.article.news
-----表示启动的活动-----
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
-----表示打开的活动-----
// Selecting main activities from category android.intent.category.LAUNCHER
// Seeded: 1639214805777
-----各事件的百分比-----
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 2.0%
//   3: 15.0%
//   4: -0.0%

//   5: -0.0%
//   6: 25.0%
//   7: 15.0%
//   8: 2.0%
//   9: 2.0%
//   10: 1.0%
//   11: 13.0%

日志会显示各种操作的百分比:其含义会因不同的Android版本而异。为了理解其含义,首先使用以下命令查看Android版本

adb shell getprop ro.build.version.release

我的查询结果是

通过阅读money源码对应版本中的MonkeySourceRandom.java文件,可以看到它的Event序列为

public static final int FACTOR_TOUCH        = 0;
public static final int FACTOR_MOTION       = 1;
public static final int FACTOR_PINCHZOOM    = 2;
public static final int FACTOR_TRACKBALL    = 3;
public static final int FACTOR_ROTATION     = 4;
public static final int FACTOR_NAV          = 5;
public static final int FACTOR_MAJORNAV     = 6;
public static final int FACTOR_SYSOPS       = 7;
public static final int FACTOR_APPSWITCH    = 8;
public static final int FACTOR_FLIP         = 9;
public static final int FACTOR_ANYTHING     = 10;
public static final int FACTORZ_COUNT       = 11;    // should be last+1

所以对应的事件被解释为

//   0: 15.0%   触摸事件TOUCH,--pct-touch
//   1: 10.0%   手势事件MOTION, --pct-motion
//   2: 2.0%    两指缩放事件PINCHZOOM,--pct-pinchzoom
//   3: 15.0%   轨迹球事件TRACKBALL,--pct-trackball
//   4: -0.0%   屏幕旋转事件ROTATION, --pct-rotation
//   5: 25.0%   基本导航事件nav, --pct-nav

//   6: 15.0%   主要导航事件majornav, --pct-majornav
//   7: 2.0%    系统按钮事件sysops, --pct-syskeys
//   8: 2.0%    启动activity事件appswitch, --pct-appswitch
//   9: 1.0%    键盘轻弹事件flip, --pct-flip
//   10: 13.0%   其它事件,包括按键和不常用的按键,--pct-anyevent

伪随机时间流信息

Monkey开始执行测试后,会依次输出执行的事件流信息。

-----跳转到com.android.article.news里的activity.MainActivity这个活动-----
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.ss.android.article.news/.activity.MainActivity;end
-----允许启动com.android.article.news里的activity.MainActivity这个活动-----
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.ss.android.article.news/.activity.MainActivity } in package com.ss.android.article.news
    
-----延迟(可以在命令参数中设置延迟)-----
Sleeping for 0 milliseconds
-----触摸事件-----
:Sending Touch (ACTION_DOWN): 0:(842.0,1801.0)
-----基本导航事件-----
C:Users86156>adb shell monkey -p com.ss.android.article.news -v -v -v 100

异常信息

当 Monkey 在执行过程中遇到错误时,会输出相应的异常信息。由于本实验的软件没有遇到错误,所以没有输出任何信息。

执行结果信息

-----产生了100次事件-----Events injected: 100-----表示屏幕旋转信息-----:Sending rotation degree=0, persist=false-----表示丢弃的事件信息-----:Dropped: keys=1 pointers=0 trackballs=0 flips=0 rotations=0-----网络状态-----## Network stats: elapsed time=700ms (0ms mobile, 0ms wifi, 700ms not connected)----最终执行结果-----// Monkey finished

3.3 脚本自动化测试

3.2 实现了使用monkey进行随机测试的过程,但是有时候我们需要根据自己的需要进行测试,然后需要设计具体的测试用例。

monkey提供了一系列脚本命令,方便我们根据需要设计测试样本,主要包括

LaunchActivity(pkg_name, cl_name): 启动应用,第一个参数DispatchPress(keycode): 向系统发送一个固定的按键事件;例如home键,back键;参数是按键值 ,按键值可查看keycodeUserWait:让脚本的执行暂停一段时间,做一个等待操作RotateScreen(rotationDegree, persist): 翻转屏幕,第一个参数是旋转角度,第二个是旋转后是否停在当前位置Tap(x, y) :单击事件,点击屏幕,参数是点击坐标Drag(xStart, yStart, xEnd, yEnd) :在屏幕上滑动,坐标是从哪一点滑到哪一点DispatchString(input): 输入字符串RunCmd(cmd) :执行shell命令,比如截图 screencap -p /data/local/tmp/tmp.pngDispatchFlip(true/false) :打开或者关闭软键盘UserWait(sleepTime) :睡眠指定时间

3.3.1需求分析

本实验主要实现以下测试用例:

打开今日头条,点击搜索框,输入“abc”,然后点击搜索。播放第一个视频并在播放期间调整音量(增大和减小)。

从数据中的脚本命令可以知道,输入字符串可以使用DispatchString(input)函数,但是我们还需要点击搜索框和搜索按钮,所以需要获取对应按钮的坐标。最后,您可以使用 RunCmd (Cmd) 进行截图。

3.3.2 获取坐标

在保持设备连接的同时。执行以下命令获取当前事件,

adb shellgetevent

图片[7]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

然后点击屏幕对应区域,可以看到如下信息

图片[8]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

有四列信息,分别是:Device Name、Code、Type、Value。

代码意味着:事件是什么。

类型指:事件的相关参数

值的意思是:事件参数的值。

代码值:

0003—>绝对坐标

0000—>同步事件。代表一个操作的完成。

0001—>key_broad。

0002—>相对坐标。

类型值自动化测试脚本编写,我们只关心两个值

0035—>绝对坐标X

0036—>绝对坐标Y

value:表示对应的值

示例中点击的坐标为(0x1d2=466,0xad=173)

3.3.3脚本

根据需求已经获取的信息编写如下脚本

# Start of Script   type= user   count= 10   speed= 1.0   start data >>   #open the appLaunchActivity(com.ss.android.article.news, com.ss.android.article.news.activity.MainActivity)   UserWait(8000)Tap(576, 239)UserWait(2000) DispatchString(abc)UserWait(2000) Tap(1298, 216)UserWait(2000) Tap(746,1277)UserWait(8000) #turn up and down the volumeDispatchPress(24)UserWait(1000) DispatchPress(24)UserWait(1000) DispatchPress(24)UserWait(1000) DispatchPress(24)UserWait(1000) DispatchPress(24)UserWait(3000) DispatchPress(25)UserWait(1000) DispatchPress(25)UserWait(1000) DispatchPress(25)UserWait(1000) 

3.3.4 执行脚本

因为Monkey是在设备上运行的,所以需要先把脚本传给设备,

通过 adb push monkey.txt sdcard/monkey.txt 将文件推送到手机sd卡

然后通过 adb shell monkey -f sdcard/monkey.txt -v 1 执行脚本文件

执行日志如下:

图片[9]-2.3解决方案2.3.1编写自定义测试产生以上问题的解决方法介绍-唐朝资源网

如您所见,每个事件都已成功执行。

© 版权声明
THE END
喜欢就支持一下吧
点赞132 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片