10如何脫離AirtestIDE編寫、運(yùn)行自動(dòng)化腳本
同學(xué)們好,我是網(wǎng)易AirtestProject的團(tuán)隊(duì)成員曉娟,歡迎大家來(lái)到我們的視頻教程專欄《14天Airtest自動(dòng)化測(cè)試小白課程》。
前面我們?cè)诮檀蠹揖帉懽詣?dòng)化腳本的時(shí)候,一直用的是我們配套的編輯器AirtestIDE,那么也會(huì)有很多同學(xué),他們并不想局限在我們配套的IDE上。比如他們想直接用命令行跑腳本,或者他們更習(xí)慣使用其它的python編輯器,比如pycharm等等。
所以今天我們來(lái)學(xué)習(xí)下,如何脫離AirtestIDE來(lái)編寫或者運(yùn)行腳本。
部署本地的python環(huán)境
之前我們就說(shuō)過(guò),airtest、pocoui和airtest-selenium都是python第三方庫(kù),所以只要在python環(huán)境里面裝上這幾個(gè)庫(kù),我們就可以在這個(gè)python環(huán)境里面運(yùn)行這些測(cè)試框架的腳本。
而我們的AIirtestIDE是內(nèi)嵌了1個(gè)裝好了這些庫(kù)的精簡(jiǎn)版的python環(huán)境,所以即使我們不在設(shè)置里面配置任何本地的python環(huán)境,我們依然可以跑airtest、poco或者airtest-selenium腳本。當(dāng)然,不使用IDE自帶的python環(huán)境,我們也可以?在選項(xiàng)--設(shè)置中,設(shè)置同學(xué)們本地的python環(huán)境,以此來(lái)支持更多的python第三方庫(kù)?:

同理,如果我們想用本地的python環(huán)境跑自動(dòng)化腳本時(shí),就必須保證這個(gè)環(huán)境已經(jīng)安裝好了我們所需要的庫(kù)。
另外,對(duì)于python版本,我們?更建議大家選擇python3?,python2我們雖然也支持,但畢竟官方也不維護(hù)python2了,所以我們更推薦大家使用python3作為大家的運(yùn)行環(huán)境。目前我們也已經(jīng)支持了在Python3.9下安裝我們的airtest、pocoui和airtest-selenium庫(kù)。
當(dāng)我們?cè)诒镜匕惭b好1個(gè)python環(huán)境之后,可以直接執(zhí)行python來(lái)查看本地python的詳細(xì)信息。

接下來(lái),我們就可以安裝我們要用到的airtest和pocoui等庫(kù)了,命令如下:
pip install airtest
pip install pocoui
pip install airtest-selenium
需要特別注意的是,poco框架的庫(kù)名叫pocoui?,同學(xué)們不要寫錯(cuò)了,如果不小心同時(shí)安裝了poco和pocoui,請(qǐng)同學(xué)們務(wù)必卸載掉poco,只留下pocoui,避免影響后續(xù)腳本的運(yùn)行,刪除命令如下:
pip uninstall airtest
pip uninstall pocoui
pip uninstall airtest-selenium
安裝好了對(duì)應(yīng)的庫(kù)之后,我們可以使用 pip list 命令查看相應(yīng)的庫(kù)是否安裝上了:

