寫在前面
上個星期分享了《基于Sikuli GUI圖像識別框架的PC客戶端自動化測試實(shí)踐》,但sikuli看起來怎么都像是上個世紀(jì)的界面風(fēng)格,且功能過于簡陋。而同樣基于圖像識別框架的Airtest,則無疑強(qiáng)大了許多,本次分享的內(nèi)容是基于Airtest實(shí)現(xiàn)windows應(yīng)用的自動化測試,內(nèi)容大綱:
- Airtest框架介紹:Airtest適用項(xiàng)目、Airtest特點(diǎn)、Airtest的優(yōu)勢
- Airtest框架組成、原理
- Airtest環(huán)境搭建及IDE的簡單使用
- Airtest開展Windows應(yīng)用自動化測試實(shí)踐:連接Windows應(yīng)用、Windows常用API、編寫測試代碼、設(shè)計(jì)測試用例、運(yùn)行效果、查看測試報(bào)告、總結(jié)與思考
一、Airtest框架介紹
1.Airtest介紹
Airtest是網(wǎng)易出品的一款基于圖像識別和Poco控件識別的一款UI自動化測試工具。這個框架設(shè)計(jì)來源于新穎的圖形腳本語言Sikuli,關(guān)于Sikuli框架可見上一篇分享《基于Sikuli GUI圖像識別框架的PC客戶端自動化測試實(shí)踐》。和Sikuli框架的原理一樣,用戶不需要一行行的去寫代碼,而是用屏幕截屏的方式,用截出來的圖形擺列組合成神器的程序,這是Airtest的一部分。另外,Airtest也可以基于poco這個UI控件搜索框架,通過控件的名稱、id之類的來定位目標(biāo)控件,原理類似于 Appium。官網(wǎng):
http://airtest.NETease.com/
2.Airtest適用項(xiàng)目
- 游戲
- Android
- IOS
- Web
- Windows
3.Airtest特點(diǎn)
- 跨平臺
- 易操作
- 可擴(kuò)展
- 支持GUI編輯器
4.Airtest的優(yōu)勢
相比于其他的自動化測試框架,Airtest主要有如下兩個優(yōu)勢:
- 大幅度降低自動化腳本的編寫和維護(hù)成本
- 解決游戲測試的痛點(diǎn)
二、Airtest框架組成、原理
1.Airtest框架組成
- Airtest:是一個跨平臺的、基于圖像識別的UI自動化測試框架,適用于游戲和App,支持平臺有Windows、 Android和iOS;
- Poco:是一款基于UI控件識別的自動化測試框架,目前支持Unity3D/cocos2dx/Android原生app/iOS原生app/ 微信小程序,也可以在其他引擎中自行接入poco-sdk來使用;
- AirtestIDE:跨平臺的UI自動化測試編輯器,內(nèi)置了Airtest和Poco的相關(guān)插件功能,能夠快速簡單地 編寫Airtest和Poco代碼;
- AirLab:真機(jī)自動化云測試平臺,目前提供了TOP100手機(jī)兼容性測試、海外云真機(jī)兼容性測試等服務(wù);
2.Airtest工作原理
三、Airtest環(huán)境搭建及IDE的簡單使用
官方文檔:
https://airtest.doc.io.netease.com/IDEdocs/getting_started/AirtestIDE_install/
1.下載安裝
1)安裝Python/ target=_blank class=infotextkey>Python
由于Airtest框架是基于python語言開發(fā),本地需要搭建python相關(guān)環(huán)境,建議使用python3
Python 下載地址:
https://www.python.org/downloads/
2)下載AirtestIDE客戶端
AirtestIDE客戶端下載:
http://airtest.netease.com
Windows系統(tǒng)用戶在官網(wǎng)上下載對應(yīng)32位或是64位版本的zip包,解壓后得到AirtestIDE文件夾,雙擊AirtestIDE/AirtestIDE.exe即可啟動
2.Airtest IDE使用
1)生成報(bào)告
Airtest運(yùn)行完成后,會自動生成一份報(bào)告,通過下圖按鈕可以查看,點(diǎn)擊后會自動啟動瀏覽器查看報(bào)告
2)圖片/代碼模式切換
Airtest IDE中右鍵,即可兩種模式相互切換
切換后的效果如下:
四、Airtest開展Windows應(yīng)用自動化測試實(shí)踐
1.連接Windows應(yīng)用
連接Windows應(yīng)用有三種方法,分別是:
- 通過搜索窗口連接:設(shè)備窗-Windows窗口連接-搜索窗口,選擇窗口后,點(diǎn)擊連接
- 通過句柄連接(由于句柄容易發(fā)生變化,因此不推薦此連接方式):下圖的67330即為企業(yè)微信的句柄
- 通過正則匹配應(yīng)用應(yīng)用標(biāo)題進(jìn)行連接
if not cli_setup:
auto_setup(__file__, logdir=True, devices=["Windows:///?title_re=.*閱云*"])
2.Windows常用API
官方文檔:
https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.win.win.html
源碼:
https://airtest.readthedocs.io/zh_CN/latest/_modules/airtest/core/win/win.html
- connect:連接設(shè)備
- shell:執(zhí)行cmd命令
- snapshot:截圖
- keyevent:執(zhí)行鍵盤事件
- text:輸入文本
- key_press:按下某個按鍵
- key_release:釋放某個按鍵
- touch:鼠標(biāo)點(diǎn)擊事件
- double_click:鼠標(biāo)雙擊
- swipe:滑動
- move_mouse:移動鼠標(biāo)
- mouse_down:按下鼠標(biāo)(左/右)鍵
- mouse_up:釋放鼠標(biāo)(左/右)鍵
3.編寫測試代碼
先看下待測試的windows應(yīng)用的頁面布局:
1)代碼構(gòu)成
- 導(dǎo)入核心api和初始化客戶端的方法
# -*- encoding=utf8 -*-
__author__ = "Administrator"
import random
from airtest.core.api import *
from airtest.cli.parser import cli_setup
- 連接windows應(yīng)用
# 連接windows應(yīng)用
if not cli_setup:
auto_setup(__file__, logdir=True, devices=["Windows:///?title_re=.*閱云*"])
- Airtest IDE遵循python編碼風(fēng)格,因此可以將各個測試動作/場景封裝成一個一個的函數(shù),當(dāng)然也可以封裝在其他文件里,然后導(dǎo)入引用
2)案例
- 發(fā)送文本消息:
操作步驟為:進(jìn)入聊天窗口>輸入文本內(nèi)容>發(fā)送
def send_text(time):
setup_send_msg() # 進(jìn)入聊天窗口
for i in range(time):
text("這是AIRTEST發(fā)送的第%s條消息"%str(i)) # 輸入文本消息內(nèi)容
keyevent("{ENTER}") # 按下鍵盤Enter鍵,要大寫
keyevent("{ENTER}") # 第一遍按下Enter是防止此時(shí)的輸入法為中文,第二遍按下Enter是發(fā)送
- 截圖發(fā)送
操作步驟為:進(jìn)入聊天窗口>點(diǎn)擊截圖按鈕>滑動鼠標(biāo)拉取截圖區(qū)域>確認(rèn)發(fā)送截圖
def send_screenshot():
setup_send_msg()
touch(Template(r"tpl1656061157595.png", record_pos=(-0.028, 0.138), resolution=(959, 654)))
sleep(1)
swipe((300,400), (600,800), duration=0.8, steps=2)
keyevent("{ENTER}")
4.設(shè)計(jì)測試用例
GUI自動化測試并不適用于發(fā)現(xiàn)bug,更多的是將重復(fù)性高的、簡單的手工操作場景轉(zhuǎn)換為自動操作,用于回歸測試,或是用于一些數(shù)據(jù)的構(gòu)造模擬上。
將一些基本操作封裝為一個個函數(shù)以后,就可以進(jìn)行組合、設(shè)計(jì)測試用例了,如:
① 場景一:發(fā)送不同類型的消息
分別調(diào)用以下函數(shù):
- 調(diào)用發(fā)送文本函數(shù)
- 調(diào)用發(fā)送表情函數(shù)
- 調(diào)用發(fā)送圖片函數(shù)
- 調(diào)用發(fā)送截圖函數(shù)
- ......
當(dāng)然,以上各個函數(shù)也可以單獨(dú)作為一個個測試用例,從而用于回歸測試;
② 場景二:持續(xù)發(fā)送文本/圖片消息
將上述函數(shù),加上循環(huán),便可實(shí)現(xiàn)持續(xù)發(fā)送xx類型的消息;不過與其說是一條測試用例,倒不如說是為了模擬人工長時(shí)間操作運(yùn)行下程序的穩(wěn)定性,亦或是輔助其他特殊測試場景,比如:
- 去年我在測試移動端時(shí)、通過自動化模擬一端持續(xù)發(fā)送大量圖片消息,從而測試出【iOS移動端在弱網(wǎng)情況下接收大量離線文件消息程序會core掉】的bug。
- 今天在利用Airtest模擬持續(xù)發(fā)送文本消息、測試程序穩(wěn)定性時(shí),發(fā)現(xiàn)【單聊發(fā)送消息傳錯類型參數(shù),發(fā)送給群聊,導(dǎo)致發(fā)送消息失敗,且無任何消息發(fā)送記錄】的bug,很奇怪,我手工發(fā)送的就沒任何問題,暫時(shí)還沒找到規(guī)律,研發(fā)還在定位中。雖然Airtest并沒有直接發(fā)現(xiàn)bug,但卻給發(fā)現(xiàn)bug創(chuàng)造了更多可能。
5.運(yùn)行效果
6.查看測試報(bào)告
Airtest運(yùn)行完成后會自動生成測試報(bào)告,通過控制臺菜單欄的查看報(bào)告按鈕,即可自動在瀏覽器打開測試報(bào)告:
五、總結(jié)與思考
- Airtest也可以用于pycharm編輯器下,需要手動提前安裝airtest庫:pip install -U airtest,安裝后即可新建airtest腳本,語法和在Airtest IDE中編寫時(shí)一致。另外,pycharm編輯器也可以直接打開airtest腳本;
- 對于web、APP自動化主要用該端特定的自動化框架,如selenium、appium,而此類測試框架無法實(shí)現(xiàn)的Windows應(yīng)用的操作,則可以借助Airtest實(shí)現(xiàn),從而打通端到端自動化測試流程;
- 自動化測試編碼實(shí)現(xiàn)僅僅是自動化測試流程中一個小環(huán)節(jié),更重要的是場景設(shè)計(jì)、用例實(shí)現(xiàn)以及如何發(fā)揮自動化測試的價(jià)值;
- 自動化測試可能不會發(fā)現(xiàn)多少bug,但卻給發(fā)現(xiàn)bug創(chuàng)造了更多可能;