Android自动化测试之MonkeyRunner
生活随笔
收集整理的這篇文章主要介紹了
Android自动化测试之MonkeyRunner
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
MonkeyRunner是Google Android SDK下的一個工具,用于自動化測試Android程序。 Monkeyrunner工具提供了一套API,使用這些api寫出的Python程序可以在黑盒地控制Android設(shè)置和模擬器。有了Monkeyrunner,我們可以通過python語句控制apk包的安裝和卸載、啟動app、向app發(fā)送各種動作指令、截取圖片并保存。 Monkeyrunner和Monkey不同,Monkey是直接運行在adb shell中的命令,它隨機的生成用戶或者系統(tǒng)的各種隨機事件,而MonkeyRunner則可以通過api來產(chǎn)生特定命令和事件來控制設(shè)備和模擬器。 MonkeyRunner在android測試中有下面特點:- 支持多設(shè)備: API可以跨多個設(shè)備或模擬器實施測試套件。您可以在同一時間接上所有的設(shè)備或一次啟動全部模擬器(或統(tǒng)統(tǒng)一起),依據(jù)程序依次連接到每一個,然后運行一個或多個測試。您也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關(guān)閉模擬器。
- 功能測試: monkeyrunner可以為一個應(yīng)用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數(shù)值,然后觀察輸出結(jié)果的截屏。
- 回歸測試:monkeyrunner可以運行某個應(yīng)用,并將其結(jié)果截屏與既定已知正確的結(jié)果截屏相比較,以此測試應(yīng)用的穩(wěn)定性。
- 可擴展的自動化:由于monkeyrunner是一個API工具包,您可以基于Python模塊和程序開發(fā)一整套系統(tǒng),以此來控制Android設(shè)備。除了使用monkeyrunner API之外,您還可以使用標(biāo)準(zhǔn)的Python os和subprocess模塊來調(diào)用如adb這樣的Android工具。 您還可以向monkeyrunner API中添加您自己的類。我們將在使用插件擴展monkeyrunner一節(jié)中對此進行詳細討論。
一個簡單的MonkeyRunner的例子
下面是個monkeyrunner的代碼樣例,下面代碼包含了,連接設(shè)備、安裝apk包、啟動程序、發(fā)送鍵盤指令、截圖、保存截圖。 # python引入monkeyRunner模塊 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice# 連接設(shè)備, 獲得一個MonkeyDevice對象 device = MonkeyRunner.waitForConnection()# 安裝apk包. 返回值是boolean,可以判斷是否安裝成功 device.installPackage('myproject/bin/MyApplication.apk')# sets a variable with the package's internal name package = 'com.example.android.myapplication'# sets a variable with the name of an Activity in the package activity = 'com.example.android.myapplication.MainActivity'# sets the name of the component to start runComponent = package + '/' + activity# 啟動應(yīng)用程序 device.startActivity(component=runComponent)# 按下手機的菜單鍵 device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)# 截圖 result = device.takeSnapshot()# 保存截圖 result.writeToFile('myproject/shot1.png','png')常用API
#需要引入的模塊 from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner import MonkeyDevice as md from com.android.monkeyrunner import MonkeyImage as mi#等待設(shè)備連接,30秒超時,后面是設(shè)備名稱,該名稱可以通過執(zhí)行命令行`adb devices`獲得 device = mr.waitForConnection(30,'123123135002735')#安裝apk包 device.installPackage('d:/有道詞典V4.0.3.apk'.decode('utf-8'))#卸載應(yīng)用程序 device.removePackage('com.youdao.dict')#啟動應(yīng)用程序 device.startActivity(component='com.youdao.dict/.activity.DictSplashActivity')#等待程序加載,5秒 mr.sleep(5)#拖動操作,四個參數(shù),前兩個是初始點、結(jié)束點坐標(biāo),0.5是持續(xù)時間,1是步數(shù) device.drag((550,500),(100,500), 0.5, 1)#觸摸操作,三個參數(shù),X坐標(biāo)、Y坐標(biāo),觸摸類型 device.touch(80, 1050, "DOWN_AND_UP")#截圖并保存,注意如果名字中有中文,需要進行utf-8編碼,否則亂碼 now = time.strftime("%Y-%m-%d-%H-%M-%S") mainPageImage = device.takeSnapshot() mainPageImage.writeToFile("d:/"+"主頁面截圖".decode("utf-8")+now+".png", "png")#點擊后退鍵,鍵盤碼詳情可以去查sdk幫助文檔,路徑:android-sdk-windows/docs/reference/android/view/KeyEvent.html device.press("KEYCODE_BACK", "DOWN_AND_UP")#將日志輸出到外部文件,在python中使用中文,需要在文件開頭將編碼設(shè)置為utf-8,否則亂碼 log = open('d:/monkenyLog.txt', 'w') log.write("等待手機連接...、\n") log.close()#截圖比較,sameAs()第二個參數(shù)表示相似度,0表示完全不相似,1表示完全相同 imageTrue = mr.loadImageFromFile('d:/shot/true.png') if(imageTrue.sameAs(mainPageImage, 0.75)):log.write('截圖比較成功\n') else:log.write('截圖比較失敗\n') 其他詳細信息可參加Android sdk文檔,路徑 android-sdk-windows/docs/tools/help/monkeyrunner_concepts.html錄制腳本
MonkeyRunner自身提供腳本錄制功能,即MonkeyRecorder。 將下面代碼保存成recorder.py from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder device = mr.waitForConnection() recorder.start(device) 錄制產(chǎn)生的結(jié)果,myRecorder.mr: TOUCH|{'x':92,'y':936,'type':'downAndUp',} TOUCH|{'x':357,'y':688,'type':'downAndUp',} TOUCH|{'x':285,'y':82,'type':'downAndUp',} TYPE|{'message':'hello',} TOUCH|{'x':679,'y':82,'type':'downAndUp',} 想要錄制回放,還要借助 monkey_playback.py文件,這個文件用來連接手機,初始化一些變量,解析我們的myRecorder.mr。 使用命令 monkeyrunner monkey_playback.py myRecorder.mr即可運行。總結(jié)
MonkeyRunner提供的操作有限,適合重復(fù)性、短路徑的測試,不適合連續(xù)性的操作,由于type和drag方法的不穩(wěn)定,很容易偏離我們的預(yù)期。MonkeyRunner操作依賴于控件坐標(biāo)(也可以通過id,比較耗時),一旦UI發(fā)生改變,腳本無法使用。 Monkeyrunner的等待機制 MonkeyRunner.sleep(5),無法更加友好地等待;MonkeyRunner不提供結(jié)果斷言,我們只能通過截圖比較,無法擺脫人工干預(yù)。 我在github上傳了一個簡單的例子,地址 https://github.com/yeetrack/monkeyrunner轉(zhuǎn)載于:https://my.oschina.net/u/147181/blog/164959
總結(jié)
以上是生活随笔為你收集整理的Android自动化测试之MonkeyRunner的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (二)把域服务升级和迁移到Windows
- 下一篇: 使用lisp函数控制cursor