基於影象識別框架Airtest的Windows專案自動化測試實踐

2022-08-04 15:00:53

寫在前面


上一篇分享了《基於Sikuli GUI影象識別框架的PC使用者端自動化測試實踐》,但sikuli看起來怎麼都像是上個世紀的介面風格,且功能過於簡陋。而同樣基於影象識別框架的Airtest,則無疑強大了許多,本次分享的內容是基於Airtest實現Windows應用的自動化測試,內容大綱:

  • Airtest框架介紹:Airtest適用專案、Airtest特點、Airtest的優勢
  • Airtest框架組成、原理
  • Airtest環境搭建及IDE的簡單使用
  • Airtest開展Windows應用自動化測試實踐:連線Windows應用Windows常用API編寫測試程式碼設計測試用例執行效果檢視測試報告
  • 總結與思考

一、Airtest框架介紹

1.Airtest介紹

Airtest是網易出品的一款基於影象識別和Poco控制元件識別的一款UI自動化測試工具。這個框架設計來源於新穎的圖形指令碼語言Sikuli,關於Sikuli框架可見上一篇分享《基於Sikuli GUI影象識別框架的PC使用者端自動化測試實踐》。和Sikuli框架的原理一樣,使用者不需要一行行的去寫程式碼,而是用螢幕截圖的方式,用截出來的圖形擺列組合成神器的程式,這是Airtest的一部分。另外,Airtest也可以基於poco這個UI控制元件搜尋方塊架,通過控制元件的名稱、id之類的來定位目標控制元件,原理類似於 appium。官網:http://airtest.netease.com/

2.Airtest適用專案

  • 遊戲
  • Android
  • iOS
  • Web
  • Windows

3.Airtest特點

  • 跨平臺
  • 易操作
  • 可延伸
  • 支援GUI編輯器

4.Airtest的優勢

相比於其他的自動化測試框架,Airtest主要有如下兩個優勢:

  • 大幅度降低自動化指令碼的編寫和維護成本

  • 解決遊戲測試的痛點

二、Airtest框架組成、原理

1.Airtest框架組成

 

  • Airtest:是一個跨平臺的、基於影象識別的UI自動化測試框架,適用於遊戲和App,支援平臺有Windows、 Android和iOS;
  • Poco:是一款基於UI控制元件識別的自動化測試框架,目前支援Unity3D/cocos2dx/Android原生app/iOS原生app/ 微信小程式,也可以在其他引擎中自行接入poco-sdk來使用;
  • AirtestIDE:跨平臺的UI自動化測試編輯器,內建了Airtest和Poco的相關外掛功能,能夠快速簡單地 編寫Airtest和Poco程式碼;
  • AirLab:真機自動化雲測試平臺,目前提供了TOP100手機相容性測試、海外雲真機相容性測試等服務;

2.Airtest工作原理

 

 

 

 

三、Airtest環境搭建及IDE的簡單使用

官方檔案:https://airtest.doc.io.netease.com/IDEdocs/getting_started/AirtestIDE_install/

1.下載安裝

1)安裝python

由於Airtest框架是基於python語言開發,本地需要搭建python相關環境,建議使用python3

Python 下載地址:https://www.python.org/downloads/

2)下載AirtestIDE使用者端

AirtestIDE使用者端下載:http://airtest.netease.com

Windows系統使用者在官網上下載對應32位元或是64位元版本的zip包,解壓後得到AirtestIDE資料夾,雙擊AirtestIDE/AirtestIDE.exe即可啟動

 

2.Airtest IDE使用

1)生成報告

Airtest執行完成後,會自動生成一份報告,通過下圖按鈕可以檢視,點選後會自動啟動瀏覽器檢視報告

 

2)圖片/程式碼模式切換

Airtest IDE中右鍵,即可兩種模式相互切換

切換後的效果如下:

 

 

四、Airtest開展Windows應用自動化測試實踐

1.連線Windows應用

連線Windows應用有三種方法,分別是:

1)通過搜尋視窗連線

裝置窗-Windows視窗連線-搜尋視窗,選擇視窗後,點選連線

2)通過控制程式碼連線

(由於控制程式碼容易發生變化,因此不推薦此連線方式):下圖的67330即為企業微信的控制程式碼

