17
11

核心实验:Android应用的Monkey测试

Monkey是由Android系统自带的应用程序,我们可以通过ADB命令“adb shell ls /system/framework”查看到这个Java应用,即一个名为“monkey.jar”的应用程序。本实验完成一个基本的Monkey测试的应用。

 实 验 简 介



前面的章节我们已经为大家详细讲解了Monkey测试的作用及脚本开发思路。


本节内容主要为大家讲解Android SDK中自带的一个Monkey命令行测试工具的使用,可以帮助我们快速地实现对Android应用程序的可靠性测试。


Monkey是由Android系统自带的应用程序,我们可以通过ADB命令“adb shell ls /system/framework”查看到这个Java应用,即一个名为“monkey.jar”的应用程序。本实验完成一个基本的Monkey测试的应用



 实 验 目 的 



(1)理解Monkey测试的价值。

(2)熟练使用Monkey命令进行测试。



 实 验 流 程 



  • 关于Monkey测试


Monkey测试当然也被称做猴子测试,其来由是假设一只猴子来操作电脑,肯定是面对电脑和系统一顿乱敲乱点,谁也无法预测究竟会发生什么意想不到的事情。而在测试的过程中,测试工程师通常执行的测试是预先设计好测试用例,应用于特定场景的。


这种情况当然适用于绝大多数情况,但是这种预先定义好的场景,通常是由测试工程师人为设定的,但是在某此特殊情况下,却不一定奏效。


所以,我们需要有另外的测试方法,来完成一种比较另类的测试,以覆盖更多可能的情况甚至不正常的情况。Monkey测试便能够很好的帮助我们弥补这样的场景。


Monkey测试通过模拟大量随机的鼠标和键盘行为,来实现一顿乱点的测试。我们不需要设计特定的用例,特定的场景,甚至不需要预选定义任何行为,只是随机模拟,大量胡乱操作即可。


当然,猴子也有聪明的猴子和笨的猴子,聪明的猴子,不但可以乱点,而且可以避免一些意外的发生,让测试工作能够正常可靠的执行下去。而笨猴子则不管不顾的,把操作系统搞崩溃也不是不可能的。


所以,在真正实施Monkey测试的过程中,虽然随机操作是其核心所在,但是我们也需要考虑一些环境问题,比如我们如果只是为了测试某个应用程序A,那么就应该只限定其界面在应用程序A的窗口范围。而如果不小心随机操作打开了其它应用或者操作到了非程序A窗口,我们应该放弃操作,或者是让程序A的窗口再次得到焦点。


当然,前面的章节我们已经为大家提到了基于图像识别的自动化测试技术的开发与应用,在Monkey测试的过程中,我们也同样可以将这种技术结合起来,让猴子变得更加聪明,以确保其运行过程中的稳定流畅。

 

  • Monkey基础应用


(1)启动一个全新的模拟器并确保ADB能够成功连接。

(2)安装一个计算器或其它应用。

(3)打开Windows命令行工具,并运行如下命令:“adb shell monkey 100”,我们可以看到,此时Monkey测试便开始工作了,在模拟器屏幕上进行各种随机操作,如图所示。


20201117_140727_887.png


(4)操作过程中我们可以屏幕在随机切换,应用程序在被随机打开,各种凌乱的操作。同时能够在命令行窗口看到一些基础的日志输出,便于我们分析和调试问题。整个这个过程,与我们前面章节利用Python开发的Monkey测试脚本所做的事情有很多相似的功能。笔者再次强调一下,在我们没有完全掌握Monkey的用法之前,尽量不要在真机上运行,因为谁也不知道会发生什么,以避免耽误时间重新恢复。

上述过程就是一个最基本的Monkey测试的使用。下面我们来看看关于Monkey测试过程中的一些更详细的用法。


  • Monkey高级应用


上述的Monkey测试是无法应用在实际测试中的,因为有太多的问题。比如它是针对整个操作系统,而没有锁定某个被测应用,同时日志输出不够详细,不便于分析判断。当然,这些问题Monkey都已经帮我们想到了,并提供了足够多的参数选项帮助我们解决。先来看看一些常见的Monkey参数选项:


(1)adb shell monkey -p pkgname:只是对指定包名(pkgname)进行测试。

(2)adb shell monkey --throttle milliseconds:指定事件之间的间隔时间,单位是毫秒。

(3)adb shell monkey -s seed: 伪随机数生成器的seed 值,如果用相同的 seed 值再次运行 Monkey ,它将生成相同的事件序列。

(4)adb shell monkey -v [-v –v]:指定日志级别。

