Android自動化壓力測試快速入門教程(圖解)——MonkeyRunner


一、MonkeyRunner測試環境配置(轉自)

   1.  android-sdk

下載地址:http://www.android-doc.com/sdk/index.html

下載完成后,只需要解壓就可以(注意解壓的路徑不可以有中文和空格),但是android-sdk的運行需要java虛擬機的支持及JDK,所以在使用android-sdk時需要先安裝JDK,JDK是否有安裝可以在自己電腦C:\ProgramFiles\Java 路徑下查看是否有jdk和jre兩個文件夾,如果有就代表已經安裝好了(有可能安裝在其它文件夾),JDK的安裝請自行下載並安裝。

   2.  配置python環境

python用於支持Monkeyrunner運行,使用python腳本編寫用例會大大簡化Monkeyrunner用例的編寫,且會幫助擴展monkeyrunner的自動化功能,Python請自行下載並安裝。

(1)配置Eclipse的python插件

下載1(最新版):http://pan.baidu.com/s/1c0ivWFQ

下載2:http://sourceforge.net/projects/pydev/files/pydev/

官方:http://pydev.org/download.html

目前最新版本:https://sourceforge.net/projects/pydev/files/pydev/PyDev%203.9.0/PyDev%203.9.0.zip/download?use_mirror=jaist&r=&use_mirror=jaist

然后覆蓋將plugins目錄和features目錄下所有文件挪到Eclipse的相應目錄下,

或者點擊Eclipse環境,點擊help->Install New Software, 在彈出界面中選擇add按鈕:Name隨便起, http://pydev.org/updates或者http://pydev.org/nightly

 

(2)下載python編輯器:

下載地址:https://www.python.org/或者http://pan.baidu.com/s/1hqIL9sC

下載完python-3.4.2.amd64.msi安裝,默認地址不修改

檢驗python是否安裝配置成功,打開cmd,輸入python,如果出現以下界面,則說 明你的python安裝成功了,見(圖3)

 

(3)配置 PyDev

安裝好 PyDev 之后,需要配置 Python/Jython 解釋器,配置過程很簡單。

在 Eclipse 菜單欄中,選擇 Window > Preferences > Pydev > Interpreter - (Python/Jython),在這里配置 Python/Jython 解釋器,下面以 Python 為例介紹如何配置。

首先需要添加已安裝的解釋器。這里,Python 安裝在 C:\Python25 路徑下。單擊 New,選擇 Python 解釋器 python.exe,打開后顯示出一個包含很多復選框的窗口,選擇需要加入系統 PYTHONPATH 的路徑,單擊 Ok。

配置 PyDev

 

或者點擊Auto Config,自動搜索Python,配置完成如(圖9),點擊OK。

 

接下來,檢查一下配置的結果是否正確。

在 System PYTHONPATH 里,檢查是否包含配置過程中加入的那些路徑。這里列出了所有的系統所需的庫文件夾。

另外,在 Forced builtin libs 里,列出了 Python 的內置庫。對於 Python 而言,這樣的內置庫大約有50個,而對於 Jython 來說,則有30個左右。

這樣,Python 解釋器就配置好了。


(4)測試
new->other project->pydev->選擇pydev project
創建工程"HelloPython"
創建"Hello"包
在__init__.py里輸入
  1. print("hello world!")
 
執行程序
 
執行結果:
end
 
運行中出現了下面的錯誤
“Error in sitecustomize; set PYTHONVERBOSE for traceback:
KeyError: 'sitecustomize'
hello world!”
 解決方案:需要下載PyDev的最新版進行配置就不會了的
 

   3. 設置環境變量

在用戶變量里面新建一個PATH,把android-sdk、jdk、python的安裝路徑添加進去;

比如:

C:\android-sdk\tools;C:\androidsdk\platform-tools; C:\Python33;C:\ProgramFiles\Java\jdk1.7.0_10\bin

  4.環境檢查

安裝完成后在cmd窗口下面分別輸入java –version、python和monkeyrunner檢查是否正確安裝,如下圖所示:

 

