使用Monkey做一次APP的压力测试

1.手工测试场景(聊天为例)
假如说你需要找热火的辣妹聊天
1.查找–>添加–>聊天
模拟事件流
针对手机收到的信息,模拟事件流
查找:touchinput—keyevent-
添加:touchsearch-touchname-
聊天:touchfriend-keyevent

2.自动测试场
手机会收到你点击输入框的Touchinput事件,
点击键盘上的keyEvent的事件(查询的关键词)
收到你点击查找按钮的touchsearch,然后返回一个列表
找到好友之后添加,添加的时候手机收到touchname事件
然后进行聊天也是手机收到touchfriend事件,
收到各种输入的文字和语音keyevent
其实就是收到各种事件的组合,如果我们能实现的话
就实现了各种测试的需求

3.Monkey工具
Monkey:最大的缺点是没有调试功能,不会报具体的错

Monkey:自动化测试的过程需要随机事件的输入
为了完成各种随机事件的输入,需要借助一个工具
1.什么是Monkey?
Monkey:发送伪随机事件的工具
2.Monkey在哪?
在手机系统里,但是看不见的
如果想让Monkey可视化需要使用ADB
让ADB与手机里面的Monkey进行通信

 1.首先准备一个手机,一台电脑用usb线创建一个硬连接
 2.然后用Android Debug Bridge(安卓调试桥)
 3.创建一个软连接

 通过ADB命令可以对手机上的Monkey进行通话

4.ADB命令
1.什么是ADB?
负责ps和手机系统的连接建立,
调试手机上任何应用的入口

5.Monkey Script完成重复性操作
Monkey是完成随机事件,但是有时候我们需要完成
的过程是固定的,这个时候Monkey本身就已经无法满足需求了
这是我们就需要把我们的需求写成一个脚本,
这个脚本就叫做MonkeyScript

1.什么是MonkeyScript?
MonkeyScript是一组可以被Monkey识别的命令集合
MonkeyScript可以完成重复固定的操作

但是呢有时候我们需要完成一些额外的操作,
比如所在执行MonkeyScript过程中需要截屏,
这个时候就需要另一种工具MonkeyRunner
6.MonkeyRunner(3大API,截屏)
1.什么是MonkeyRunner?
MonkeyRunner提供了一系列的API,
通过这些API可以完成模拟事件及截图操作
2.Monkey和MonkeyRunner的区别
Monkey:在adb shell中,生成用户或系统的伪随机事件
MonkeyRunner:通过API定义特定命令和事件控制设备
使用MonkeyRunner的API可以直接实现一些操作
MonkeyRunner把Monkey里面的一些命令进行封装
实现了一些DPI函数
3.MonkeyRunner的3大API
MonkeyRunner:用来连接设备或模拟器
MonkeyDevice:提供安装、卸载应用,发送模拟事件
MonkeyImage:完成图像保存,及对比的操作
4.MonkeyRunner的测试类型?
1.多设备的控制
2.功能测试
3.回归测试
7.压力测试结果分析
MonkeyScript和MonkeyRunner进行压力测试之后会有一系列的测试结果,对于正常的测试结果我们可以不
用进行过多的分析,但是对于一些异常的结果我们要进行深入的关注,一般关注两个方面
1.什么事CRASH?
CRASH:即崩溃,应用程序在使用过程中,非正常退出
会影响APP无法正常使用,或影响用户后期的一系列使用

2.什么事ANR?(Application Not Responding)
主线程中做了耗时操作,或响应时间过长

3.实践
1.准备测试环境
2.准备Android SDK环境
3.准备Python环境
安装环境视频+压测实践:https://www.imooc.com/video/13013

	ANDROID_HOME="android-sdk的路径"
	path="android-sdk的路径/platform-tools":$path
	path="android-sdk的路径/tools":$path
	path="andriod-sdk前的路径/gradle2.8/bin":$path:$android_home:${ant_home}/bin