(5)adb shell monkey --pct-touch:指定触摸事件的百分比percent。

(6)adb shell monkey --pct-motion:指定动作事件的百分比percent。

(7)adb shell monkey --pct-trackball:指定轨迹球事件百分比percent。

(8)adb shell monkey --pct-nav:指定基本导航事件百分比percent。

(9)adb shell monkey --pct-majornav:设定主要导航事件百分比percent,兼容中间键,返回键,菜单按键。

(10)adb shell monkey --pct-syskeys:设定系统事件百分比percent,比如HOME,BACK,拨号及音量调节等事件。

(11)adb shell monkey --pct-appswitch:设定启动不同应用程序的事件百分比percent。

(12)adb shell monkey --pct-anyevent:设定不常用事件的百分比。

(13)adb shell monkey --ignore-crashes:忽略崩溃和异常事件。

(14)adb shell monkey --ignore-timeouts:忽略超时事件。

(15)adb shell monkey --pkg-blacklist-file:设置不需要进行测试的黑名单应用。

(16)adb shell monkey --pkg-whitelist-file:设置需要进行测试的白名单应用。


下面就一起来看看上述选项中的一些具体的使用方法。


1.通过指定包名来限定测试范围


是指只对指定的包名运行Monkey测试,这样就可以避免Monkey测试针对整个操作系统实施随机操作,而将操作锁定在某个指定包名的应用程序中。此处所谓的包名与我们在Java或者Python过程中理解的包名是类似的概念。一个Android应用程序的开发过程中,也是按照包名+类名来组织源代码的,运行过程也是完全依赖于包名+类名,所以我们可以通过包名实现应用程序锁定。这一点与我们在前一章节中用Python开发Monkey测试脚本时指定窗口名称结合窗口大小区域进行限制是一样的道理。


比如,我们如果需要针对“一笔记账”进行Monkey测试,那么我们就需要知道“一笔记账”所在的包名。那么如何查看应用程序的包名称呢?通常我们使用aapt.exe应用程序即可完成查看。该应用程序在Android SDK的build-tools目录或者夜神模拟器的bin目录下均可以找到该应用程序。然后合作如下命令形式完成查询“aapt dump badging filename.apk”,整个过程如图所示。


20201117_140741_055.png


从上图我们可以得知,“一笔记账”应用程序的主包名为“com.mobivans.onestrokecharge”,然后我们就可以通过指定这个包名来限制Moneky测试只能够针对当前的“一笔记账”进行测试而不会影响到其它操作系统里面的应用程序了。另外,通过aapt命令我们还可以获取到应用程序的主类名(即可执行的Activity名),在aapt的上述输出中,仔细寻找“launchable-activity”,对应的值即是可执行的Activity,后续的测试我们将会使用到该值。读者朋友可以通过如下命令进行简单测试:

adb shell monkey -p com.mobivans.onestrokecharge 5000

 

上述命令表示针对“一笔记账”这个应用程序,运行5000次随机测试。在真实的Monkey测试过程中,建议将运行次数设置得更大一些,否则可能很难直接达到我们的可靠性测试目的。因为在这5000次运行过程中,有很多可能的事件,不一定会对程序的操作产品影响,比如滑动,比如切换等事件。


上述命令运行过程中,如果没有出现系统性异常,可能的正常输出如图所示。


20201117_140802_843.png


我们再一次对“一笔记账”进行了测试,结果运行过程便出现了异常,应用程序崩溃了,说明Monkey测试起到了一定的作用。如图所示。


20201117_140815_958.png


同时,在Monkey窗口中,也显示了不一样的日志输出,明确告知系统“CRASH”,即崩溃。整个日志出来容器如图所示。


20201117_140826_186.png


但是,我们从上述的日志中,虽然知道了应用程序崩溃的事实结果,但是并不知道是什么原因,什么样的操作导致的崩溃。其原因是因为我们的日志级别设置得太低,运行过程中并没有为我们显示更详细的,有价值的日志信息,不方便我们对结果进行分析处理。

 

2.通过指定日志级别来获取详细结果


所幸的是,Monkey自带了日志级别,一共有三组日志级别可供使用,只需要简单的通过指定多少个 -v 选项来进行设置即可,它们分别是:


(1)adb shell monkey -v:级别一,默认值,仅提供启动提示、测试完成和最终结果等少量信息。

(2)adb shell monkey -v -v:级别二,提供较为详细的日志,包括每个发送到Activity的事件信息。

(3)adb shell monkey -v -v -v:级别三,最详细的日志,包括了测试中选中/未选中的Activity信息。

通常情况下,我们使用级别二就可以了。运行过程的输出大致如图所示。