轉自:http://blog.csdn.net/shy871265996/article/details/9420819

 

二、什么是monkeyrunner

monkeyrunner工具提供了一個API,使用此API寫出的程序可以在Android代碼之外控制Android設備和模擬器。通過monkeyrunner,您可以寫出一個Python程序去安裝一個Android應用程序或測試包,運行它,向它發送模擬擊鍵,截取它的用戶界面圖片,並將截圖存儲於工作站上。monkeyrunner工具的主要設計目的是用於測試功能/框架水平上的應用程序和設備,或用於運行單元測試套件,但您當然也可以將其用於其它目的。

 

三、monkeyrunner工具同Monkey工具的差別

Monkey:

Monkey工具直接運行在設備或模擬器的adb shell中,生成用戶或系統的偽隨機事件流。

monkeyrunner:

monkeyrunner工具則是在工作站上通過API定義的特定命令和事件控制設備或模擬器。

 

四、monkeyrunner的測試類型

1、多設備控制:monkeyrunner API可以跨多個設備或模擬器實施測試套件。您可以在同一時間接上所有的設備或一次啟動全部模擬器(或統統一起),依據程序依次連接到每一個,然后運行一個或多個測試。您也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關閉模擬器。

2、 功能測試: monkeyrunner可以為一個應用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數值,然后觀察輸出結果的截屏。

3、 回歸測試:monkeyrunner可以運行某個應用,並將其結果截屏與既定已知正確的結果截屏相比較,以此測試應用的穩定性。

4、 可擴展的自動化:由於monkeyrunner是一個API工具包,您可以基於Python模塊和程序開發一整套系統,以此來控制Android設備。除了使用monkeyrunner API之外,您還可以使用標准的Python os和subprocess模塊來調用Android Debug Bridge這樣的Android工具。

 

 

五、Monkeyrunner使用方法及實例

轉自

一、打開模擬器

運行monkeyrunner之前必須先運行相應的模擬器,不然monkeyrunner無法連接設備。

用Elipse打開Android模擬器或在CMD中用Android命令打開模擬器。這里重點講一下在CMD中用Android命令打開模擬器

命令:emulator -avd test (注意:test為虛擬設備的名稱——AVD的全稱為:Android Virtual Device,就是Android運行的虛擬設備,如下圖所示:)

上面命令中的test是模擬器名稱。使用時需要改成實際名字。(需要新建名字為test的虛擬器才能啟動成功

 

 

如果正常,模擬器應該可以啟動起來了。

如果執行的結果出現以下錯誤內容:

[plain]  view plain copy
 
  1. PANIC: Could not open: C:\Documents and Settings\sAdministrator\.android/avd/test.ini  

如下圖所示:

原因在於你的環境變量缺少配置。請在“系統變量”中添加“ANDROID_SDK_HOME”,設置其值為“C:\Documents and Settings\Administrator”(注意:這里的值不能為C:\Documents and Settings\Administrator\.android),如下圖所示:

備注:環境變量

變量名:ANDROID_SDK_HOME
變量值:C:\Documents and Settings\Administrator

變量名:Path
變量值:%SystemRoot%\system32;%SystemRoot%;C:\Python27;C:\py;D:\android\android-sdk-windows\tools;D:\android\android-sdk-windows\platform-tools

確定后,關閉CMD窗口,重新打開CMD。執行以上命令。將會啟用模擬器。

模擬器啟動成功后,我們仍在CMD環境中操作。現在進入monkeyrunner的shell命令交互模式。

 

1.命令:monkeyrunner

輸入cmd,然后輸入“monkeyrunner”,

直接在shell命令下輸入:

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice 回車

OK,這步完成我們就可以利用monkeyrunner進行測試工作了。

這里有兩種方案,一是直接在shell命令下輸入以下命令;命令說明

多設備連接,device=MonkeyRunner.waitForConnection(5,"emulator-5556")

                   device.installPackage("C:/hao.apk")

(1)device=MonkeyRunner.waitForConnection() #連接手機設備

(2)device.installPackage("../samples/android-10/ApiDemos/bin/Apidemos.apk") #安裝apk包到手機設備。

(3)啟動其中的任意activity了,只要傳入package和activity名稱即可。命令如下:
device.startActivity(component="com.example.android.apis/com.example.android.apis.ApiDemos")
此時模擬器會自動打開ApiDemos這個應用程序的主頁。

(4)device.reboot() #手機設備重啟

(5)device.touch(300,300,'DOWN_AND_UP')

(6)MonkeyRunner.alert("hello")#在emulator上會彈出消息提示

(7)device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)

