24
08

Monkey高级应用

一个Android应用程序的开发过程中,也是按照包名+类名来组织源代码的,运行过程也是完全依赖于包名+类名,所以我们可以通过包名实现应用程序锁定。这一点与我们在前一章节中用Python开发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”,整个过程如下图所示。

 

20190928_115957_907.png


从上图我们可以得知,“一笔记账”应用程序的主包名为“com.mobivans.onestrokecharge”,然后我们就可以通过指定这个包名来限制Moneky测试只能够针对当前的“一笔记账”进行测试而不会影响到其它操作系统里面的应用程序了。


另外,通过aapt命令我们还可以获取到应用程序的主类名(即可执行的Activity名),在aapt的上述输出中,仔细寻找“launchable-activity”,对应的值即是可执行的Activity,后续的测试我们将会使用到该值。读者朋友可以通过如下命令进行简单测试:

adb shell monkey -p com.mobivans.onestrokecharge 5000



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


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

20190928_120018_187.png


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


20190928_120035_832.png


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

20190928_120052_163.png


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


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


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

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

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

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


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

 

20190928_120116_106.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结果分析


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


20190320_095757_834.jpg








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