Monkey、Monkeyrunner之間的區別
一.Monkey
Monkey是Android中的一個命令行工具,可以運行在模擬器里或實際設備中。它向系統發送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試。Monkey測試是一種為了測試軟件穩定性、健壯性的快速有效的方法。
Monkey介紹與安裝
Monkey程序由Android系統自帶,使用Java語言寫成,在Android文件系統中的存放路徑是:/system/framework/monkey.jar。Monkey.jar程序是由一個名為“monkey”的shell腳本來啟動執行,shell腳本在Android文件系統中的存放路是:/system/bin/monkey;
這樣就可以通過在 Shell 窗口中執行: adb shell monkey {+命令參數}來進行Monkey測試了。
打開 Shell 窗口,輸入adb shell ls /system/framework,可以查看到monkey.jar;同理,可查看monkey。
[root@BenLam-vm_0 ~]# adb connect 127.0.0.1
connected to 127.0.0.1:6666
[root@BenLam-vm_0 ~]# adb shell ls /system/framework
monkey.jar
monkey.odex
monkey 幫助詳細:
[root@BenLam-vm_0 ~]# adb shell monkey -help
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions]
[--monitor-native-crashes] [--ignore-native-crashes]
[--kill-process-after-error] [--hprof]
[--pct-touch PERCENT] [--pct-motion PERCENT]
[--pct-trackball PERCENT] [--pct-syskeys PERCENT]
[--pct-nav PERCENT] [--pct-majornav PERCENT]
[--pct-appswitch PERCENT] [--pct-flip PERCENT]
[--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
[--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
[--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
[--wait-dbg] [--dbg-no-events]
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
[--port port]
[-s SEED] [-v [-v] ...]
[--throttle MILLISEC] [--randomize-throttle]
[--profile-wait MILLISEC]
[--device-sleep-time MILLISEC]
[--randomize-script]
[--script-log]
[--bugreport]
[--periodic-bugreport]
COUNT
Monkey 教程
Monkey將以無反饋模式啟動,並把事件任意發送到安裝在目標環境中的全部包。下面是一個更為典型的命令行示例,它啟動指定的應用程序,並向其發送 10 個偽隨機事件:
[root@BenLam-vm_0 ~]# adb shell monkey -p your_app_name -v 10
:Monkey: seed=1551470463890 count=10
:AllowPackage: com.TestApp
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: 25.0%
// 6: 15.0%
// 7: 2.0%
// 8: 2.0%
// 9: 1.0%
// 10: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.TestApp/.launcher.LauncherActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.TestApp/.launcher.LauncherActivity } in package com.TestApp
:Sending Trackball (ACTION_MOVE): 0:(1.0,3.0)Events injected: 10
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=54ms (0ms mobile, 0ms wifi, 54ms not connected)
// Monkey finished
[root@BenLam-vm_0 ~]#
總結 Monkey 分為四大類—— 日志、事件選項、約束選項、調試選項
1. 日志
輸出日志級別,也就是打印結果更詳細的,演示:
[root@BenLam-vm_0 ~]# adb shell monkey -p your_app_name -v 10 # 日志Level:0
[root@BenLam-vm_0 ~]# adb shell monkey -p your_app_name -v -v 10 # 日志Level:1
[root@BenLam-vm_0 ~]# adb shell monkey -p your_app_name -v -v -v 10 # 輸出更詳細的日志
2. 事件選項解釋
-s:指定產生隨機事件種子值,相同的種子值產生相同的事件序列。如: -s 200
--throttle:每個事件結束后的間隔時間——降低系統的壓力(如不指定,系統會盡快的發送事件序列)。如:--throttle 100
--pct-touch:指定觸摸事件的百分比,如:--pct-touch 5% , 相關的還有以下option:
--pct-motion <percent> (滑動事件)
--pct-trackball <percent> (軌跡球事件)
--pct-nav<percent> (導航事件 up/down/left/right)
--pct-majornav<percent> (主要導航事件 back key 、 menu key)
--pct-syskeys<percent> (系統按鍵事件 Home 、Back 、startCall 、 endCall 、 volumeControl)
--pct-appswitch<percent> (activity之間的切換)
--pct-anyevent<percent>(任意事件)
演示:
[root@BenLam-vm_0 ~]# adb shell monkey -p your_app_name –s 10 20
Events injected: 20
## Network stats: elapsed time=68ms (0ms mobile, 0ms wifi, 68ms not connected)
在事件之間插入固定的時間(毫秒)延遲,你可以使用這個設置來減緩Monkey的運行速度,如果你不指定這個參數,則事件之間將沒有延遲,事件將以最快的速度生成。演示:
[root@BenLam-vm_0 ~]# adb shell monkey -p your_app_name --throttle 300 -v 10
:Monkey: seed=1551471341700 count=10
:AllowPackage: com.TestApp
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: 25.0%
// 6: 15.0%
// 7: 2.0%
// 8: 2.0%
// 9: 1.0%
// 10: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.TestApp/.launcher.LauncherActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.TestApp/.launcher.LauncherActivity } in package com.TestApp
Events injected: 10
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=207ms (0ms mobile, 0ms wifi, 207ms not connected)
// Monkey finished
3. 約束選項
# -p:指定有效的package(如不指定,則對系統中所有package有效)
# -c:activity必須至少包含一個指定的category,才能被啟動,否則啟動不了。
[root@BenLam-vm_0 ~]# adb shell dumpsys activity | findstr mFocusedActivity 即可找出 -p、-c的包名
4. 調試選項
--dbg-no-events:初始化啟動的activity,但是不產生任何事件。
--hprof:指定該項后在事件序列發送前后會立即生成分析報告 —— 一般建議指定該項。
--ignore-crashes:忽略崩潰
--ignore-timeouts:忽略超時
--ignore-security-exceptions:忽略安全異常
--kill-process-after-error:發生錯誤后直接殺掉進程
--monitor-native-crashes:跟蹤本地方法的崩潰問題
--wait-dbg:知道連接了調試器才執行monkey測試。
5. 實戰與分析
通過以上幾點讓我們更了解 Monkey 自身的特性,那么他到底是來“搞笑”還是“救兵”。
實戰:
[root@BenLam-vm_0 ~]# adb shell monkey -p your_app_name -v 10
:Monkey: seed=1551470463890 count=10
:AllowPackage: com.TestApp
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: 25.0%
// 6: 15.0%
// 7: 2.0%
// 8: 2.0%
// 9: 1.0%
// 10: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.TestApp/.launcher.LauncherActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.TestApp/.launcher.LauncherActivity } in package com.TestApp
:Sending Trackball (ACTION_MOVE): 0:(1.0,3.0)Events injected: 10
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=54ms (0ms mobile, 0ms wifi, 54ms not connected)
// Monkey finished
[root@BenLam-vm_0 ~]#
分析:
1)輸出日志中需要查看 Monkey 測試中是否出現了 ANR 或者異常,在log的最開始都會顯示 Monkey 執行的 seed 值、執行次數和測試的包名。
2)查看log中第一個Switch,主要是查看Monkey執行的是那一個 Activity,譬如下面的log中,執行的是launcher.LauncherActivity,在下一個swtich之間的,如果出現了崩潰或其他異常,可以在該Activity中查找問題的所在。
2)如果 Monkey 測試順利執行完成,在log的最后,會打印出當前執行事件的次數和所花費的時間;
// Monkey finished代表執行完成。Monkey執行中斷,在log的最后也能查看到當前已執行的次數。Monkey執行完成的log具體如下:
Events injected: 10
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=54ms (0ms mobile, 0ms wifi, 54ms not connected)
// Monkey finished
二.Monkeyrunner
Monkeyrunner介紹
monkeyrunner即android SDK中自帶的工具之一,此工具提供API可按制android設備或模擬器,提供了一個API,使用此API寫出的程序可以在Android代碼之外控制Android設備和模擬器。通過monkeyrunner,您可以寫出一個Python程序去安裝一個Android應用程序或測試包,運行它,向它發送模擬擊鍵,截取它的用戶界面圖片,並將截圖存儲於工作站上。主要目的是用於測試功能/框架水平上的應用程序和設備,或用於運行單元測試套件,但您當然也可以將其用於其它目的。
Monkeyrunner 與 Monkey 區別
Monkey 工具直接運行在設備或模擬器的adb shell中,生成用戶或系統的偽隨機事件流。
Monkeyrunner 工具是在工作站上通過API定義的特定命令和事件控制設備或模擬器。
可以理解 Monkeyrunner 更強大點
Monkeyrunner環境搭建
Monkeyrunner環境搭建比較繁瑣,需要安裝:Jdk + Android-sdk + Python
(這里就說如何安裝了,畢竟大家都懂了~,tar解壓,然后make編譯配置環境變量即可)
[root@BenLam-vm_0 ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
[root@BenLam-vm_0 ~]# python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
[root@BenLam-vm_0 ~]# adb
Android Debug Bridge version 1.0.40
Version 4797878
Installed as /home/test/android-sdk/platform-tools/adb
''''''''''
[root@BenLam-vm_0 ~]# monkeyrunner
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:54:35)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_161
>>>
只要在終端成功運行 monkeyrunner 命令即可表示你已安裝成功~
Monkeyrunner編譯
以下代碼另存為:demo.py
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
device = MonkeyRunner.waitForConnection() # 連接手機設備
device.removePackage("your_app_name") # 卸載 App
MonkeyRunner.sleep(5) # 暫停5秒
device.installPackage("Test.apk") # 安裝 App
print ('Install Success!')
通過命令編譯:
[root@BenLam-vm_0 ~]# monkeyrunner demo.py
Install Success!
# 檢查你的設備是否已安裝指定的測試APP