压测实线

1.一个App的压测实践
压测过程
1.在手机开发者选项中,将USB调试选上

  2.确认手机和电脑已经成功连接
	这里的连接建立通过adb devices进行确认

  3.安装测试App,用命令行adb install package.apk

  4.发送压力指令
	adb shell monkey 1000
	1000代表monkey帮助我们实现1000个指令
	但是指令是monkey随机操作的

  5.获取App包名,adb logcat | grep START,
	包名是在手机里的,我们不知道,所以要获取
	adb:工具
	logcat:输出手机中的所有的app执行过程中的log信息
	“|”:在Linux环境下代表管道,
	把前一个命令的输出变成下一个命令的输入
	这里就把logcat获取的信息变成下一个命令的输入
	grep START:抓取日志中包含有START标签的log信息进行输出

  6.给指定包打压力
	adb shell monkey -p package 1000
				
	指定包就是在monkey后加的东西
	package:具体的包名
	1000:具体要完成的事件数

2.Monkey高级参数的应用

1.throttle参数

    Monkey执行的速度是非常快的,
	如果想延时的话可以加throttle参数
    throttle参数设置每次执行的时间间隔
	adb shell monkey -p 包名(com.horsegj.company) --throttle 1000 100
	一共执行100次,每次间隔1秒(1000毫秒)
	adb logcat | grep START
	adb shell monkey -p <packageName> <次数>
	adb shell monkey -p <packageName> --throttle <间隔(毫秒)>  <次数>
	throttle:指定事件之间的间隔
	adb shell monkey --throttle<milliseconds>
			
2.seed参数

    seed参数,monkey随机参数上一步的操作
	【adb shell monkey -s<seed><event-count>】
	对于测试结果不正常时进行复线
			
	要进行压力测试时,那么首先自己先定义一个seed值,然后让他去跑,
	等之后发现APP出现excpetion时,
	则只需要重新加上seed值就可以复现
			
	seed参数指定随机生成数的seed值
	adb shell monkey -s <seed> <event-count>
	确保每次的随机执行结果一样,确保执行随机执行路径一致
			
	指定随机生成数的seed值之后就可以获得到一个指定的
	随机序列
	monkey的随机操作是基于seed值产生的,
	每一个seed值都可以产生一个随机序列,
	只要两次的操作的seed值是一样的,
	那么两次的操作序列也是一样的
			
	adb shell monkey -s <seed> <event-count>
			
	adb shell monkey -s 100 50
	seed是100,执行50个事件
			
3.触摸事件
		
	设定触摸事件百分比
	adb shell monkey -p packagename --pct-touch <percent>
	adb shell monkey -v -p packagename  --pct-touch <percent>

	触摸事件,设定点击事件的出现比例
	【adb shell monkey - -pct-touch<percent>】
	在编译过程中加一个-v参数可以在编译时列出当前编译过程中执行的事件
			
	设定触摸事件百分比
	adb shell monkey -p packagename --pct-touch <percent>
			
	pct-touch 触摸事件,设定产生随机事件序列中点击事件所占的比例
	adb shell monkey -p packagename --pct-touch <percent>
	加-v参数可以列出当前执行过程中执行的事件
	adb shell monkey -v -p packagename  --pct-touch <percent>

	需求:只需要monkey帮助实现点击事件
	    <percent>:点击事件占monkey事件的百分之几
		adb shell monkey -v -p packagename  --pct-touch <percent>
		adb shell monkey -v -p packagename  --pct-touch 100 100
		完成100%的100个事件
		但是看不到,这时加个-v
		adb shell monkey -v -p packagename  --pct-touch <percent>
		-v参数就会把他完成的详情列出来
		
4.动作事件(类似于触摸事件)

	设定动作事件的百分比
	adb shell monkey - -pct-trackball <percent>
			
	就是我们用手指在屏幕上点击一下完成的一系列操作,
	然后在松起的过程		
	这个事件的百分比要和其他事件百分比之和等于一百,
	如果不等于一百,就会把剩余事件的比例进行随机操作
			