(8)device.type('hello')#向編輯區域輸入文本'hello'

 

2.是將以下命令寫到python文件里,例如test.py,然后我們再從命令行直接通過monkeyrunner運行它即可。

比如,我們還是用上面的例子,語法如下:monkeyrunner test.py 接下來monkeyrunner會自動調用test.py,並執行其中的語句,相當方便。

實例:test.py

[python]  view plain copy
 
  1. from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice  
  2. device=MonkeyRunner.waitForConnection()  
  3. device.startActivity(component="your.www.com/your.www.com.TestActivity")  

在CMD中執行

monkeyrunner test.py

可能出現錯誤“Can't open specified script file”,如下圖所示:

原因在於python腳本文件路徑不正確。你可以有以下解決辦法:

1、將test.py文件存放到monkeyrunner文件同一目錄中。可以執行:monkeyrunner test.py 調用

2、指定python文件位置。如果test.py文件在D盤根目錄下,可以這樣執行:monkeyrunner d:\test.py

 

3.monkey_recorder錄制monkeyrunner腳本

 

1. 在”D:\android\android\sdk\tools“目錄下, sdk的tools文件必須有一個monkeyrunner.bat

把腳本放在tool目錄下,monkey_recorder.py

#!/usr/bin/env monkeyrunner
# Copyright 2010, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder
device = mr.waitForConnection(1,"emulator-5556") 
recorder.start(device)
device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP) 
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP) 
MonkeyRunner.alert("hello")

再新建一個monkey_playback.py,內容

#!/usr/bin/env monkeyrunner
# Copyright 2010, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import sys
from com.android.monkeyrunner import MonkeyRunner
from com.android.monkeyrunner import MonkeyRunner as mr

# The format of the file we are parsing is very carfeully constructed.
# Each line corresponds to a single command.  The line is split into 2
# parts with a | character.  Text to the left of the pipe denotes
# which command to run.  The text to the right of the pipe is a python
# dictionary (it can be evaled into existence) that specifies the
# arguments for the command.  In most cases, this directly maps to the
# keyword argument dictionary that could be passed to the underlying
# command. 

# Lookup table to map command strings to functions that implement that
# command.
CMD_MAP = {
    'TOUCH': lambda dev, arg: dev.touch(**arg),
    'DRAG': lambda dev, arg: dev.drag(**arg),
    'PRESS': lambda dev, arg: dev.press(**arg),
    'TYPE': lambda dev, arg: dev.type(**arg),
    'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)
    }
device= mr.waitForConnection(1,"emulator-5556") 
# Process a single file for the specified device.
def process_file(fp, device):
    for line in fp:
        (cmd, rest) = line.split('|')
        try:
            # Parse the pydict
            rest = eval(rest)
        except:
            print 'unable to parse options'
            continue

        if cmd not in CMD_MAP:
            print 'unknown command: ' + cmd
            continue

        CMD_MAP[cmd](device, rest)


def main():
    file = sys.argv[1]
    fp = open(file, 'r')

    device = MonkeyRunner.waitForConnection()
    
    process_file(fp, device)
    fp.close();
    

if __name__ == '__main__':
    main()

然后執行命令:C:\Users\Administrator>monkeyrunner recorder.py

 

 然后你需要點擊record上面的任何一個按鈕,右邊才會顯示你操作的步驟

選擇右邊列表里面的動作,點擊這里保存操作腳本

 

 標准錄制回放腳本下載地址:http://pan.baidu.com/s/1sjHNr45


