Monkey基礎知識與測試場景

【APP測試前瞻】 

當前移動互聯網已經過了草創時期,各家公司都在搶佔市場和用戶;那麼,就看哪一家做的更精緻(交互做的更好,崩潰出現的更少)。APP測試涉及各個方面,而穩定性和性能測試一般在功能測試完成後開展。如何應用自動化測試場景,如圖1所示:

這裏寫圖片描述
圖1 自動化測試應用場景

Android用戶也許會經常碰到以下的問題: 
1.穩定性問題 —— ANR /Crash等問題;ANR(Application Not Responding)是指當Android系統監測到應用程序在5秒內沒有響應輸入的事件或廣播在10秒內沒有執行完畢時拋出無響應提示。Crash是指當應用程序出現錯誤時導致程序異常停止或退出的情況。 
2.性能問題 —— 應用啓動慢(首次/非首次啓動應用,進入應用特別慢),CPU不足/內存泄露(應用使用過程中,越來越卡),應用耗電快(應用後臺開着,手機很快沒電)等問題。

注:卡頓與ANR的問題。卡頓簡單的來說,就是手機沒有及時響應、頁面延遲,出現丟幀的現象,或者點擊無響應。絕大多數的卡頓,稍等片刻系統就會恢復正常,但假如超過5S,就可能會引發手機ANR警告。

自動化框架的選擇 
1.autoMonkey框架:Android平臺一般都會考慮使用系統自帶的Monkey工具進行測試,此工具既易上手也實用,但運用起來有非常多的講究和技巧,簡單的Monkey工具不一定能完成使命,在測試中也需要花費心思去對Monkey進行封裝改造(還可以修改原生的Monkey),以滿足測試需求。 
2.MBT(Model based testing):基於模型的測試。建模過程,通常是指對被測系統的某些方面的描述,以及對被測系統預期行爲的抽象描述。FSM(有限狀態機)用途最廣泛,一般用於黑盒測試的建模。MBT與Monkey測試理論的結合,即放一隻“猴子”在FSM模型中隨機漫遊,開展充分的穩定性測試。

本文是針對APP完成首輪功能測試後,使用autoMonkey框架進行穩定性和性能測試,從而提高產品的穩定性和留存率。知識結構分爲四個部分,如圖2所示:

這裏寫圖片描述 
圖2 autoMonkey框架原理與應用

一、Monkey基礎知識與測試場景 
在Android的官方自動化測試領域有一隻非常著名的“猴子”叫Monkey,這隻“猴子”一旦啓動,就會讓被測的Android應用程序像猴子一樣到處亂跑。我們常用這隻“猴子”對被測程序進行壓力測試,檢查和評估被測程序的穩定性。 
Android官方對這隻“猴子”的描述:Monkey是Google提供的一個命令行工具,可運行在模擬器或實際設備中。它可以在規定的次數範圍內做任何隨機的操作,隨機操作包括點擊、滑動、Application切換、橫豎屏、應用關閉等等,用戶能做的操作都可以模擬,從而對正在運行的應用程序進行壓力測試,目的是看設備多長時間會出現異常,並觀察系統的穩定性和容錯性能。 
**Monkey測試出crash的bug等級永遠爲1,版本發佈前,Monkey跑出的結果中crash要爲0。 
業內標準:最終發佈版本前,Monkey跑完的總次數不少於25W次,其結果裏不允許有nullPointException出現。** 
Monkey程序是Android系統自帶的,其啓動腳本是位於Android系統的/system/bin目錄的Monkey文件,其jar包是位於Android系統的/system/framework目錄的Monkey. jar文件。用戶主要是通過adb 命令來啓動Monkey。Monkey在運行時,會根據命令行參數的配置,生成僞隨機的事件流,並在Android設備上執行對應的測試事件。 
按照選定的不同級別的反饋信息,在Monkey中還可以看到其執行過程報告和生成的事件。

Monkey的弊端

無法準確地得知bug的復現步驟 
發送的用戶事件流的有效性成問題,很多是無效操作

1.常規的穩定性測試 
測試目的: 
希望通過Monkey測試來模擬用戶長時間的隨機操作,檢查被測APP是否會出現異常(應用崩潰或者無響應)。 
測試腳本: 
adb shell monkey -p $package_name –hprof –pct-touch 40 –pct-motion 25 –pct-appswitch 10 –pct-rotation 10 –pct-majornav 10 -s 10000 –throttle 500 –ignore-crashes –ignore-timeouts -v -v -v 500000 
這個Monkey測試的命令比較複雜,主要是對一些操作事件做了限制,從而減少Monkey僞隨機流的無效操作。這體現在以下幾個方面。 
1)使用-p參數來制定測試APP的包名(Package) 
因爲被測APP是一個特定的Android應用程序,需要指定被測APP的包名。指定包名後,Monkey會根據包名找到對應的APP,並啓動其main activity,然後執行Monkey測試。 
技巧: 
查找應用包名的方法有很多,這裏簡單列舉幾個常用方法:

