Monkey原理初步和改良优化--Android自动化测试学习历程

章节:自动化基础篇——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


微信公众号


时间: 2024-10-13 19:44:13

Monkey原理初步和改良优化--Android自动化测试学习历程的相关文章

【金阳光测试】Android自动化 -- 学习历程:Monkey原理初步和改良优化

章节:自动化基础篇——Monkey原理初步和改良优化(第三讲) 网易云课堂: http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=878100&courseId=712011 主要讲解内容与笔记: 一.理论知识: 直接看文档,来了解monkey的概念.基本原理,以及如何使用. First,what is Android Monkey? The Monkey is a program t

Robotium原理初步--Android自动化测试学习历程

章节:自动化基础篇——Robotium原理初步(第四讲) 主要讲解内容与笔记: 一.基于控件 1.spinner——下拉菜单 2.TabHost——左右滑动选择菜单,类似电话本 3.Gallery——图形 4.Progressbar——进度条 5.DatePicker——日期与时间选择控件 6.CheckBox——单选框:RadioButton——互斥单选框:Button——一般按钮 7.ToggleButton——双状态按钮控件:选择和未选择两种状态,并且针对不同状态显示不同文本8.EditT

Selenium原理初步--Android自动化测试学习历程

章节:自动化基础篇——Selenium原理初步(第五讲) 注:其实所有的东西都是应该先去用,但是工具基本都一样,底层都是用的最基础的内容实现的,测试应该做的是: (1)熟练使用工具,了解各个工具的利弊,达到工具优选.因时因地制宜的目的 (2)读源码,理解原理,能够对开源的源码进行二次再创造,改编成适合自身产品的工具:或者自己直接编写适合测试的工具 (3)能够对测试过程中发生的异常进行分析和定位,对测试结果进行详细和系统的综合评定(需要能够分析定位问题,必须对自身产品了解,但更需要的是对底层代码和

AndroidDriver原理初步--Android自动化测试学习历程

主要讲解内容及笔记: 一.AndroidDriver核心原理 对上图的解析: PC端的端口通过adb,将android版的Remote Server的apk push到手机上,然后跟手机端的Remote Server进行通信,手机端的Remote Server与浏览器进行通信,通过WebDriver注入js脚本到浏览器,完成想要完成的功能 基于控件的所有的自动化框架都调用了Instrumentation,或者封装了它,比如之前的Robotium等 二.AndroidDriver源码分析 1.io

截图原理(一)——Android自动化测试学习历程

把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的. 第二节讲的是脱离apk,直接在PC端截图,通过的是adb桥接的方式,调用ddmlib.jar包中的AndroidDebugBridge和IDevice的类,对其进行截屏,并保存到我想要的位置,是可以写成一个小工具的. 视频地址:http://study.163.com/course/course

截图原理(二)——android自动化测试学习历程

接上一篇(截图原理) 视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877121&courseId=712011 四.非APK的操作,通过PC端实现截屏操作,及原理 通过adb桥接的方式,调用ddmlib.jar中的IDevice和AndroidDebugBridge类对通过adb连接的设备进行截图,截图之后保存在PC端,可在短时间内截取多张图 五.adb桥接方式实现截

Instrumentation类——Android自动化测试学习历程

这里需要把Instrumentation类的视频的上.中.下三集一起看,把内容总结一下... 视频地址: http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=881433&courseId=712011 http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=878104&

跨进程(同一app不同进程之间通信)——Android自动化测试学习历程

视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877122&courseId=712011 一.问题: 1.如何做到一个app不同进程通信? 2.多个app通信(不同app) 3.注入事件运行脚本和调用隐藏api 二.一个app不同进程通信: 知识点: 1.Intent.binder 2.Service.Activity 3.Handler.view 4.Messeng

Android-Junit-Report测试报告生成——Android自动化测试学习历程

视频地址: http://www.chuanke.com/v1983382-135467-384869.html 这个内容其实已经在用了,我在上一篇文章robotium—只有apk文件的测试中已经讲过这个内容了,并且自己也用Python+wxpython写了界面程序,来实现跑case+获取xml运行结果+xml转html+发送邮件的功能 主要内容: 一.测试需求 1.统计每个case的执行时间 2.哪些case成功.失败 3.失败的case给出log 4.产生网页html报告结果 二.环境部署