Windows項目里的圖像識別框架Airtest自動化測試實踐

来源:https://www.cnblogs.com/valveszhishi/archive/2022/08/02/16542601.html
-Advertisement-
Play Games

head.s 參考 [github這個博主的][ https://github.com/sunym1993/flash-linux0.11-talk ] 改變棧頂位置 _pg_dir: startup_32: movl $0x10,%eax mov %ax,%ds mov %ax,%es mov % ...


回顧我上個星期分享了​​《 高效編寫C#圖像處理程式(3) Rgb=>Lab,圖像缺陷檢測的案例》​​,但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適用項目

基於圖像識別框架Airtest的Windows項目自動化測試實踐_Windows自動化測試基於圖像識別框架Airtest的Windows項目自動化測試實踐_Windows自動化測試_02

3.Airtest特點

  • 跨平臺
  • 易操作
  • 可擴展
  • 支持GUI編輯器

4.Airtest的優勢

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

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

基於圖像識別框架Airtest的Windows項目自動化測試實踐_Windows自動化測試_03基於圖像識別框架Airtest的Windows項目自動化測試實踐_自動化測試_04

  • 解決游戲測試的痛點

二、Airtest框架組成、原理

1.Airtest框架組成

基於圖像識別框架Airtest的Windows項目自動化測試實踐_自動化測試_05

  • 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的Windows項目自動化測試實踐_GUI自動化測試_06

三、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客戶端下載:

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

基於圖像識別框架Airtest的Windows項目自動化測試實踐_自動化測試_07

2.Airtest IDE使用

1)生成報告

Airtest運行完成後,會自動生成一份報告,通過下圖按鈕可以查看,點擊後會自動啟動瀏覽器查看報告

基於圖像識別框架Airtest的Windows項目自動化測試實踐_GUI自動化測試_08基於圖像識別框架Airtest的Windows項目自動化測試實踐_GUI自動化測試_09

2)圖片/代碼模式切換

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

基於圖像識別框架Airtest的Windows項目自動化測試實踐_Windows自動化測試_10基於圖像識別框架Airtest的Windows項目自動化測試實踐_自動化測試_11

切換後的效果如下:

基於圖像識別框架Airtest的Windows項目自動化測試實踐_GUI自動化測試_12基於圖像識別框架Airtest的Windows項目自動化測試實踐_自動化測試_13

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

1.連接Windows應用

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

1)通過搜索視窗連接

設備窗-Windows視窗連接-搜索視窗,選擇窗基於圖像識別框架Airtest的Windows項目自動化測試實踐_Windows自動化測試_15

2)通過句柄連接

(由於句柄容易發生變化,因此不推薦此連接方式):下圖的67330即為企業微信的句柄

基於圖像識別框架Airtest的Windows項目自動化測試實踐_Windows自動化測試_17

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應用的頁面佈局:

基於圖像識別框架Airtest的Windows項目自動化測試實踐_GUI自動化測試_18

1)代碼構成

基於圖像識別框架Airtest的Windows項目自動化測試實踐_Windows自動化測試_19基於圖像識別框架Airtest的Windows項目自動化測試實踐_GUI自動化測試_20

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

基於圖像識別框架Airtest的Windows項目自動化測試實踐_自動化測試_21基於圖像識別框架Airtest的Windows項目自動化測試實踐_GUI自動化測試_22

2)案例

  • 發送文本消息:

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

def send_text(time):
setup_send_msg()
for i in range(time):
text("這是AIRTEST發送的第%s條消息"%str(i))
keyevent("{ENTER}")
keyevent("{ENTER}")

 

  • 截圖發送

點擊截圖按鈕>滑動滑鼠拉取截圖區域>確認發送截圖

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

def send_screenshot():
setup_send_msg()
touch(Template(r"tpl1656061157595.png", record_pos=(-0.028, 0.138), resolutinotallow=(959, 654)))
sleep(1)
swipe((300,400), (600,800), duratinotallow=0.8, steps=2)
keyevent("{ENTER}")

4.設計測試用例

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

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

① 場景一:發送不同類型的消息

分別調用以下函數:

  • 調用發送文本函數
  • 調用發送表情函數
  • 調用發送圖片函數
  • 調用發送截圖函數
  • ......

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

② 場景二:持續發送文本/圖片消息

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

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

5.運行效果

6.查看測試報告

Airtest運行完成後會自動生成測試報告,通過控制台菜單欄的查看報告按鈕,即可自動在瀏覽器打開測試報告:

基於圖像識別框架Airtest的Windows項目自動化測試實踐_自動化測試_23

