【轉發】ios monkey

大搜車-自娛發表於2016-03-31

一、簡介        

      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越來越少~~

相關文章