5.轨迹球事件

	设定轨迹球事件百分比
	adb shell monkey - -pct-trackball <percent>
		
6.基本导航事件

	设定基本导航事件百分比,输入设备的上、下、左、右
	adb shell monkey - -pct-nav <percent>
			
7.主要导航事件

	设定主要导航事件百分比,兼容中间键、返回键、菜单按键
	就是说是软键盘上的导航键
	adb shell monkey --pct-majornav <percent>
			
8.系统导航事件

	设定系统导航事件百分比,HOME、BACK、拨号及音量键
	跟手机硬件相关的键
	adb shell monkey --pct-syskeys <percent>
			
9.启动Activity事件

	设置启动Activity的事件百分比
	adb shell monkey --pct-appswitch <percent>
	一个App中Activity有很多,如果我们指定了它的百分比的话
	那么他就会在已有的Activity之间切换
	例:有四个Activity,如果我们设置为30%的话
		那么在30%事件中他会在四个Activity之间进行切换
				
10.不常用事件

	设定不常用事件的百分比
	adb shell monkey --pct-anyevent <percent>
			
	就是跟以上事件划不到一起去的事件
			
11.崩溃事件

	忽略崩溃和异常
	adb shell monkey - -ignore-crashes <event-count>
			
	在Monkey发现崩溃异常之后继续跑,
	继续进行压力测试,知道完成指定的事件数
			
12.超时事件

	忽略超时事件
	adb shell monkey - -ignore-timeouts <event-count>

3.CRASH结果析取

包名后面加上 - -ignore-crashes 1000,跳过crashes去继续执行
		
实践过程:
	1.安装一个可以引起CRASH的App
		APP安装命令:
		adb install app-debug_crash.apk
			
		获取指定具体测试App的包名
		adb logcat | grep START
				
		然后在手机或模拟器上点击
				
				
	2.执行App的压力命令执行CRASH
	3.析取CRASH的Exception信息

4.ANR结果析取

实践过程:
	1、安装可以引起ANR的App
	  【名为微浏览器的App、$adb install app-debug_anr.apk】
	2、执行压力命令 
	  【$adb shell进入手机;cd /data/anr/进入anr;/data/anr/ # ls查看anr的文件traces.txt;# more traces.txt进入查看详细信息】
	3、析取ANR的Exception信息,整理成测试文档提交
			
	 没有使用monkey的情况下app出现anr情况,
	 可以在手机中找到log文件
			
	 ANR的日志文件查看方法:cd /data/anr/ 先进入到anr的目录,
	 然后ls看下anr目录下有什么文件,当看到一个traces.txt文件,
	 即代表有文件记录anr的情况,用命令more来查看该文件内容,
	 即可知道ANR的信息情况
			
	 adb shell monkey 高级参数
	 adb logcat |  grep start