20201117_140843_266.png


3.通过指定随机序列来重复执行相同的操作


由于Monkey测试进行的都是随机事件,当进行Monkey测试过程中,如果我们在某一次执行过程中发现了一些问题,又想重复运行一遍对问题进行确认时是很难的。因为第二次运行并不代表能够重现该问题,因为事件序列并不一致。所以在这个过程中,我们可以使用“-s”选项来指定一个随机数种子,只要随机数种不变,那么Monkey测试过程将使用相同的事件序列,进而达到重现问题的目的。使用以下命令即可指定相同的随机序列:


adb shell monkey –v –v -p com.mobivans.onestrokecharge –s 12345 5000


如需要再一次运行,只需要执行相同的上述命令即可。读者朋友可以通过选项“-v -v”来查看两次运行的事件序列是否一致。

 

4.通过指定间隔时间让测试慢下来


在上述命令的运行过程中,我们可以看到整个操作是非常快速的,如果只运行100次,我们几乎感受不到任何的运行。这也是为什么前面的例子我们均执行了5000次。但是由于这个测试过程执行得太快,所以有时候我们难免无法看到一些关键的操作,所以我们可以通过使用“--throttle”选项指定每一个事件之间的间隔时间,让测试过程慢下来,便于我们更好的查看运行过程的各种操作,及时对一些问题进行现场确认,而不需要过分依赖于日志信息。执行过程中使用如下命令即可:

adb shell monkey –v –v -p com.mobivans.onestrokecharge --throttle 500 100


上述命令表示每执行一个操作,暂停500毫秒,即0.5秒。这样我们就有足够的时间来观看和反应。

 

5.设置黑名单或白名单应用


上述演示均针对的是一个应用的测试,有些时候我们需要测试多个应用时,我们就可以通过指定一个应用程序的包名列表来进行。而这个过程,被称之为白名单,通过指定“--pkg-whitelist-file”选项即可完成白名单的操作。操作过程如下:


(1)收集到我们需要进行测试的应用程序的主包名。

(2)新建一个文本文件,将所有需要测试的主包名写入该文件中,一行一个包名,并将其保存在本地目录,如“D:\”中,内容大致如下面的格式:

com.ylgx.ds

com.mobivans.onestrokecharge

com.miui.calculator

com.ss.android.article.news


(3)将该文件通过“adb push”命令传输给移动端,命令如下:

adb push D:\whitelist.txt /data/local/tmp/whitelist.txt


(4)运行如下命令,将对白名单中对应的多个应用程序进行测试。

adb shell monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt 5000

 

整个过程中将随机启动白名单当中的应用程序并完成Monkey测试。整个过程中,也可能启动多次应用或者对白名单当中的应用进行随机切换。当然,我们除了指定白名单之外,也可以指定黑名单,强制本次测试不对哪些应用程序进行测试。为了让Monkey测试更可控,笔者不建议使用黑名单的方式。

 

  • Monkey结果分析


当完成Monkey测试后,我们需要对测试过程中的可能的异常进行分析。所以先了解一下Monkey测试中主要有哪些异常和错误。


(1)Crash:表示被测试应用异常停止或退出。

(2)ANR:表示在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)等。

这些异常过程我们需要详细分析输出日志才能掌握详细情况。


同时,为了确保在Monkey测试过程中引入其它干扰因素,建议测试过程中注意以下事宜:

(1)尽量关闭所有网络开关(wifi及数据连接),以名莫名消耗流量,除非测试过程必须要求联网。

(2)开启安全设置下的未知来源。

(3)手机连接电源充电,模拟器不在此讨论范畴。

(4)测试前运行一遍手机上方带有的首次提示的说明,如输入法,文件夹窗口,apk提示语等。


Monkey测试只是能测试过程的一种辅助手段,不能过分依赖于这种简单粗暴的测试手段。它只能辅助我们解决一些额外的问题,但是这并不理解我们的被测系统的业务逻辑,功能,交互方式等等。所以,Monkey测试不应该占用我们过多的时间去研究,而是应该将精力放在更需要人为参与的测试过程中,比如设计高效的测试用命,设计有效的用户场景,进行性能测试,接口测试,用户体验测试,功能测试,自动化测试等这些重要的工作上。

 

 思 考 练 习 


(1)如果针对Windows或Web应用系统,是否可以进行Monkey测试,如何实现?


下周分享:核心实验:Appium的安装与快速测试






为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。

20190320_095757_834.jpg



版权所有,转载本站文章请注明出处:蜗牛学苑, https://www.woniuxy.cn/article/556