章节:自动化基础篇——Monkey原理初步和改良优化(第三讲)
主要讲解内容与笔记:
一、理论知识:
直接看文档,来了解monkey的概念、基本原理,以及如何使用。
First,what is Android Monkey?
The Monkey is a program that runs on your emulator or device and generates pseudo-random streams of user events such as clicks, touches, or gestures, as well as a number of system-level events. You can use the Monkey to stress-test applications that you are developing, in a random yet repeatable manner.
翻译过来:Monkey 是一个可以运行在模拟器或设备上的程序,它可以生成用户时间的伪随机序列,如点击,触屏,或者抓取,也包含一系列的系统级的事件。我们可以使用Monkey对自己开发的应用程序做压力测试,使用随机且可重复的操作。
注:说明一下什么是伪随机事件?
所谓伪随机事件,就是:seed相同,则随机序列不变;并且在一定时间内,所生成的随机事件不重复。
Second,what can Monkey do?
The Monkey is a command-line tool that that you can run on any emulator instance or on a device. It sends a pseudo-random stream of user events into the system, which acts as a stress test on the application software you are developing.
The Monkey includes a number of options, but they break down into four primary categories:
- Basic configuration options, such as setting the number of events to attempt.
- Operational constraints, such as restricting the test to a single package.
- Event types and frequencies.
- Debugging options.
When the Monkey runs, it generates events and sends them to the system. It also watches the system under test and looks for three conditions, which it treats specially:
- If you have constrained the Monkey to run in one or more specific packages, it watches for attempts to navigate to any other packages, and blocks them.
- If your application crashes or receives any sort of unhandled exception, the Monkey will stop and report the error.
- If your application generates an application not responding error, the Monkey will stop and report the error.
Depending on the verbosity level you have selected, you will also see reports on the progress of the Monkey and the events being generated.
翻译过来:
Monkey包含多种选择,但是它们分为以下四种基本部分:
- 基础设置选项,如设置将做事件的数目
- 操作限制,如限制某个单一包的测试
- 事件类型和频率
- 调试选项
当Monkey跑起来之后,就会产生事件,并将它们发送到系统。它也会关注测试下的系统情况,注意一下的三种情况会被特殊对待哦:
- 如果你限制了Monkey只能泡在某一个或更多个特定的包上时,它就会关注打算去跨越到其他包的企图,并阻止它们。
- 如果你的应用程序崩掉了或者接受到了其他种类的不可控异常,Monkey就会停掉,并report这个Error
- 如果你的应用程序生成了一个不发送error的应用,Monkey也会阻止并report这个Error
Third,how to use Monkey?
The basic syntax is:
$ adb shell monkey [options] <event-count>
一般大家比较简单的就这样用:
$ adb shell monkey -p your.package.name -v 500
接下来重点介绍命令行参数的含义:
Category | Option | Description |
---|---|---|
General | --help |
打开帮助,可以即时看到参数信息 |
-v |
每个-v 命令增加结果不同冗余级别。不同的level,从0到2,所能提供的是越来越详尽的内容提示 | |
Events | -s <seed> |
随机生成序列的种子,如果seed 的值一样的话,生成的随机序列就是确定的 |
--throttle <milliseconds> |
插入一个在两个事件之间的固定延时,如果不插入的话,这个事件就会被迅速生成,一般应该生成的是用户能够点击的一个比较正常的延时 |
|
--pct-touch <percent> |
调整touch触屏事件的百分比,触碰事件就是指在屏幕上的一个单独位置的一次点击-抬起的事件 |
|
--pct-motion <percent> |
调整移动事件的百分比,移动事件就是指在屏幕上按下somewhere,经历一系列的伪随机的移动,最后抬起 |
|
--pct-trackball <percent> |
调整轨迹球事件的百分比(这个通过drag是没有办法做到的,因为drag是直来直去的) | |
--pct-nav <percent> |
调整导航事件的百分比(基本导航事件的百分比,如上下左右键) | |
--pct-majornav <percent> |
调整主要导航事件的百分比(如中间键,取消、确定或菜单引发的图形接口的动作) | |
--pct-syskeys <percent> |
调整系统按键事件,如Home、Back、StartCall、Endcall及音量控制键等 | |
--pct-appswitch <percent> |
调整启动Activity的百分比,在随机间隔中,执行一个startActivity()方法调用,作为一种最大化的覆盖安装包的所有的Activity的方法 | |
--pct-anyevent <percent> |
调整其他类型的事件的百分比,比如按键,或者其他不太常用到的一些事件的百分比 | |
Constraints | -p <allowed-package-name> |
这个参数可以指定特定的一个或多个包,每增加一个包,就需要使用一次-p |
-c <main-category> |
可以确定一个或多个特定的类别,Monkey就只允许系统去访问这些特定类别下列出的Activity了。若不指定的话,Monkey将选择以下类别中列出的Activity:Intent.CATEGORY_LAUNCHER or Intent.CATEGORY_MONKEY。 -c的命令与-p相同,指定一个特定的类别就需要一个-c |
|
Debugging | --dbg-no-events |
该选项主要可以用来监控你的应用程序所调用的包之间的转换。该参数被设置后,Monkey就执行初始启动,进入一个test的Activity。为了达到一个最好的效果,应与-v、一个或多个package的限制, 以及一个非零的throttle来保证Monkey可以跑至少30S才行 |
--hprof |
该选项被设置后,将会在Monkey事件序列前后立刻生成report,大小为大约5Mb,存储在data/misc,所以要小心使用 |
|
--ignore-crashes |
通常情况下,Monkey在遇到了应用程序崩溃或是任何其他类型的非可控异常时会停止运行。如果设置此项,Monkey就不会停,会继续跑,继续向系统发送事件,直到这个所有计数全部完成 |
|
--ignore-timeouts |
通常情况下,Monkey在遇到应用程序遭遇任何类型的timeout的error如“应用程序停止响应”的对话框时会听停止运行。如果设置此项,Monkey就会继续向系统发送事件,直到这个计数全部完成 |
|
--ignore-security-exceptions |
通常情况下,Monkey在遇到应用程序遭遇任何形式的权限错误时会停止运行,例如它打算去启动一个activity而它却需要一定的权限。如果设置了该项,Monkey就会继续发送事件给系统,直到计数结束 |
|
--kill-process-after-error |
通常情况下,Monkey因为某个错误停止运行,应用程序就会继续跑。当这项被设定后,当发生这个error的时候,它就会通知系统去stop这个 process。注意,在一个正常(成功的)完成过程中,已经启动的程序不被停止运行,device的状态就是最后事件发生后停留的那个状态 |
|
--monitor-native-crashes |
监控和报告在android系统本地代码发生的crashes。如果--kill-process-after-error被设定,则系统将会终止 |
|
--wait-dbg |
等待连接上调试器 |
二、Monkey架构原理初步
1、Monkey主类
找到void main()——>run(//查看注释,run就是通过把命令行参数后面的值赋值到相应变量,运行在adb shell里面的monkey -p xxx -v xxx等的命令)
run方法中的逻辑:
(1)设置初始化值
(2)生成随机值事件
(3)将Intent.CATEGORY_LAUNCHER和Intent.CATEGORY_MONKEY添加到我们category中,以便完成我们的启动
(4)根据赋值结果进行一堆输出操作,具体可见自己跑monkey的时候的输出
(5)进入main monkey loop
2、MonkeyActivityEvent——负责进入APK的主界面
1 private Intent getEvent() {
2 Intent intent = new Intent(Intent.ACTION_MAIN); //定义一个Intent(意图),标识Activity为一个程序的开始
3 intent.addCategory(Intent.CATEGORY_LAUNCHER); //把应用程序添加到程序列表里
4 intent.setComponent(mApp); //设置部件
5 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //增加标志,四种启动模式之一
6 return intent;
7 }
注:关于四种启动模式:(摘自http://www.cnblogs.com/fanchangfa/archive/2012/08/25/2657012.html)
Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standard" /> Activity的四种启动模式: 1. standard 标准启动模式,每次激活Activity时都会创建Activity,并放入任务栈中 2. singleTop 如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例) 3. singleTask 如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中 4. singleInstance 在一个新栈中创建该Activity实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中
在andorid程序的AndroidManifest.xml中有以下配置信息:
1 <activity
2 android:name="com.example.com.android.hello.FullscreenActivity"
3 android:configChanges="orientation|keyboardHidden|screenSize"
4 android:label="@string/app_name"
5 android:theme="@style/FullscreenTheme" >
6 <intent-filter>
7 <action android:name="android.intent.action.MAIN" />
8
9 <category android:name="android.intent.category.LAUNCHER" />
10 </intent-filter>
11 </activity>
其中就有配置出android的哪个activity是先启动的,注:android.intent.action.MAIN决定应用程序最先启动的Activity; android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里
3、MonkeyEvent类和一系列子类
MonkeyEvent:定义一个超类,定义变量,构造方法MonkeyEvent(int type) , 以及获取Type的方法public int getEventType()
MonkeyKeyEvent、MonkeyMotionEvent等等都是继承自这个超类
三、改良Monkey方案1(只点击你需要点的地方):做java工程,adb push进去
四、优化Monkey方案2(脱离adb口控制):做成android apk形式,让系统级进程直接调用它
网易云课堂:
http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=878100&courseId=712011
金阳光测试 |
新浪微博:金阳光woody |
网站地址 |
1、百度搜:金阳光测试 2、官网:www.goldensunshine.cc |
微信公众号 |