如果之后有版本更新,我們也可以直接使用命令將本地的庫(kù)直接更新到最新版本:
pip install -U airtest
pip install -U pocoui
pip install -U airtest-selenium
如同學(xué)們?cè)诎惭b過(guò)程中,有遇到?安裝超時(shí)報(bào)錯(cuò)?的,可以嘗試更換一些國(guó)內(nèi)的安裝源來(lái)安裝這些庫(kù),方法如下:
# 豆瓣源
pip install airtest -i https://pypi.tuna.tsinghua.edu.cn/simple
# 常見(jiàn)的國(guó)內(nèi)源
阿里云 http://mirrors.aliyun.com/pypi/simple/
中國(guó)科技大學(xué) https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清華大學(xué) https://pypi.tuna.tsinghua.edu.cn/simple/
中國(guó)科學(xué)技術(shù)大學(xué) http://pypi.mirrors.ustc.edu.cn/simple/
至此,本地的python環(huán)境就部署好了,其實(shí)還是非常簡(jiǎn)單的,準(zhǔn)備一個(gè)python環(huán)境,然后在這個(gè)環(huán)境里面使用 pip install 命令安裝好airtest、pocoui和airtest-selenium庫(kù)即可。(不做web自動(dòng)化的話,其實(shí)airtest-selenium也可以不安裝先,有需要的時(shí)候再把它裝上去。)
使用命令行跑腳本/生成報(bào)告
1. 命令行運(yùn)行腳本
在命令行執(zhí)行腳本的命令是airtest run + 腳本文件路徑,該命令的可傳參數(shù)如下:
--device,用來(lái)指定連接的被測(cè)設(shè)備
--log,用來(lái)指定log內(nèi)容和截圖存放的目錄
--recording,運(yùn)行腳本時(shí)進(jìn)行錄屏操作
--no-image,傳入該參數(shù)后,在任務(wù)運(yùn)行過(guò)程中不再保存截圖
舉個(gè)例子,我們?cè)贒:/test/目錄下,新建1個(gè)叫report_test.air的腳本。并在腳本中編寫1條touch腳本。

然后我們?cè)诿钚羞\(yùn)行這個(gè)腳本,指定測(cè)試設(shè)備為連接上的第一臺(tái)安卓設(shè)備,log保存路徑為D:/log/,運(yùn)行腳本時(shí)進(jìn)行錄屏操作,錄屏文件保存到D:/log/record01.mp4:
airtest run D:/test/report_test.air --device Android:/// --log D:/log/ --recording D:/log/record01.mp4
運(yùn)行結(jié)束后,我們可以到指定目錄下查看是否生成了我們指定的log文件和錄屏文件:

其中有幾點(diǎn)需要注意的:
① 如果腳本中沒(méi)有指定運(yùn)行設(shè)備,那么在編寫命令行的運(yùn)行腳本命令時(shí),就必須指定設(shè)備;如腳本已指定運(yùn)行設(shè)備,則運(yùn)行腳本的命令可以不指定設(shè)備,剛才我們的示例腳本是沒(méi)有指定設(shè)備的,如果命令行也不指定設(shè)備,命令行會(huì)提示你沒(méi)有連接設(shè)備,且腳本也不能跑下去。

② 同理,如果命令未指定log參數(shù),則默認(rèn)是不保存log內(nèi)容的
③ --device 后面跟的是用于初始化設(shè)備的URI字符串,連接iOS、安卓和Windows窗口的字符串是不一樣的,我們給大家準(zhǔn)備了詳細(xì)的示例,一起來(lái)看一下:
連接Android手機(jī)
# 什么都不填寫,默認(rèn)取當(dāng)前連接中的第一臺(tái)手機(jī)
Android:///
# 連接本機(jī)默認(rèn)端口連的一臺(tái)設(shè)備號(hào)為79d03fa的手機(jī)
Android://127.0.0.1:5037/79d03fa
# 用本機(jī)的adb連接一臺(tái)adb connect過(guò)的遠(yuǎn)程設(shè)備,注意10.254.60.1:5555其實(shí)是serialno
Android://127.0.0.1:5037/10.254.60.1:5555
連接iOS手機(jī)
iOS:///127.0.0.1:8100
連接Windows窗口
# 連接一個(gè)窗口句柄為123456的Windows窗口
Windows:///123456
# 連接一個(gè)Windows窗口,窗口名稱匹配某個(gè)正則表達(dá)式
Windows:///?title_re=Unity.*
# 連接windows桌面,不指定任何窗口
Windows:///
連接使用了備選連接參數(shù)的設(shè)備
# 夜神模擬器(127.0.0.1:62001為夜神模擬器的端口號(hào))
Android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP&&ori_method=ADBORI
# 設(shè)備號(hào)為79d03fa的 MIUI11 設(shè)備
Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI
更多關(guān)于設(shè)備字符串的內(nèi)容,我們可以參看這篇公眾號(hào)教程:

