主要內容
穩定性測試是什么
Monkey 介紹
自動化 Monkey
穩定性測試是什么
通過隨機點擊屏幕一段時間,看看 app 會不會奔潰,能不能維持正常運行。
Monkey 介紹
Monkey 是一個命令行工具,它可以運行在我們的模擬器或者設備當中。它可以發送一些偽隨機(pseudo-random)的用戶事件流,例如點擊,觸摸,手勢等。我們能夠使用 Monkey 工具來對我們所開發的應用進行壓力測試。Monkey 測試是一種為了測試軟件的穩定性,健壯性的快速有效的方法。
Monkey 常用命令
基本語法如下:
adb shell monkey [options]
如果什么參數都不給,monkey 將以無反饋模式進行啟動,并把事件任意發送到安裝在目標環境下中的全部包。
下面是一個更為典型的命令行示例,它啟動指定的應用程序,并向其發送 500 個偽隨機事件:
adb shell monkey -p your.package.name -v 500
根據 Monkey 官網的介紹:https://developer.android.com/studio/test/monkey 可以添加對應的執行參數。
Monkey 的參數都是根據具體需求設定的,主要分為常規類,事件類,約束類和調試類。下面就對這些命令進行說明:
類別
參數
說明
常規類
--help
顯示 moneky 參數幫助信息 usage
-v
打印日志信息,每個-v 將增加反饋信息的級別。-v 越多日志信息就會越詳細,不過目前最多支持三個-v。Level0:一個-v,除啟動提示、測試完成和最終結果之外,提供較少信息。Level1:兩個-v,提供較為詳細的測試信息,如逐個發送到 Activity 的事件。Level2:三個-v,提供更加詳細的設置信息,如測試中被選中的或未被選中的 Activity。
事件類
-s
偽隨機數生成器的 seed 值。如果用相同的 seed 值再次運行 Monkey,它將生成相同的事件序列。
--throttle
后面接時間,單位為毫秒,表示事件之間的固定延時(即執行每一個指令的間隔時間),若不接這個選項,monkey 則不會延時
--pct-touch
后面接觸摸事件的百分比。(觸摸事件是一個 down-up 事件,它發生在屏幕上的某單一位置)
--pct-motion
后面接動作事件的百分比。(動作事件由屏幕上某處的一個 down 事件、一系列的偽隨機事件和一個 up 事件組成)。
--pct-trackball
后面接軌跡事件的百分比 (軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)。
--pct-nav
后面接 “基本” 導航事件百分比 (導航事件主要來自方向輸入設備的上,下,左,右事件)
--pct-majornav
后面接 “主要” 導航事件的百分比 (這些導航事件通常引發圖形界面中的動作,如:5-way 鍵盤的中間按鍵、回退按鍵、菜單按鍵)
--pct-syskeys
后面接 “系統” 按鍵事件的百分比 (這些按鍵通常被保留,由系統使用,如 Home、Back、StartCall、End Call 及音量控制鍵)。
--pct-appswitch
后面接啟動 Activity 的百分比。在隨機間隔里,Monkey 將執行一個 startActivity() 調用,作為最大程度覆蓋包中全部 Activity 的一種方法。
--pct-anyevent
調整其它類型事件的百分比。它包羅了所有其它類型的事件,如:按鍵、其它不常用的設備按鈕、等等。
約束類
-p
如果用此參數指定了一個或幾個包,Monkey 將只允許系統啟動這些包里的 Activity。如果你的應用程序還需要訪問其它包里的 Activity(如選擇取一個聯系人),那些包也需要在此同時指定。如果不指定任何包,Monkey 將允許系統啟動全部包里的 Activity。要指定多個包,需要使用多個-p 選項,每個-p 選項只能用于一個包。
-c
如果用此參數指定了一個或幾個類別,Monkey 將只允許系統啟動被這些類別中的某個類別列出的 Activity。如果不指定任何類別,Monkey 將選擇下列類別中列出的 Activity:Intent.CATEGORY_LAUNCHER 或 Intent.CATEGORY_MONKEY。要指定多個類別,需要使用多個-c 選項,每個-c 選項只能用于一個類別。
調試類
--dbg-no-events
設置此選項,Monkey 將執行初始啟動,進入到一個測試 Activity,然后不會再進一步生成事件。為了得到最佳結果,把它與-v、一個或幾個包約束、以及一個保持 Monkey 運行 30 秒或更長時間的非零值聯合起來,從而提供一個環境,可以監視應用程序所調用的包之間的轉換。
--hprof
設置此選項,將在 Monkey 事件序列之前和之后立即生成 profiling 報告。這將會在 data/misc 中生成大文件 (~5Mb),所以要小心使用它。
--ignore-crashes
通常,當應用程序崩潰或發生任何失控異常時,Monkey 將停止運行。如果設置此選項,Monkey 將繼續向系統發送事件,直到計數完成。
--ignore-timeouts
通常,當應用程序發生任何超時錯誤 (如 “ApplicationNot Responding” 對話框) 時,Monkey 將停止運行。如果設置此選項,Monkey 將繼續向系統發送事件,直到計數完成。
一條常用的 Monkey 命令
adb shell monkey -v -v -v -p [PackageName] --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --ignore-native-crashes --throttle 1000 100000 > monkey.txt
Monkey 的特點
綜合上面的描述,使用 Monkey 如下特點:
1.Monky 測試使用的事件流數據流是隨機的,不能進行自定義。
2.可對 MonkeyTest 的對象,事件數量,類型,頻率等進行設置。
通過自然語言開發 Monkey 自動化腳本
因為命令行運行每次需要修改不同的參數,這樣操作不是很靈活,我們可以寫段代碼來驅動。為了讓腳本的可讀性更高,我們使用 BDD 的方式來做。BDD 的好處就是可以在自然語言描述中修改參數就能直接運行程序,并可以數據驅動。對于團隊協作,或者新人了解業務特別方便。下面借助工具來實現這些操作:
因為腳本用 JavaScript,開發工具可以使用CukeTest(http://cuketest.com)
執行引擎可以借助 adbkit 來實現。步驟如下:
環境搭建
配置 sdk(請自行網上查閱資料本機安裝 sdk)
安裝 node.js 庫 adbkit(https://github.com/openstf/adbkit)
創建項目
打開 CukeTest,文件新建 - 新建項目;項目類型選擇基本項目,填寫項目信息,完成創建即可。
在項目的根目錄下執行npm install adbkit --save 完成 abdkit 庫的安裝。
關于 abdkit 可以參考 GitHub https://github.com/openstf/adbkit
設置超時時間
由于需要持續長時間按去運行 monkey 腳本檢測應用的穩定性,所以設置超時時間長一些
編輯 support/env.js
const { setDefaultTimeout } = require('cucumber')
setDefaultTimeout(1000 * 1000)
編輯 feaure 文件
# language: zh-CN
功能: monkey 穩定性測試
調用monkey腳本 檢測手機app原生計算器穩定性
場景: 設計并調用monkey腳本
假如app的package為"com.android.calculator2"
同時設置運行隨機數值為10000
當我希望基本導航事件中占用比例為"10"
同時觸摸事件在所有事件中所占的比例為"70"
同時每個操作步驟之間的間隔為1000毫秒
并且忽略程序崩潰或者發生異常
那么手機序列號為"192.168.181.101:5555"運行1000次腳本
如果你想修改 monkey 腳本的參數,直接修改 feature 文件中的參數即可。
編寫自動化腳本
const { Given, When, Then } = require('cucumber');
var adb = require('adbkit');
var client = adb.createClient();
Your step definitions /
var command = 'monkey'
Given(/^app的package為"([^"]*)"$/, async function (packagename) {
command = command + "-p" + packagename
});
Given(/^設置運行隨機數值為(\d+)$/, async function (seed) {
command += "-s" + seed
});
When(/^我希望基本導航事件中占用比例為"([^"]*)"$/, async function (nav) {
command += '--pct-touch' + nav});
When(/^觸摸事件在所有事件中所占的比例為"([^"]*)"$/, async function (touch) {
command += "--pct-touch" + touch
});
When(/^忽略程序崩潰或者發生異常$/, async function () {
command += "--ignore-crashes"
});
When(/^每個操作步驟之間的間隔為(\d+)毫秒$/, async function (ms) {
command += "--throttle" + ms
});
Then(/^手機序列號為"([^"]*)"運行(\d+)次腳本$/, async function (deviceid, num) {
command += "" + num;
return client.shell(deviceid, command)
// Use the readAll() utility to read all the content without
// having to deal with the events. `output` will be a Buffer
// containing all the output.
.then(adb.util.readAll)
.then(function (output) {
console.log('[%s] %s', device.id, JSON.stringify(output.toString().trim()))
})
});
運行腳本
點擊運行 feature 文件,即可看到 monkey 自動去操作模擬器的計算器
如果要對多個應用做不同的 Monkey 測試,只需要在 CukeTest 中將這個場景一鍵轉換成場景大綱,再添加多行數據就行了。真正實現了通過數據驅動做 Monkey 測試。
歡迎大家一起交流學習。