(1)通過pm命令查看。 
在命令行窗口輸入: 
>adb shell pm list $package -3 
列出手機上所有第三方的APP包名,在列表中找到要測試的APP包名; 
(2)通過查看APK源碼下的AndroidManifest.xml文件; 
(3)通過aapt dump badging $package.apk命令查看; 
(4)通過adb logcat抓取當前Android機運行的App的包名; 
(5)使用adb shell dumpsys window | findstr mCurrentFocus命令查看當前運行的包名。

2)使用–pct-xxx參數限制Monkey執行的事件類型和佔比 
測試的目的是希望模擬用戶操作,因此需要讓Monkey執行的事件儘可能地接近用戶的常規操作,這樣纔可以最大限度地發現用戶使用過程中可能出現的問題。因此需要對Monkey執行的事件百分比做一些調整。

觸摸事件和手勢事件是用戶最常見的操作,所以通過–pct-touch和–pct-motion將這兩個事件的佔比調整到40%與25%; 
目標應用包含了多個Activity,爲了能覆蓋大部分的Activity,所以通過–pct-appswitch將Activity切換的事件佔比調整到10%; 
被測應用之前在測試中出現過不少橫豎屏之間切換的問題,這個場景也必須關注,因此通過–pct-rotation把橫豎屏切換事件調整到10%; 
通過–pct-majornav,調整“主要”導航事件的百分比調整到10%(這些導航事件通常引發圖形界面中的動作,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)。

3)使用-s參數來指定命令執行的seed值 
Monkey會根據seed值來生成對應事件流,同一個seed生成的事件流是完全相同的。指定seed值,是爲了測試發現問題時,便於進行問題復現。 
4)使用–throttle參數來控制Monkey每個操作之間的時間間隔 
指定操作之間的時間間隔,一方面是希望能更接近用戶的操作場景,正常用戶操作都會有一定的時間間隔;另一方面也是不希望因爲過於頻繁的操作而導致系統崩潰,尤其是在比較低端的手機上執行測試時。因此通過–throttle設置Monkey每個操作固定延遲0.5秒。 
5)使用–ignore-crash和–ignore-timeouts參數使Monkey遇到意外時能繼續執行 
在執行Monkey測試時,會因爲應用的崩潰或沒有響應而意外終止,所以需要在命令中增加限制參數–ignore-crash和–ignore-timeouts,讓Monkey在遇到崩潰或沒有響應的時候,能在日誌中記錄相關信息,並繼續執行後續的測試。是否使用這兩個參數在後續Monkey測試策略詳細介紹。 
6)使用-v指定log的詳細級別 
Monkey的日誌輸出有3個級別:默認的是level 0, -v -v日誌級別爲level 1, -v -v -v日誌級別爲level 2。日誌的級別越高,越詳細。爲了方便問題的定位,將日誌級別設置爲level2。 
7)使用–hprof在出現內存問題時,存儲一份內存“快照”

另,在常規的穩定性測試中,雖然可以自定義各種事件的操作佔比,但畢竟是隨機事件流。在實際測試過程中,難免會遇到Monkey點了我們不希望它點擊的地方,比如誤點了工具欄導致網絡斷開的情況等。當WiFi斷開時,使用APP“Auto WiFi Toggle”每隔5分鐘檢測網絡狀態並自動連接。

2.結合輔助命令,獲取更多信息(性能測試) 
常規測試只要記錄下Monkey日誌,再分析Monkey日誌檢查是否有異常即可。但是,很多時候,測試除了想知道執行過程是否有異常,還需要能獲取執行過程中的一些詳細信息或性能數據,比如想知道在Monkey執行過程中是否存在內存泄漏或內存溢出,需要獲取內存信息。此時,我們需要藉助一些輔助的命令來獲取更多信息。下面列舉Monkey測試中常用的輔助命令,使用方法也非常簡單,只要在執行Monkey的同時,另起一個CMD命令行窗口輸入對應命令執行即可。 
1)記錄logcat日誌信息: 
adb shell logcat -v time > logcat.txt 
2)獲取內存信息: 
adb shell dumpsys meminfo $package_name or $pid 
3)獲取CPU信息: 
adb shell top -n 1 |findstr $package_name or $pid 
4)獲取電量信息: 
adb shell dumpsys battery 
5)獲取GPU信息: 
GPU信息命令:adb shell dumpsys gfxinfo $package_name or $pid 
要獲取GPU信息,在“開發者選項”中打開“GPU呈現模式分析”,如圖3所示:

這裏寫圖片描述

圖3 GPU呈現模式分析

6)獲取流量信息: 
adb shell cat/proc/uid_stat/$uid/tcp_rcv 
adb shell cat/proc/uid_stat/$uid/tcp_snd

技巧:如何獲取被測應用的UID 
步驟1:查看APP的進程ID(PID) 
adb shell ps | grep $package_name 
步驟2:查看APP的用戶ID(UID) 
adb shell cat /proc/$pid/status

轉自:https://blog.csdn.net/Allan_shore_ma/article/details/78542043

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章