④ 只有當(dāng)airtest版本大于等于1.1.6時(shí),--recording參數(shù)后面才允許自定義錄屏文件名,且必須以.mp4結(jié)尾。
⑤ 只有當(dāng)airtest版本大于等于1.1.7時(shí),才有--no-image參數(shù),才能指定運(yùn)行腳本過(guò)程中不保存截圖。
2. 命令行生成報(bào)告
使用airtest run 命令運(yùn)行完腳本以后,我們可以使用另一個(gè)命令,airtest report + 腳本文件路徑指令來(lái)生成一份HTML格式的報(bào)告。
該命令的可傳參數(shù)非常多:
--log_root,指定log內(nèi)容和截圖文件所在的目錄
--outfile,指定生成報(bào)告的目錄
--lang,指定報(bào)告語(yǔ)言,可以是中文/英文
--export,導(dǎo)出一個(gè)包含所有資源的報(bào)告文件
--static_root,指定靜態(tài)資源文件的路徑
以剛才的腳本為例,在命令行運(yùn)行以后,我們就可以繼續(xù)生成它的報(bào)告了,指定log路徑為D:/log,生成html報(bào)告的路徑為D:/log/log.html,指定報(bào)告的語(yǔ)言為英文。
airtest report D:/test/report_test.air --log_root D:/log ?--outfile D:/log/log.html --lang en

之后我們可以到指定的文件夾里面查看對(duì)應(yīng)的報(bào)告文件:


另外我們?cè)賮?lái)看下,--export這個(gè)參數(shù),使用這個(gè)參數(shù),可以幫我們打包這份測(cè)試報(bào)告,然后我們可以直接把打包好的這份報(bào)告發(fā)送給別人查看。如果不使用--export來(lái)導(dǎo)出報(bào)告的話,html報(bào)告里面的圖片資源、靜態(tài)資源路徑都是絕對(duì)路徑,發(fā)到別的電腦之后,別人是無(wú)法正常查看的。

只有導(dǎo)出之后的報(bào)告,里面的圖片資源和靜態(tài)文件資源才會(huì)使用相對(duì)路徑,這樣把報(bào)告發(fā)送到別的電腦上時(shí),我們才能夠正常查看。
airtest report D:/test/report_test.air --log_root D:/log ?--lang en ?--export D:/export/

打開(kāi)指定的導(dǎo)出路徑,可以看到導(dǎo)出的測(cè)試報(bào)告文件里面包含了非常多的東西:

報(bào)告里面的圖片資源和靜態(tài)資源都是相對(duì)路徑,我們可以把這份報(bào)告發(fā)送給別人查看。

最后一個(gè)參數(shù)--static_root,用于指定靜態(tài)資源的路徑。因?yàn)槲覀兠看螌?dǎo)出一份報(bào)告,都會(huì)包含一份相同的static文件,它里面放置了報(bào)告的一些css和js等文件。一般來(lái)說(shuō),除非報(bào)告的樣式做了某些更新,否則這些靜態(tài)資源文件都是固定不變的。
因此我們可以將這些資源文件部署到靜態(tài)資源文件服務(wù)器上,用例如 https://host:port/static/css/ 的路徑來(lái)訪問(wèn)它。然后在生成報(bào)告時(shí),將這個(gè)部署出來(lái)的服務(wù)器地址作為 --static_root的參數(shù)傳過(guò)去,這樣導(dǎo)出的報(bào)告文件里面將不再包含static文件,HTML報(bào)告想要訪問(wèn)靜態(tài)資源文件時(shí),訪問(wèn)的就是 static_root給的地址:
airtest report D:/test/report_test.air --log_root D:/log ?--lang en ?--static_root https://host:port/ ?--export D:/export/
需要注意的是,如果傳入給static_root的不是以http開(kāi)頭的資源服務(wù)器地址,而是一個(gè)本地路徑,導(dǎo)出報(bào)告時(shí),還是會(huì)把給定的本地路徑里面的靜態(tài)文件復(fù)制過(guò)來(lái)一份。
使用pycharm等編寫/運(yùn)行腳本
講完了如何在命令行上運(yùn)行自動(dòng)化腳本,接下來(lái)我們?cè)賮?lái)看看,如果不使用AirtestIDE,如何在其它python編輯器中編寫、運(yùn)行Airtest和poco腳本。
以pycharm編輯器為例,首先需要保證你所用項(xiàng)目使用的python環(huán)境里安裝了airtest和pocoui庫(kù)??梢栽谖募?-設(shè)置--項(xiàng)目中查看:

