android测试篇(四)android专项测试之压力测试
前言
抄襲文章來源:Android App專項測試-壓力測試篇
小伙伴們大家好,今天主要分享的主題是Android App專項測試。如何進行Android App專項測試壓力測試呢?我們主要通過Android平臺的一門工具Monkey。在學習本門課程之前,如果你具有一定的Shell基礎,將很有助于理解。
本次課程大綱主要分為3個部分:
第一部分 背景
探討兩個問題:
第二部分 理論
- 什么是Crash?
- 什么是ANR?
第三部分 實踐
第一部分 背景
1. 為什么要開展壓力測試?
- 提高產品穩定性
- 提高產品的留存率
2.什么時候開展壓力測試?
- 首輪功能測試通過后
- 下班后的夜間進行
第二部分 理論
手工測試場景
自動化測試場景
圖解:
就拿查找實現自動化的話,對于手機來說它會:
- TouchInput(收集點擊事件)–>KeyEvent(它會收到你點擊鍵盤各種Key的事件)–>TouchSearch(收到你點擊按鈕的Touch事件)
然后就會返回一個聯系人列表可以添加了:
- TouchSearch(收到你點擊按鈕的Touch事件)–>TouchName(對于手機來說同樣收到一個Touch事件)
聊天嘛,你收到的也是一個Touch事件,因為你要點擊用戶頭像,所以
- TouchName(對于手機來說同樣收到一個Touch事件)–>TouchFriend–>TouchKey(接著會受到你輸入的各種文字)
軟硬工具簡介
Monkey
Monkey在哪?
在手機系統里,為了與它進行通訊,我們需要借助一個工具ADB
ADB
ADB是什么
這里需要借助一部 手機 和一臺 WIndows電腦 ,通過USB鏈接,此時我們還需要建立一個軟的連接,這個連接全程就是Android Debug Bridge,也就是Android調試橋。
Monkey Script
MonkeyRunner
Monkey和MonkeyRunner區別:
MonkeyRunner APIs
MonkeyRunner 測試類型
壓力測試結果
我們需要注意的兩個地方:Crash 和 ANR
Crash
相對于我們app來說就像是戰斗機的起火爆炸
ANR
Application Not Responding,如下圖:
第三部分 實踐
1.準備測試環境:
- 準備Android SDK環境
- 準備Python環境
對于環境配置這里不做過多講解
2.一個APP的壓測實踐
壓測實踐Step1:
- 在開發人員選項中,將USB調試勾選上
壓測實踐Step2:
確認手機和電腦已經連接成功,多種方式,這了介紹命令行模式
cmd窗口輸入adb devices
如果cmd輸入adb提示“不是內部或外部命令”:
在環境變量下配置adb地址即可
adb全稱:android調試橋(android debug bridge),我們一般連接手機都是下載該連接橋才可以和AS代碼進行真機調試
壓測實踐step3:
- 安裝測試app:adb install 路徑/xx.apk
壓測實踐setp4:
- 發送測試指令:adb shell monkey 1000
輸出結果如下:
什么時候會出現兩行ActivityResuming的信息:當一個app從前臺調入后天,又從后臺調入前臺就會出現這么一個信息。
Event injected:700 表示我們輸入的隨機測試1000個事件,他只完成了700個,并且出現了相應的報錯。如果這個數字與我們輸入的數字相等,表示沒有異常。如果改數字小于我們輸入的數字,則表示有異常出現
java.lang.SecurityException: You need MANAGE_USERS permission to: check if specified user a managed profile outside your profile group這里不具體討論該bug,這邊采用隨機1000個時間爆出來的bug
壓測實踐step5:
- 獲取程序包名:adb shell “logcat | grep START”,還有一種方法,cmd命令中先:adb shell,然后:logcat | grep START
|表示前一個命令的輸出作為下一個命令的輸入 grep START表示抓取日志中包含有START標簽的日志進行輸入。
這里我們需要關注cmp= 后面的內容,在/之前的是app包名,/之后當前Activity類名
壓測實踐step6:
- 給指定的包打壓力: adb shell monkey -p [packagename] [次數,例如1000],如 adb shell monkey -p com.gxgroup.xx1000
慢慢解決吧,操!!!
Monkey高級參數的應用
1.throttle參數
- 指定實踐之間的間隔: adb shell monkey --throttle,例如 adb shell monkey -p com.gxgroup.pkpt --throttle 1000 10
2.seed參數
- 隨機生成數的seed值:adb shell monkey -s <event_count> ,例如:adb shell monkey -p com.gxgroup.pkpt -s 100 50,在重復執行一遍命令就可以復現上一條命令執行的結果,這里seed次數100和執行次數50,保持遇上一條命令數目相同遍復現上一次結果(這里說的不好理解,往下看,后面有針對性描述)
3.觸摸事件
-
設定觸摸事件的百分比 : adb shell --pct-touch,意思就是monkey所有操作中點擊事件占多大比例。例如 : adb shell monkey -v -p com.android.calculator2 --pct-touch 100 100. ‘-v’參數表示列出所有操作詳情。如下圖,執行的操作,其中Action_down和Action_up是一個點擊事件,成對出現。
4.動作事件
設置動作事件百分比 : adb shell monkey --pct-motion ,這個百分比和你其他事件之和要等于100。如果不等于100,它就會把剩余的比例隨機操作。例如 : adb shell monkey -v -p com.android.calculator2 --pct-touch 50 --pct-motion 30 100,執行后各事件百分比如下:
5.軌跡球事件 -
設定軌跡球事件的百分比 : adb shell monkey --pct-trackball 目前沒實踐過,我也不知道干啥的
6.基本導航事件
- 設定基本導航事件的百分比,輸入設備的上下左右 : adb shell monkey --pct-nav 目前沒實踐過,我也不知道干啥的
7.主要導航事件
- 設定主要導航事件的百分比,兼容中間鍵,返回鍵,菜單按鍵 : adb shell monkey --pct-majornav
8.系統導航事件
與手機硬件相關的
- 設定系統導航事件的百分比,HOME,BACK,撥號及音量鍵 : adb shell monkey --pct-syskeys
9.啟動Activity事件
- 設定啟動Activity的事件百分比 : adb shell monkey --pct-appswitch,假設我們指定了30%,有4個Activity,它就會有30%部分在4個Activity里進行切換
10.不常用事件
- 設定系統導航事件的百分比,HOME,BACK,撥號及音量鍵 : adb shell monkey --pct-anyevent
11.崩潰事件
Crash
- 忽略崩潰和異常 : adb shell monkey --ignore-crashes,monkey在遇到崩潰時會繼續跑,直到遇見的崩潰數等于我們的設定數值。
12.超時事件
ANR
- 忽略超時事件 : adb shell monkey --ignore-timeouts,monkey在遇到超時事件會繼續跑,直到遇見的超時數等于我們的設定數值。
CRASH結果析取
實踐過程:
- 安裝可以引起Crash的App
- 執行App的壓力命令
- 析取Crash的Exception信息
注意:在cmd命令控制臺輸出的信息中CRASH: 后面的內容可以復制出來交給開發人員進行解決,在輸出信息末尾會有一個seed的值,拷貝這個值并在命令中加上[-s seed值]便可復現上一次的測試。如果在測試過程中忽略了crash而繼續執行則無法獲取到seed值。
ANR異常測試結果析取
實踐過程:
- 安裝可以引起ANR的app
- 執行app的壓力命令
- 析取ANR的Exception信息
注意:在cmd命令控制臺輸出的信息中NOT RESPONDING:后面會開始輸出ANR錯誤的類名位置,后面會緊跟當時手機系統的一些信息,如cpu,內存以及其他的一系列的異常信息,全部打印了出來。當出現這種異常信息我們可以將這些信息發送給開發人員debug進行處理。
手動點擊獲得ANR異常,查看日志方法:
在cmd命令控制臺,依次輸入如下命令
- adb shell
- cd /data/anr/
- ls (會有一個traces.txt)
- more traces.txt
經歷以上操作就可以把異常信息再控制臺中輸出了,我們可以把這些異常信息復制下來交由開發人員去分析。
Monkey Script
- 執行Monkey腳本命令 : adb shell monkey -f
1.DispatchTrackball命令(軌跡球事件)
可以幫我們完成點擊操作
DispatchTrackball(long downtime,long eventide,int action,folat x,float y,float pressure,float size,int metstate,float xprecision,float yprecision,int device,int edgeflags)
downtime : 記錄鍵最初被按下的時間
eventide : 事件發生的時間
action : 具體的操作過程
x,y : 坐標點
pressure : 壓力的大小,范圍是0-1
size : 觸摸的一個即使值,范圍是0-1
metstate : 當前按下met鍵的標識
xprecision : x坐標的精確值
yprecision : y坐標的精確值
device : 事件的來源,事件的來源是0-x,0表示不來自物理設備
edgeflags : 表示超出屏幕范圍
action 0代表按下,1代表抬起,x和y代表坐標點
2.DispatchPointer命令(點擊事件)
DispatchPointer(long downtime,long eventide,int action,folat x,float y,float pressure,float size,int metstate,float xprecision,float yprecision,int device,int edgeflags)
downtime : 記錄鍵最初被按下的時間
eventide : 事件發生的時間
action : 具體的操作過程
x,y : 坐標點
pressure : 壓力的大小,范圍是0-1
size : 觸摸的一個即使值,范圍是0-1
metstate : 當前按下met鍵的標識
xprecision : x坐標的精確值
yprecision : y坐標的精確值
device : 事件的來源,事件的來源是0-x,0表示不來自物理設備
edgeflags : 表示超出屏幕范圍
action 0代表按下,1代表抬起,x和y代表坐標點
3.DispatchString命令(輸入字符串事件)
DispatchString(String text)
4.LuanchActivity命令(啟動應用)
LuanchActivity(Package,Activity)
5.UserWait命令(等待事件)
UserWait(1000) , 傳入毫秒數
6.DespatchPress命令(按下鍵值)
DespatchPress(int keycode) , #keycode 66 返回鍵
Monkey Script 實踐
缺點:執行腳本過程中無法實現截屏操作
腳本后綴名.script
1.啟動app
2.點擊輸入框
3.輸入查詢詞
4.點擊鍵盤上的回車
5.點擊搜索按鈕
6.等待結果出現
7.點擊clear按鈕
范例腳本:
解釋:
在獲取點擊坐標點時我們需要用到android_sdk里面tools文件夾下的一個uiautomatorviewer的一個工具
使用:cmd命令進入到tools文件夾下,然后輸入 ./uiautomatorviewer
uiautomatorviewer界面:
左上角兩個手機圖標是獲取當前Android設備的界面
右下角bounds兩個坐標點表示控件的左上角和右下角的坐標點。
腳本使用首先要從電腦push到手機中,命令如下:
adb shell ***.script /data/local/tmp/
此時繼續執行腳本命令:
monkey -f ***.script < event-count>
而此時回車并不能啟動起我們指定的Activity而是超級用戶,這里尋找原因就是我們的LaunchActivity()命令行有問題
之所以出現這個問題是因為在app的AndroidManifest.xml里面activity標簽沒有 android:exported=“true” 這一行代碼,這樣外部就無法調用起Activity。
在一系列修改完成之后,在腳本里還需要在LaunchActivity()里將后面的Activity加上完整路徑,包名+類名,這樣才能正確啟動
MonkeyRunner
1.MonkeyRunner API-alert(警告框)
void alert(String message,String title,String okTitle)
這里的腳本是一個python腳本,后綴名為.py
第一行表示是用Python編寫的
第二行表示編碼格式
第三行表示需要導入我們測試的模塊
第四行表示執行alert命令
執行命令:
monkeyrunner ****.py
monkeyrunner 在android-sdk/tools下面
2.MonkeyRunner API-waitForConnection
等待設備連接,如果有多個device id,則需要指明具體哪個設備
waitForConnection(float timeout,String deviceId) , timeout單位為秒
3.MonkeyRunner API-drag
拖動
drag(tuple start,tuple end, float duration ,integer steps) , timeout單位為秒
start : 起始點
end : 目標點
duration : 手勢持續時間
steps : 插值點的個數,默認為10
4.MonkeyRunner API-press
按鍵
press(String keycode,dictionary type) ,keycode 名:DOWN,UP,DOWN_AND_UP
5.MonkeyRunner API-startActivity
啟動應用
startActivity(package+’/’+activity)
6.MonkeyRunner API-touch
點擊
touch(integer x,integer y,integer type)
x,y : 坐標值
type : DOWN,UP,DOWN_AND_UP
7.MonkeyRunner API-type
輸入
type(String text)
8.MonkeyRunner API-takeSnapshot
截屏
MonkeyImage takeSnapshot(),會返回MonkeyImage 類型數據
9.MonkeyRunner API-sameAs
圖像對比
boolean sameAs(MonkeyImage other,float percent)
10.MonkeyRunner API-writeToFile
保存圖像
void writeToFile(String path,String format)
path : 保存路徑
format : 保存格式,如.jpg,.png,.jpeg
MonkeyRunner實踐
壓力測試至此就告一段落了,本文是通過視頻來實時做的文章筆記,想要看原視頻的鏈接點這里
總結
以上壓力測試后面的涉及到代碼的基本上我也是直接拷貝過來的,也不打算去實踐,如果有興趣的可以去認真看看,這里更偏重于針對測試人員
總結
以上是生活随笔為你收集整理的android测试篇(四)android专项测试之压力测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五星级洒店系统需求分析
- 下一篇: matplotlib库的pyplot的p