五 、MonkeyRunner語法

5.1 monkeyrunner

monkeyrunner工具提供了一個API,運用該API編寫的程序可以不用通過android代碼來直接控制android設備和模擬器,我們可以寫一個python程序對android應用程序或測試包進行安裝、運行、發送模擬擊鍵,對用戶界面進行截圖並將截圖存儲在workstation上等操作。monkeyrunner工具的主要設計目的是用於測試application/framework層上的應用程序和設備、或用於運行單元測試套件,也可以用於其它目的。

5.2 monkeyrunner為android測試提供了以下獨特的功能:
1、多設備控制:monkeyrunner API可以跨多個設備或模擬器實施測試套件。可以在同一時間接上所有設備或一次啟動全部模擬器,依據程序依次連接到每一個,然后運行一個或多個測試。也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關閉模擬器。
2、功能測試:monkeyrunner可以為一個應用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數值,然后觀察輸出結果的截屏。
4、回歸測試:monkeyrunner可以運行某個應用,並將其結果截屏與既定已知正確的結果截屏相比較,以此測試應用的穩定性。
4、可擴展的自動化:由於monkeyrunner是一個API工具包,我們可以開發基於python模塊和程式的一整套系統,以此來控制android設備。除了使用monkeyrunner API,我們還可以使用標准的python os和ubprocess模塊來調用android debug bridge這樣的android工具。如ADB這樣的android工具,也可以將自己寫的類添加到monkeyrunner API中。

5.3  運行monkeyrunner

可以直接使用一個代碼文件運行monkeyrunner,抑或在交互式對話中輸入monkeyrunner語句。不論使用哪種方式,你都需要調用SDK目錄的tools子目錄下的monkeyrunner命令。如果提供一個文件名作為運行參數,則monkeyrunner將視文件內容為python程序,並加以運行;否則,它將提供一個交互對話環境。

5.4  monkeyrunner命令語法

monkeyrunner -plugin <plugin_jar> <programe_filename> <programe_option>

5.5 monkeyrunner API

主要包括三個模塊
1、MonkeyRunner:這個類提供了用於連接monkeyrunner和設備或模擬器的方法,它還提供了用於創建用戶界面顯示提供了方法。
2、MonkeyDevice:代表一個設備或模擬器。這個類為安裝和卸載包、開啟Activity、發送按鍵和觸摸事件、運行測試包等提供了方法。
3、MonkeyImage:這個類提供了捕捉屏幕的方法。這個類為截圖、將位圖轉換成各種格式、對比兩個MonkeyImage對象、將image保存到文件等提供了方法。
5.6 導入需要的模塊

方式一:

import sys
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi
如果給導入的模塊起了別名,就應該使用別名,而不能使用原名,否則會出現錯誤。
比如連接設備或模擬器,起了以上別名后,命令應該如下:
device=mr.waitForConnection() 

方式二:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage

方式三:
import com.android.monkeyrunner
但是在使用時,就顯得特別麻煩
device=com.android.monkeyrunner.MonkeyRunner.waitForConnection() 

方式四:
我們也可以給它一個別名
import com.android.monkeyrunner as cam
但是在使用時,就顯得特別麻煩
device=cam.MonkeyRunner.waitForConnection()

#等待連接到設備,與模擬器連接,返回monkeydevice對象,代表連接的設備。沒有報錯的話說明連接成功。
參數1:超時時間,單位秒,浮點數。默認是無限期地等待。
參數2:串deviceid,指定的設備名稱。默認為當前設備(手機優先,比如手機通過USB線連接到PC、其次為模擬器)。
默認連接:device=MonkeyRunner.waitForConnection()
參數連接:device = mr.waitForConnection(1.0,'emulator-5554')

5.7 向設備或模擬器安裝要測試的APK

device.installPackage('myproject/bin/MyApplication.apk') #參數是相對或絕對APK路徑
路徑級別用“/”,不能用“\”,比如d:\www\a.apk,而應該寫成d:/www/a.apk
安裝成功返回true,此時查看模擬器我們可以在IDLE界面上看到安裝的APK的圖標了。