如未安裝,則點(diǎn)擊package右側(cè)的+號(hào),把a(bǔ)irtest和pocoui安裝好。
環(huán)境弄好以后,我們就可以開(kāi)始編寫自動(dòng)化腳本了,新建一個(gè).py文件,添加上引入和初始化代碼,也可以直接把.air腳本的初始化代碼復(fù)制過(guò)來(lái),但需要注意的是,pycharm不會(huì)自動(dòng)幫我們連接設(shè)備,所以我們需要自己在腳本中添加連接設(shè)備的代碼,這里以在auto_setup連接設(shè)備為例:
auto_setup(__file__,devices=["android://127.0.0.1:5037/emulator-5554?cap_method=JAVACAP&&ori_method=MINICAPORI&&touch_method=MINITOUCH"])
更多連接設(shè)備的接口,可以參看剛才給你們推薦的文章。確保先編寫完設(shè)備連接的腳本,再來(lái)編寫airtest腳本,這里以點(diǎn)擊微信為例,首先截取一張微信icon的截圖,利用你們電腦里裝有的截圖工具即可,然后把截圖文件保存在你本地路徑,比如 D:\atest_image\wechat.png,然后把截圖的保存路徑添加到你的點(diǎn)擊腳本里面:
touch(Template(r"D:\atest_image\wechat.png", threshold=0.8,))
這樣就完成了1個(gè)很簡(jiǎn)單的自動(dòng)化腳本了:

當(dāng)然,如果要編寫poco腳本的話,因?yàn)樵趐ycharm中看不到設(shè)備的UI樹(shù),所以我們可以打開(kāi)AirtestIDE來(lái)查看UI樹(shù),然后在pycharm上編寫對(duì)應(yīng)的poco語(yǔ)句即可。
最后就是生成報(bào)告了,我們可以調(diào)用一些airtest提供的接口幫助我們生成報(bào)告,比如simple_report、LogToHtml類等。
以simple_report接口為例:

因?yàn)閳?bào)告是根據(jù)log內(nèi)容來(lái)生成的,所以我們需要在腳本初始化添加logdir參數(shù),用于保存腳本運(yùn)行的log內(nèi)容到指定路徑,使用simple_report生成報(bào)告的時(shí)候,也要把logpath傳進(jìn)去,讓他去對(duì)應(yīng)的路徑找log內(nèi)容來(lái)生成報(bào)告。
關(guān)于用腳本生成報(bào)告更多詳細(xì)的內(nèi)容,大家可以參看這篇推文,我們就不一一在這里講述了。

小結(jié)
那么今天的內(nèi)容就到這里為止啦,這節(jié)課的內(nèi)容比較多,大家課后可以多多實(shí)踐,好好消化下。

至此,關(guān)于自動(dòng)化腳本編寫專題的課程就講完了,下節(jié)課我們將進(jìn)入一個(gè)新的章節(jié),手把手教大家如何接入pocosdk,然后用poco這個(gè)框架來(lái)測(cè)試引擎渲染的游戲。下期我們不見(jiàn)不散~