五、總結與思考

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 搭建lamp架構 1.LAMP架構介紹 所謂lamp,其實就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一組動態網站或者伺服器的開源軟體,除Linux外其它各部件本身都是各自獨立的程式,但是因為經常被放在一起使用,擁有了越來越高的相容度,共同組成了一個強 ...
  • Preparation debian11幾乎可以使用任何舊的電腦硬體,因為最小安裝的要求非常低。以下是最低要求和推薦要求: | 最低要求 | 推薦要求 | | | | | 存儲:10 Gigabytes記憶體:512 MegabytesCPU: 1 GigaHertz | 存儲:10 Gigabyt ...
  • 今天我們來瞭解有關Secret加密以及Configmapd配置介紹 一、Configmapd配置介紹 ConfigMap 功能在 Kubernetes1.2 版本中引入,許多應用程式會從配置文件、命令行參數或環境變數中讀取配置信息。ConfigMap API 給我們提供了向容器中註入配置信息的機制,... ...
  • 交叉編譯 交叉編譯是在一個平臺上生成另一個平臺上的可執行代碼。 同一個體繫結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體繫結構上運行。 通常是自己的電腦寫好代碼編譯之後發到嵌入式設備或者盒子之類的去執行,或者另一個版本系統沒有的東西,例如opencv,從有的系統版本編譯到沒有的系統 ...
  • Mac圖片無損放大軟體哪款好用?Topaz Gigapixel AI for Mac是Mac平臺上一款圖片無損放大軟體,使用AI人工智慧來擴展圖像。topaz gigapixel AI為用戶提供無損放大的圖像,同時還增加了自然細節損失處理,可以放大和填充圖像調整產品,而不使圖片失真! 詳情:Topa ...
  • 好久沒寫博客了,最近挺忙的。近來有些好玩的實現,網上的資料並不是非常詳細,打算慢慢寫下來,希望別人能少走一點彎路。 因為希望提高ADC的採樣率,這次我試著實現了一下三重ADC交替採樣+DMA搬運至記憶體+TIM的TRGO觸發採樣(環境是stm32cubemx 6.5.0和keil 5) 首先打開cub ...
  • 喜歡音樂的朋友們想要快速進行音樂樂譜的學習麽?iReal Pro 是一款Mac上優秀的音樂學習和參考工具, 可以模擬出一支虛擬樂隊伴隨您練習,從30種不同風格的伴奏中選擇,包括50套練習曲,用於練習一般和弦進階,總之,iReal Pro是一款非常強大的音樂練習工具,音樂愛好者們一定要試試這款軟體。 ...
  • mobatek主要為電腦專業人士研究強大、安全且具有成本效益的軟體,主要產品包括:MobaXterm(適用於Windows的X伺服器和SSH客戶端)、MobaSSH(使用Unix工具為Windows增強的SSH伺服器)以及一些免費軟體......... ...
一周排行
    -Advertisement-
    Play Games
  • 使用原因: 在我們服務端調用第三方介面時,如:支付寶,微信支付,我們服務端需要模擬http請求並加上一些自己的邏輯響應給前端最終達到我們想要的效果 1.使用WebClient 引用命名空間 using System.Net; using System.Collections.Specialized; ...
  • WPF 實現帶蒙版的 MessageBox 消息提示框 WPF 實現帶蒙版的 MessageBox 消息提示框 作者:WPFDevelopersOrg 原文鏈接: https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal 框架使用大於等於.N ...
  • 一、JSON(JavaScript Object Notation)的簡介: ① JSON和XML類似,主要用於存儲和傳輸文本信息,但是和XML相比,JSON更小、更快、更易解析、更易編寫與閱讀。 ② C、Python、C++、Java、PHP、Go等編程語言都支持JSON。 二、JSON語法規則: ...
  • 1.避免Scoped模式註冊的服務變成Singleton模式 當提供一個生命周期模式為Singleton的服務實例時,如果發現該服務中還依賴生命周期模式為Scoped的服務實例(Scoped服務實例將被一個Singleton服務實例所引用),那麼這個被依賴的Scoped服務實例最終會成為一個Sing ...
  • 索引時資料庫提高數據查詢處理性能的一個非常關鍵的技術,索引的使用可以對性能產生上百倍甚至上千倍的影響。接下來,會介紹索引的基本原理、概念,並深入學習資料庫中所使用的索引結構和存儲方式,以及如何管理、維護索引等。 1.索引的基本概念 索引時用來快速查詢表記錄的一種存儲結構,一般使用索引有一下兩個方面: ...
  • django2 路由控制器 Route路由,是一種映射關係。路由是把客戶端請求的url路徑和用戶請求的應用程式,這裡意指django裡面的視圖進行綁定映射的一種關係。 請求路徑和視圖函數不是一一對應的關係 在django中所有的路由最終都被保存到一個叫urlpatterns的文件里,並且該文件必須在 ...
  • 1、我們的目標是獲取微博某博主的全部圖片、視頻 2、拿到網址後 我們先觀察 打開F12 隨著下滑我們發現載入出來了一個叫mymblog的東西,展開響應發現需要的東西就在裡面 3、重點來了!!! 通過觀察發現第二頁比第一頁多了參數since_id 而第二頁的since_id參數剛好在上一頁中能獲取到, ...
  • 一、實現原理 在Servlet3協議規範中,包含在JAR文件/META-INFO/resources/路徑下的資源可以直接訪問。 二、舉例說明 如下圖所示,是我新建的一個Spring Boot Starter項目:zimug-minitor-threadpool,用於實現可配置、可觀測的線程池。其中 ...
  • 精華筆記: static final常量:應用率高 必須聲明同時初始化 由類名打點來訪問,不能被改變 建議:常量所有字母都大寫,多個單詞用_分隔 編譯器在編譯時會將常量直接替換為具體的數,效率高 何時用:數據永遠不變,並且經常使用 抽象方法: 由abstract修飾 只有方法的定義,沒有具體的實現( ...
  • Python有一個for...else語法,它的寫法如下 for i in range(0,100): if i == 3: break else: print("Not found") 該語句表示:若for迴圈遍歷完畢,則執行else部分的語句。也就是說上述代碼不會有任何輸出,而下述代碼會輸出“N ...