【转发】ios monkey

一、简介        

      MonkeyTest 最早是Android自动化测试的一种手段,其原理非常简单,就是利用程序在一段时间内模拟产生一定数量的随机用户操作事件, 如点击、轻扫、长按、旋转屏幕等, 以及一些系统级别的事件,用毫无规律的指令或操作使用被测系统,观察系统的稳定性和容错性能,看我们的App多长时间会出异常。通常也称随机测试或者稳定性测试。iOS的Monkey测试是基于此的一个github开源项目:https://github.com/jonathanpenn/ui-auto-monkey

二、
Monkey开始之前

    开始之前,以下几个步骤一定要确认是否正确,否则就是莫名的各种不顺啦。

  • 用来跑monkey的机器一定要Enable UI Automation(设置->开发者),如图:

  • 用来跑monkey的版本,必须为Debug证书编译的Debug版本;
  • 定义类似MONKEY_TEST的宏屏蔽你不想让monkey干的操作,比如:拨打电话、跳出App等;(Optional)

三、Monkey实现原理

      我们首先用苹果提供的Instruments—>Automation(安装xcode后就自带了)模板来实现一个屏幕录制的实验;

1、用instruments建立一个Automation模板,如下图:
2、选中你要测试的APP(该APP必须是Debug版本),选中脚本录制,如下图:
3、选择Script,启动录制,这是你在App上的所有操作都会被用JavaScript脚本录制下来,如下图:
      当录制完毕后,在上面Script区域已经记录了一些js代码。这时候,我们点击下面的三角形回放按钮,可以惊奇的看到我们刚才的所有操作都被一模一样的重新演示了一遍。回过神来看看Script区域的代码,其实可以看到我们所有的动作都被js以某种action的方式记录下来,而这些js代码就可以作用于我们测试的机器,来模拟人的一些操作。说到这里我相信要实现上面提到monkey,思路就非常清晰了。

      根据上面可知,instruments是提供我们根据javascript脚本来控制我们的App的。那monkey测试就简单啦,random一些我们想要测试的用户事件,这不就OK了么。当然这个事也不需要我们做了,github上的一个开源项目ui-auto-monkey已经帮我们写好啦(https://github.com/jonathanpenn/ui-auto-monkey)。我们直接导入运行,monkey测试就开始啦,如下图,运行完成后导出结果就可以留下痕迹了,而整个monkey测试流程就这样啦。
      
      当然这个是比较传统的了,顶多算是半自动化。用shell脚本调用instruments的shell命令,上诉整个过程就可以全自动化了。官方的monkey js多有的事件概率和执行方式都是可以定制的,下面是我针对我目前项目配置的js代码:

#import "UIAutoMonkey.js"
UIAutoMonkeyClientWillReleaseTheMonkey = true;

monkey = new UIAutoMonkey();
monkey.config.minutesToRun = 4 * 60; 		// monkey运行4小时
monkey.config.checkTimeEvery = 60; 		// check the time every 60 events.
monkey.config.numberOfEvents = false;		// disable event count model;
monkey.config.delayBetweenEvents = 0.05;        // 每一分钟事件触发次数
//monkey.config.screenshotInterval = 5;         // 每间隔多少秒截屏一次
// 
// 设置事件权重
monkey.config.eventWeights = {
			tap: 100,
			drag: 20,
			flick: 20,
			pinchOpen: 10,
			pinchClose: 10,
			orientation: 1,
			lock: 0,
			shake: 1,
			deactivate: 1,
			clickVolumeUp: 1,
			clickVolumeDown: 1,
		};
//
// 设置重复操作概率
monkey.config.touchProbability = {
			longPress: 0.05,
			multipleTaps: 0.05,
			multipleTouches: 0.05
		};

monkey.RELEASE_THE_MONKEY();
对应自动跑monkey的shell脚本如下:
#!/bin/bash

APP="xxxxxxxx"										# monkey 测试的app
#UDID="fb5995c1c839e0c2fc5942e99dc93076491c3c09"		# monkey 测试设备的UDID

cd "$(dirname "$0")"
mkdir monkey_result
cd monkey_result
for script in `ls ../上面定制的JS文件.js`
do
	instruments -w ${UDID} -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate ${APP} -e UIASCRIPT ${script} > monkeyTest.log

	grep "Pass" monkeyTest.log > /dev/null
	if [ $? -eq 0 ]
	then
	    echo "${script} PASS"
	else
		echo "${script} FAIL"
		../monkey_run
	fi
done
 

      好了将上面官方的UIAutoMonkey.js和上面自己的两个脚本放在同一个文件夹下,运行shell脚本monkey就跑起来了。当然在github上还有很多更NB的工具,不仅全程自动化,还可以生成报表。
1、CrashMonkey: https://github.com/mokemokechicken/CrashMonkey(release安装的monkey版本比较老,crash统计貌似有点问题了);
2、CrashMonkey4IOS:https://github.com/ObornJung/CrashMonkey4IOS(基于CrashMonkey,还有可以直接把crashlog读取出来并符号化,但运行太慢了,实在不能忍受);

      monkey大概就介绍这么多吧,希望我们的app crash越来越少~~

猜你喜欢

转载自myeyeofjava.iteye.com/blog/2287822