寫在正文之前
關(guān)于測試方面的東西湃窍,值得研究和推敲的東西實在太多,我一直想提倡和實踐一種軟件行業(yè)的工匠精神仙蛉,從測試這個崗位來講,工匠精神意味著測試人明白破壞是為了重建碱蒙,明白測試的目的是為了預(yù)防BUG而不是發(fā)現(xiàn)BUG荠瘪,意味著對每一個缺陷窮根問底,意味著無論從流程還是技術(shù)上都無所不用其極地為提高產(chǎn)品質(zhì)量而努力赛惩,而測試人員哀墓,更像是一股特種作戰(zhàn)人員,他們身懷絕技喷兼,斗智斗勇篮绰,無孔不入地深入產(chǎn)品、深入底層季惯,去發(fā)現(xiàn)隱藏的缺陷吠各。一個好的測試人員不該被限制被拘束,他們明白自動化的威力星瘾,但也不輕視黑盒走孽,會以白盒作為輔助手段,安全性能對他們來講更是架構(gòu)在CI之上的更高層自動化琳状。
這一系列會以安卓自動化為主磕瓷,從基本的MonkeyRunner講到谷歌的Uiautomator再講到更高層次的Robotium和Appium,我們會發(fā)現(xiàn)念逞,所有框架都不是閉門造車困食,他們的差別只是架構(gòu)和設(shè)計思想上的差別,而不是技術(shù)層次的差別翎承。
什么是MonkeyRunner
MonkeyRunner是Android SDK提供的測試工具硕盹。嚴(yán)格意義上來說MonkeyRunner其實是一個Api工具包,它不像我們上一講講過的Monkey叨咖,Monkey是向應(yīng)用發(fā)送一系列偽隨機(jī)事件瘩例,而MonkeyRunner提供了一系列的API用于具體操控我們的安卓系統(tǒng)啊胶,例如打開哪個activity、做什么操作都是可以自定義的垛贤。有了Monkeyrunner焰坪,我們可以通過python語句控制apk包的安裝和卸載、啟動app聘惦、向app發(fā)送各種動作指令某饰、截取圖片并保存。
然而MonkeyRunner提供的操作有限善绎,適合重復(fù)性黔漂、短路徑的測試,例如渠道包的冒煙測試禀酱,不適合連續(xù)性的操作炬守,缺點(diǎn)也同樣明顯;
1比勉、 由于type和drag方法的不穩(wěn)定劳较,很容易偏離我們的預(yù)期。
2浩聋、 MonkeyRunner不支持?jǐn)嘌怨畚希恢С纸貓D之間的對比。
MonkeyRunner實戰(zhàn)
話不多說衣洁,直接貼代碼墓捻,代碼也寫得比較簡單,所有的理解也會體現(xiàn)在注釋中坊夫,工具比較簡單砖第,建議大家直接上官網(wǎng)查看API。
# -*- coding: utf-8 -*
"""
MonkeyRunner: 提供了橋接測試程序與設(shè)備或者模擬器的作用环凿,
提供了一些輔助ui及內(nèi)置的幫助命令梧兼。
MonkeyDevice: 代表我們所連接的設(shè)備本身,提供了操作設(shè)備
的一系列方法智听,包括安裝羽杰、應(yīng)用apk,喚醒到推、重啟考赛、
觸摸設(shè)備的一系列方法。
MonkeyImage : 代表我們的截圖對象莉测。這個類提供了對截圖的一系列操作
颜骤,例如截圖之間的相似度對比斷言,生成截圖等等
"""
from com.android.monkeyrunner import MonkeyRunner
from com.android.monkeyrunner import MonkeyDevice
from com.android.monkeyrunner import MonkeyImage
#引入我最愛的單元測試框架unittest
from unittest import TestCase, main
class SimpleAPI(TestCase):
'''
簡單利用monkerrunner的API進(jìn)行了一些基本的操作捣卤,例如
安裝忍抽、卸載八孝、滑動、截圖等等
'''
def setUp(self):
'''
配置連接鸠项,如果10s還沒有連接上唆阿,則報異常
'''
try:
self.device = MonkeyRunner.waitForConnection(10)
except:
print('連接超過10s,超時锈锤,請檢查設(shè)備')
#定義測試包名
self.package = 'net.medlinker.medlinker'
#定義你要打開的activity名
self.activity = 'net.medlinker.medlinker/.guide.MainActivity'
#定義打開路徑
self.runComponent = self.package + '/' + self.activity
#安裝,如果原來的已經(jīng)有安裝包闲询,則會先卸載
try:
self.device.installPackage('medlinker.apk')
except:
print('sorry,install failed')
def tearDown(self):
print('Nice to meet you')
def test_main_headline_page(self):
'''
進(jìn)入首頁久免,進(jìn)行一系列的操作,最后進(jìn)行截圖扭弧,與其他目錄中原本已有的截圖進(jìn)行對比
'''
self.device.startActivity(component=self.runComponent)
#等待界面啟動完成阎姥,monkeyrunner在等待方面做得比較挫,只有一個sleep方法
MonkeyRunner.sleep(4)
#操縱設(shè)備按下菜單鍵
self.device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)
#在(500,1200)坐標(biāo)位置進(jìn)行點(diǎn)擊鸽捻,這個也做得比較挫呼巴,隨著設(shè)備的變化位置會發(fā)生變化
self.device.touch(500, 1200,"DOWN_AND_UP");
#模擬拖動操作
self.device.drag((550,500),(100,500), 0.5, 1)
#當(dāng)前位置截圖
mainPageImage = self.device.takeSnapshot()
#加載已知正確的圖像
imageTrue = MonkeyRunner.loadImageFromFile('E:\github\true.png')
#斷言,如果兩個圖片有大于75%的相似度御蒲,則斷定測試通過
self.assertTrue(imageTrue.sameAs(mainPageImage, 0.75))
if __name__ == '__main__':
main()