android monkeyrunner 測試載入器

來源:互聯網
上載者:User

標籤:

目前android SDK裡內建的現成的測試載入器有monkey 和 monkeyrunner兩個。大家別看這倆兄弟名字相像,但其實是完完全全不同的兩個工具,應用在不同的測試領域。總的來說,monkey主要應用在壓力和可靠性測試上,運行該命令可以隨機地向目標程式發送各種類比鍵盤事件流,並且可以自己定義發送的次數,以此觀察被測應用程式的穩定性和可靠性,應用起來也比較簡單,記住那幾個命令就行了。而monkeyrunner呢,相比之下會強大一些,它主要可應用於功能測試,迴歸測試,並且可以自訂測試擴充,靈活性較強,並且測試人員可以完全控制。

本篇乃本人學習monkeyrunner時筆記,查看網路中的資料並經本人測試而出,由於本人剛接觸,所以本篇內容不免膚淺,高手們請繞走~

在測試本人以下執行個體時,請自行搭建Android環境。

一、開啟模擬器

運行monkeyrunner之前必須先運行相應的模擬器,不然monkeyrunner無法串連裝置。

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

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

上面命令中的test是模擬器名稱。使用時需要改成實際名字。

 

 

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

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

[plain] view plaincopy 
  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 plaincopy 
  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

學習筆記

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

環境變數

變數名: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測試提供了以下獨特的功能:
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中。

運行monkeyrunner

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

monkeyrunner命令文法

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

monkeyrunner API

主要包括三個模組
1、MonkeyRunner:這個類提供了用於串連monkeyrunner和裝置或模擬器的方法,它還提供了用於建立使用者介面顯示提供了方法。
2、MonkeyDevice:代表一個裝置或模擬器。這個類為安裝和卸載包、開啟Activity、發送按鍵和觸摸事件、運行測試包等提供了方法。
3、MonkeyImage:這個類提供了捕捉螢幕的方法。這個類為、將位元影像轉換成各種格式、對比兩個MonkeyImage對象、將image儲存到檔案等提供了方法。

注意:在運行monkeyrunner之前必須先運行相應的模擬器,否則monkeyrunner無法串連到裝置
運行模擬器有兩種方法:1、通過eclipse中執行模擬器 2、在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()返回的類型-觸摸事件類型,有三種。
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

Android自動化測試之MonkeyRunner工具

 一、什麼是monkeyrunnermonkeyrunner工具提供了一個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語句。不論使用哪種方式,您都需要調用SDK目錄的tools子目錄下的monkeyrunner命令。如果您提供一個檔案名稱作為運行參數,則monkeyrunner將視檔案內容為Python程式,並加以運行;否則,它將提供一個互動對話環境。monkeyrunner的命令文法為:monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>[以上的內容部分摘自互連網,借鑒前人的總結]五、執行個體我這裡就以sample中的ApiDemos為例,我們學習任何一樣東西似乎都可以有內建的Sample開始,可以在開發環境中先將其產生ApiDemos.apk。前提:已有device串連(這裡可以是真實裝置,或者模擬器)1、 將ApiDemos.apk放在$Android_Root\tools下。2、 在$Android_Root\tools下建立一個monkeyrunnerprogram.py檔案,按照官方的協助文檔,該檔案裡面內容為:  1 # Imports the monkeyrunner modules used by this program 2   3  from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage 4  5  # Connects to the current device, returning a MonkeyDevice object 6   7 device = MonkeyRunner.waitForConnection() 8  9  # Installs the Android package. Notice that this method returns a boolean, so you can test10  11  # to see if the installation worked.12  13 device.installPackage(‘./ApiDemos.apk‘)14 15 16  # Runs the component17  18 device.startActivity(component=‘com.example.android.apis/.ApiDemos‘)19 20 21  # Presses the Menu button22  23 device.press(‘KEYCODE_MENU‘,‘DOWN_AND_UP‘)24 25 26  # Takes a screenshot27  28 result = device.takeSnapshot()29 30 31  # Writes the screenshot to a file32  33 result.writeToFile(‘./shot1.png‘,‘png‘) 3、 開啟命令列轉到Android_Root\tools目錄下運行一下命令:monkeyrunner monkeyrunnerprogram.py130215 23:35:19.711:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.130215 23:35:20.711:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.130215 23:35:21.711:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: wake.130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice] Error starting command: monkey --port 12345130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]com.android.ddmlib.ShellCommandUnresponsiveException130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408)130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.ddmlib.Device.executeShellCommand(Device.java:276)130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at com.android.monkeyrunner.adb.AdbMonkeyDevice$1.run(AdbMonkeyDevice.java:89)130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.Executors$RunnableAdapter.call(UnknownSource)130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.FutureTask.run(Unknown Source)130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(UnknownSource)130215 23:35:22.835:S [pool-1-thread-1] [com.android.monkeyrunner.adb.AdbMonkeyDevice]  at java.lang.Thread.run(UnknownSource)130215 23:35:55.632:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: press KEYCODE_MENU.130215 23:35:58.311:I [main] [com.android.monkeyrunner.MonkeyManager] Monkey Command: quit.4、 可以Android_Root\tools下查看產生的shot1.png的。六、執行個體改進因為ApiDemos首頁上按下MENU鍵沒有菜單出現,為了更加形象化,在上一個實驗的基礎上繼續實驗一下:1、 在$Android_Root\tools下建立一個monkeyrunnerprogram1.py檔案,裡面內容為:  1 # Imports the monkeyrunner modules used by this program 2   3  from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage 4  5 # Connects to the current device, returning a MonkeyDevice object 6  7 device = MonkeyRunner.waitForConnection() 8  9 # Takes a screenshot10 11 result = device.takeSnapshot()12 13 # Writes the screenshot to a file14 15 result.writeToFile(‘./shotbegin.png‘,‘png‘)16 17 # Presses the Down button18 #這裡是我們加入的主要內容  19 device.press(‘KEYCODE_DPAD_DOWN‘,‘DOWN_AND_UP‘)20 21 device.press(‘KEYCODE_DPAD_DOWN‘,‘DOWN_AND_UP‘)22 23 device.press(‘KEYCODE_DPAD_DOWN‘,‘DOWN_AND_UP‘)24 25 device.press(‘KEYCODE_DPAD_DOWN‘,‘DOWN_AND_UP‘)26 27 device.press(‘KEYCODE_DPAD_DOWN‘,‘DOWN_AND_UP‘)28 29 # Takes a screenshot30 31 result = device.takeSnapshot()32 33 # Writes the screenshot to a file34 35 result.writeToFile(‘./shotend.png‘,‘png‘)www.2cto.com2、  將畫面定位在Apidemos的首頁,此時游標定位在第一行。3、  在$Android_Root\tools目錄下運行一下命令:monkeyrunner monkeyrunnerprogram1.py4、在運行過程中我們可以看見游標不斷向下移動,並且可以在目前的目錄下我們自訂的:運行前:shotbegin.png運行後,shotend.png(在代碼中進行了5次KEYCODE_DPAD_DOWN操作)

 

android monkeyrunner 測試載入器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.