3)通過正則匹配應用應用標題進行連線

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:連線裝置
  • shell:執行cmd命令
  • snapshot:截圖
  • keyevent:執行鍵盤事件
  • text:輸入文字
  • key_press:按下某個按鍵
  • key_release:釋放某個按鍵
  • touch:滑鼠點選事件
  • double_click:滑鼠雙擊
  • swipe:滑動
  • move_mouse:移動滑鼠
  • mouse_down:按下滑鼠(左/右)鍵
  • mouse_up:釋放滑鼠(左/右)鍵

3.編寫測試程式碼

先看下待測試的windows應用的頁面佈局:

1)程式碼構成

  • 匯入核心api和初始化使用者端的方法
# -*- encoding=utf8 -*-
__author__ = "Administrator"
import random
from airtest.core.api import *
from airtest.cli.parser import cli_setup
  • 連線windows應用
# 連線windows應用
if not cli_setup:
    auto_setup(__file__, logdir=True, devices=["Windows:///?title_re=.*閱雲*"])
  • Airtest IDE遵循python編碼風格,因此可以將各個測試動作/場景封裝成一個一個的函數,當然也可以封裝在其他檔案裡,然後匯入參照

2)案例

  • 傳送文字訊息:

操作步驟為:進入聊天視窗>輸入文字內容>傳送

def send_text(time):
    setup_send_msg()  # 進入聊天視窗
    for i in range(time):
        text("這是AIRTEST傳送的第%s條訊息"%str(i))  # 輸入文字訊息內容
        keyevent("{ENTER}")  # 按下鍵盤Enter鍵,要大寫
        keyevent("{ENTER}")  # 第一遍按下Enter是防止此時的輸入法為中文,第二遍按下Enter是傳送
  • 截圖傳送

操作步驟為:進入聊天視窗>點選截圖按鈕>滑動滑鼠拉取截圖區域>確認傳送截圖

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.設計測試用例

GUI自動化測試並不適用於發現bug,更多的是將重複性高的、簡單的手工操作場景轉換為自動操作,用於迴歸測試,或是用於一些資料的構造模擬上。

將一些基本操作封裝為一個個函數以後,就可以進行組合、設計測試用例了,如:

① 場景一:傳送不同型別的訊息

分別呼叫以下函數:

  • 呼叫傳送文字函數
  • 呼叫傳送表情函數
  • 呼叫傳送圖片函數
  • 呼叫傳送截圖函數
  • ......

當然,以上各個函數也可以單獨作為一個個測試用例,從而用於迴歸測試;

② 場景二:持續傳送文字/圖片訊息

將上述函數,加上回圈,便可實現持續傳送xx型別的訊息;不過與其說是一條測試用例,倒不如說是為了模擬人工長時間操作執行下程式的穩定性,亦或是輔助其他特殊測試場景,比如:

  1. 去年我在測試行動端時、通過自動化模擬一端持續傳送大量圖片訊息,從而測試出【iOS行動端在弱網情況下接收大量離線檔案訊息程式會core掉】的bug。
  2. 今天在利用Airtest模擬持續傳送文字訊息、測試程式穩定性時,發現【單聊傳送訊息傳錯型別引數,傳送給群聊,導致傳送訊息失敗,且無任何訊息傳送記錄】的bug,很奇怪,我手工傳送的就沒任何問題,暫時還沒找到規律,研發還在定位中。雖然Airtest並沒有直接發現bug,但卻給發現bug創造了更多可能。

5.執行效果

此處為語雀視訊卡片,點選連結檢視:Rec 0005.mp4

 

6.檢視測試報告

Airtest執行完成後會自動生成測試報告,通過控制檯選單欄的檢視報告按鈕,即可自動在瀏覽器開啟測試報告:

 

 

五、總結與思考

  • Airtest也可以用於pycharm編輯器下,需要手動提前安裝airtest庫:pip install -U airtest,安裝後即可新建airtest指令碼,語法和在Airtest IDE中編寫時一致。另外,pycharm編輯器也可以直接開啟airtest指令碼;
  • 對於web、APP自動化主要用該端特定的自動化框架,如selenium、appium,而此類測試框架無法實現的Windows應的操作,則可以藉助Airtest實現,從而打通端到端自動化測試流程;
  • 當然Airtest也支援行動端APP自動化以及web端自動化;
  • 自動化測試編碼實現僅僅是自動化測試流程中一個小環節,更重要的是場景設計、用例實現以及如何發揮自動化測試的價值
  • 自動化測試可能不會發現多少bug,但卻給發現bug創造了更多可能

更多測試開發實用乾貨,同步首發於微信公眾號【測試開發實戰】,歡迎關注!