5.Monkey Script实例

	《Scriptfile》是编写的脚本文件。<event-count>是脚本执行的次数。
	
		执行monkey脚本的命令
		【adb shell monkey -f<scriptfile><event-count>】
			scriptfile:执行的脚本文件
			event-count:脚本执行的次数
			
			1、DispatchTrackball命令
			
				1、轨迹球事件。
					轨迹球事件完成点击操作,
																
					long downtime键是按下的时间。
					long eventide是事件发生的时间。
					
					主要注意:
						int action 具体的操作动作是“0按下”或是“1弹起”。								
						float x,float y是 触摸的x和y的坐标点。
						
						参数中的int action 0代表按下,
						1代表弹起,x和y代表坐标点
						使用工具获取点击的坐标点
						
					float pressure是压力事件、大小,范围0-1。
					float size是触摸值,范围0-1。
					int metastate是当前按下键的标识
					float xprecision:y坐标的精确值
					float yprecision:y坐标的精确值
					int device:事件的来源,范围0~x
						0表示不来自物理设备
					int edgeflags:超出了屏幕的范围
					
					其他参数只要在使用的时候设置初始默认值就可以了									
				
			2、DispatchPointer命令
				点击事件 
				
			3、DispatchString命令
				输入字符串事件命令
				
				DispatchString(String text)
			
			4.LaunchActivity命令
				因为我们要往App的输入框输入查询词,
				那么输入之前必须保证App是被掉期的
				
				LaunchActivity(package(传入的包名),Activity(被启动页面的名称))
				
			5.UserWait命令
				等待事件
				实现点击过程中需要等待一些元素的出现,
				就需要它实现等待的过程
				
				UserWait(1000)单位是毫秒,默认1000
				
			6.DispatchPress命令
				按下键值
				DispatchPress(int keycode)#keycode 66 回车键
				弹出输入法在输入查询词之后,
				点击回车输入的词展示在输入框中
			7.MonkeyScript实践
				https://www.imooc.com/video/13027
				4-10 MonkeyScript实践
				在实践的过程中无法实现截屏操作

6.MonkeyRunner

		Monkey Runner 与monkeyscript差别是 
		runner 在测试过程中可以实现截屏操作
		
		1.MonkeyRunner API - alert
			警告框
			
			脚本和用户之间进行沟通与协作的,与设备无关
			alert接口的用法:
				void alert(string message,string title,string okTitle)
				message:弹框提示内容  
				title:弹框标题  
				okTitle:按钮文字
				
			用Python编辑器写好python脚本,再在命令行下,
			使用monkeyrunner运行py脚本
			
		2.MonkeyRunner API - waitForConnection
			
			MonkeyRunner一个强大的功能
			截屏(takeSnapshot)
			MonkeyImage takeSnapshot()
			
			等待设备连接,有多个device id,需要指明具体哪个设备
			waitForConnection(float timeout,string deviceid)
			timeout:超时时间,单位是秒
			deviceid:字符串名称
			
		3.MonkeyRunner API - drag
			
			拖动
				在操作页面进行拖动
			drag(tuple start,tuple end,float duration,integer strps)
			
			start:拖动起始点
			end:拖动目标点
			duration:拖动过程中的耗时时间,(手势持续的时间)
			strps:拖动过程中(插值点的步数),拖几步进行实现,默认10步
			
		4.MonkeyDevice API - press
			按键
			press(String keycode,dictionary type)
			
			keycode 名:例如回车键 
				可以实现点击过程
			type:Down、 UO、DOWN_AND_UP
			
		5.MonkeyDevice API - startActivity
			启动应用
			startActivity(package+‘/’+activity)
			
			注意:他的中间是一个参数
			
		6.MonkeyDevice API - touch
			点击操作
			touch(integer x,integer y,integer type)
			x,y:x和y的坐标值
			type:Down、 UO、DOWN_AND_UP
			
		7.MonkeyDevice API - type
			输入
			type(string message)
			
		8.MonkeyDevice API - takeSnapshot
			截屏(takeSnapshot)
			MonkeyImage takeSnapshot()
			
			直接调取,会返回一个MonkeyDevice类型的数据
			返回之后MonkeyImage就可以进行存储了
			
		9.MonkeyImage API - sameAs
			图像对比
				两个图像之间的对比
			boolean sameAss(MonkeyImage other,float percent)
			other:对比的图片的名称
			percent:对比的像素度的百分比
			
		10.MonkeyImage API - writetoFile
			保存图像文件
			void writeToFile(string path,string format)
			path:指定MonkeyImage的存储路径
			format:指定图像的类型,png,jpg等

7.MonkeyRunner补充说明

		功能化存储过程
		MonkeyRunner不能自动多次执行,
		需借助python多线程或Java进行循环,
		MonkeyScript可以多次执行

http://t.cn/A64mgrAb

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页