Android自動化測試之Monkeyrunner使用方法及實例

目前Android SDK裏自帶的現成的測試工具備monkey 和 monkeyrunner兩個。你們別看這倆兄弟名字相像,但實際上是完徹底全不一樣的兩個工具,應用在不一樣的測試領域。總的來講,monkey主要應用在壓力和可靠性測試上,運行該命令能夠隨機地向目標程序發送各類模擬鍵盤事件流,而且能夠本身定義發送的次數,以此觀察被測應用程序的穩定性和可靠性,應用起來也比較簡單,記住那幾個命令就好了。而monkeyrunner呢,相比之下會強大一些,它主要可應用於功能測試,迴歸測試,而且能夠自定義測試擴展,靈活性較強,而且測試人員能夠徹底控制。html

本篇乃本人學習monkeyrunner時筆記,查看網絡中的資料並經本人測試而出,因爲本人剛接觸,因此本篇內容難免膚淺,高手們請繞走~python

在測試本人如下實例時,請自行搭建Android環境。android

1、打開模擬器shell

運行monkeyrunner以前必須先運行相應的模擬器,否則monkeyrunner沒法鏈接設備。windows

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

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

上面命令中的test是模擬器名稱。使用時須要改爲實際名字。網絡

 

 

若是正常,模擬器應該能夠啓動起來了。app

若是執行的結果出現如下錯誤內容:框架

[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),以下圖所示:

肯定後,關閉CMD窗口,從新打開CMD。執行以上命令。將會啓用模擬器。

模擬器啓動成功後,咱們仍在CMD環境中操做。如今進入monkeyrunner的shell命令交互模式。

命令:monkeyrunner

進入shell命令交互模式後,首要一件事就是導入monkeyrunner所要使用的模塊。直接在shell命令下輸入:

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

OK,這步完成咱們就能夠利用monkeyrunner進行測試工做了。

這裏有兩種方案,一是直接在shell命令下輸入如下命令;

命令說明

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

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

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

device.reboot() #手機設備重啓

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

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

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

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

二是將如下命令寫到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腳本文件路徑不正確。你能夠有如下解決辦法:

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

二、指定python文件位置。若是test.py文件在D盤根目錄下,能夠這樣執行:monkeyrunner d:\test.py

學習筆記

下面是學習中的筆記,有點亂。就放在本篇最後吧。

環境變量

變量名: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


android自動化測試框架:CTS、monkey、monkeyrunner、benchmark

 

monkeyrunner

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

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

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

運行monkeyrunner

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

monkeyrunner命令語法

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

monkeyrunner API

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

注意:在運行monkeyrunner以前必須先運行相應的模擬器,不然monkeyrunner沒法鏈接到設備
運行模擬器有兩種方法:一、經過eclipse中執行模擬器 二、在CMD中經過命令調用模擬器

這裏介紹經過命令,在CMD中執行模擬器的方法

命令:emulator -avd test
上面命令中test是指模擬器的名稱。

導入須要的模塊

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')

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

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


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

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


#啓動任意的Activity

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

此時能夠向模擬器發送如按鍵、滾動、截圖、存儲等操做了。


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

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

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

寫文件MonkeyImage

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


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

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

device.wake()

從新引導到指定的引導程序指定的設備

device.reboot()
=========================================================

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

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

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

device.press(參數1:鍵碼,參數2:觸摸事件類型)
參數1:見android.view.KeyEvent
參數2,若有TouchPressType()返回的類型-觸摸事件類型,有三種。
一、DOWN 發送一個DOWN事件。指定DOWN事件類型發送到設備,對應的按一個鍵或觸摸屏幕上。
二、UP 發送一個UP事件。指定UP事件類型發送到設備,對應釋放一個鍵或從屏幕上擡起。
三、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

相關文章
相關標籤/搜索