5.8 從設備中刪除指定的軟件包,包括其相關的數據和調整緩存

device.removePackage('myproject/bin/MyApplication.apk')
刪除成功返回true。


5.9 啟動任意的Activity

device.startActivity(component="your.www.com/your.www.com.TestActivity")
或者
device.startActivity(component="your.www.com/.TestActivity")

此時可以向模擬器發送如按鍵、滾動、截圖、存儲等操作了。


執行一個adb shell命令,並返回結果,如果有的話
device.shell("...")

5.10 暫停目前正在運行的程序指定的秒數
MonkeyRunner.sleep(秒數,浮點數)

5.11 捕捉屏幕寫入文件

獲取設備的屏蔽緩沖區,產生了整個顯示器的屏蔽捕獲。(截圖)
result=device.takeSnapshot()
返回一個MonkeyImage對象(點陣圖包裝),我們可以用以下命令將圖保存到文件
result.writeToFile('takeSnapshot\\result1.png','png')

MonkeyImage.writeToFile(參數1:輸出文件名,也可以包括路徑,參數2:目標格式)
寫成功返回true,否則返回false

5.12 type
鍵盤上的類型指定的字符串,這相當於要求每個字符串中的字符按(鍵碼,DOWN_AND_UP).
字符串發送到鍵盤
device.type('字符串')

5.13 喚醒設備屏幕(在設備屏幕上喚醒)

device.wake()

5.14 重新引導到指定的引導程序指定的設備

device.reboot()

5.15 touch、press

在指定位置發送觸摸事件(x,y的單位為像素)

device.touch(x,y,TouchPressType-觸摸事件類型)

發送到指定鍵的一個關鍵事件

device.press(參數1:鍵碼,參數2:觸摸事件類型)
參數1:見android.view.KeyEvent
參數2,如有TouchPressType()返回的類型-觸摸事件類型,有三種。
1、DOWN 發送一個DOWN事件。指定DOWN事件類型發送到設備,對應的按一個鍵或觸摸屏幕上。
2、UP 發送一個UP事件。指定UP事件類型發送到設備,對應釋放一個鍵或從屏幕上抬起。
3、DOWN_AND_UP 發送一個DOWN事件,然后一個UP事件。對應於輸入鍵或點擊屏幕。
以上三種事件做為press()或touch()參數。原英文如下:
use this with the type argument of press() or touch() to send a down event.


為了模擬輸入鍵,發送DOWN_AND_UP。


參數1的部分具體內容邏輯:

按下HOME鍵 device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP) 
按下BACK鍵 device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP) 
按下下導航鍵 device.press('KEYCODE_DPAD_DOWN',MonkeyDevice.DOWN_AND_UP) 
按下上導航鍵 device.press('KEYCODE_DPAD_UP',MonkeyDevice.DOWN_AND_UP) 
按下OK鍵 device.press('KEYCODE_DPAD_CENTER',MonkeyDevice.DOWN_AND_UP)


device.press('KEYCODE_ENTER',MonkeyDevice.DOWN_AND_UP)#輸入回車
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)#點擊返回

home鍵 KEYCODE_HOME 
back鍵 KEYCODE_BACK 
send鍵 KEYCODE_CALL 
end鍵 KEYCODE_ENDCALL 
上導航鍵 KEYCODE_DPAD_UP 
下導航鍵 KEYCODE_DPAD_DOWN 
左導航 KEYCODE_DPAD_LEFT 
右導航鍵 KEYCODE_DPAD_RIGHT  
ok鍵 KEYCODE_DPAD_CENTER 
上音量鍵 KEYCODE_VOLUME_UP  
下音量鍵 KEYCODE_VOLUME_DOWN 
power鍵 KEYCODE_POWER 
camera鍵 KEYCODE_CAMERA 
menu鍵 KEYCODE_MENU 


更多:http://developer.android.com/reference/android/view/KeyEvent.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM