得物技術淺嘗UI自動化之Airtest實踐

1、背景

因爲不少公司都採用敏捷開發的模式,測試也要跟着進行敏捷測試。而每一個迭代的週期很是短,常常要對原有功能進行迴歸測試,這樣就增長了大量重複人力成本。引入UI自動化測試能夠用來快速回歸測試app原有功能,測試人員只須要關注新功能的測試。其次,移動端App的測試用例大部分是功能驗證相關的用例,經過UI操做便可驗證,這就爲UI自動化提供了便利條件。所以,能夠將測試重複度高,執行效率低的用例,經過UI自動化快速重複執行,達到提升測試效率的目的。html

2、Airtest簡介

目前主流的UI自動話測試工具主要有:Selenium, Appium和Airtest。其中Selenium是一款開源的Web應用自動化測試工具,它能夠直接運行在多種瀏覽器平臺,其支持的瀏覽器幾乎涵蓋了全部主流的瀏覽器,可是因爲得物是APP,不須要web端的測試,故這個工具被殘忍捨棄。而Appium和AirTest都是針對APP的自動化測試工具,均可以進行自動話測試腳本的錄製和回放。可是之因此選擇了AirTest最主要的緣由是他很容易生成測試腳本,即便測試人員不會編程,不懂腳本,也能夠經過正經常使用戶的點擊拖拽等操做,自動完成腳本的錄製,從而大幅度下降自動化維護成本。本人通過親身實踐,從UI自動化小白到第一個自動化測試腳本成功運行,用了半天時間,感興趣的同窗能夠嘗試一下。python

AirtestIDE 是一個跨平臺的UI自動化測試編輯器,適用於遊戲和App。它的特色以下:android

  • 自動化腳本錄製、一鍵回放、報告查看,垂手可得實現自動化測試流程支持。
  • 基於圖像識別的 Airtest 框架,適用於全部Android和Windows遊戲支持。
  • 基於UI控件搜索的 Poco 框架,適用於Unity3d,Cocos2d與Android App。
  • 可以運行在Windows和MacOS上。

架構圖
image (9).jpegweb

能夠看到,底層的主要測試框架是AirTest和Poco,兩者區別在於:編程

  • AirTest:基於Python的、跨平臺的UI自動化測試框架,基於圖像識別原理,適用於遊戲和APP。
  • Poco:基於UI控件搜索的自動化測試框架,其核心優點是除了對Android 和IOS以外,對遊戲也是支持的,同時也支持微信小程序、微信小遊戲和H5應用。

3、Airtset安裝和鏈接設備

    目前AirTestIDE 提供了Windows和Mac兩個版本的客戶端,請從官網下載,解壓即用。小程序

    不管是Android/IOS手機,仍是Windows窗口,在AirTest中都將它視爲一個設備。下邊重點介紹一下Android設備的鏈接。微信小程序

鏈接Android手機

經過ADB鏈接電腦和Android手機,ADB是Google官方提供的Android調試工具,AirTestIDE依賴ADB與安卓設備進行通訊。api

打開AirTestIDE,按照如下步驟進行鏈接:瀏覽器

1.打開手機設置-開發者選項-USB調試開關,參考安卓官方文檔微信

2.在AirTestIDE設備面板中點擊 refresh ADB 按鈕,查看鏈接上的設備;

3.若是沒有顯示出設備,試試restart ADB,若是還不行,參考FAQ文檔進行問題排查。

4.可以成功看到設備後,點擊對應設備的connect 按鈕,進行初始化。

鏈接成功後,便可在AirTestIDE中看到手機屏幕的鏡像顯示,並進行實時操做,以下圖所示:
image - 2021-06-11T181846.170.png

鏈接IOS手機

要鏈接一臺IOS手機,你須要準備好一臺安裝了Xcode的MAC電腦,鏈接方式參考文檔

4、錄製自動化腳本

在鏈接上設備之後,就能夠開始錄製自動化測試腳本了,在接下來的內容中,我將會在一臺Android手機上,給你們演示如何錄製腳本。

模擬輸入

AirTest支持經過圖像識別的方式,找到你想要的位置並進行操做,這是基於AirTest框架實現的。

咱們能夠先看看如何自動錄製腳本:點擊AirTestIDE左側的AirTest輔助窗上的「錄製」按鈕,而後隨着你在設備窗口上操做手機,代碼會自動生成在代碼窗口中。

錄製完成後,點擊「運行」,就能夠運行你的第一個自動化腳本了。
截屏2021-06-11 下午6.19.36.png

若是你以爲自動錄製生成的圖標不夠準確,還能夠點擊AirTest輔助窗上的 touch 按鈕,而後再設備窗口上框選精確的圖標,也能夠制動生成一條touch語句。以下:
https://www.qq.com/video/e325...

相似的模擬輸入操做還有滑動:點擊swipe按鈕,在設備窗口上框選精確的圖標最爲滑動起點,而後點擊滑動終點位置,即會自動生成一個swipe語句。

其餘的模擬輸入的API包括:

  • Text:文字輸入
  • KeyEvent:按鍵輸入,包括(HOME/BACK/MENU等)
  • Sleep:等待
  • Snapshot:截屏

斷言

到這裏,咱們已經有各類模擬輸入方法,配合邏輯控制語句讓手機動起來。自動化測試中還有很重要的一個步驟:結果驗證。咱們就能夠來看看怎樣聲明斷言。

(1)驗證UI界面

錄製方法與模擬輸入相似。

  • assert_exists:斷言圖片存在
  • assert_not_exists:斷言圖片不存在

(2)驗證數值

經過Poco獲取屬性值,手寫代碼進行斷言。

  • assert_equal:斷言箱單
  • assert_not_equal:斷言不等

例如
image (10).jpeg

查看測試報告

腳本運行完畢後,點擊「查看報告」那妞,會使用默認瀏覽器打開結果報告頁面,報告中將展現每個步驟的內容和實際執行過程的截圖、運行結果,方便查看步驟是否執行成功。
image - 2021-06-11T183346.186.png

image (12).jpeg

5、AirTest腳本介紹

AirTest是一款基於Python的,跨平臺的UI自動化測試框架,基於圖像識別原理,適用於遊戲和APP。雖然能夠藉助IDE提供的錄製功能快速的生成腳本,可是一般來講,熟練掌握Python語法可以幫助咱們寫出應用更普遍、更不容易出錯的腳本。

一個簡單的.air腳本解析

在下載解壓Airtest腳本的專屬IDE——AirtestIDE後,點擊「新建腳本」按鈕,默認便可建立一個後綴名爲.air的腳本文件,.air這是Airtest腳本的專屬後綴。

讓咱們打開剛纔新建腳本的文件夾,能夠看到實際上.air腳本文件是一個普通的文件夾,裏面附帶了一個同名的.py文件,AirtestIDE在執行腳本時,實際上執行的是裏面的.py文件。也就是說,Airtest腳本本質上還是Python腳本,遵循的是Python語法,咱們能夠根據實際須要自由地import其它Python第三方庫。

值得注意的是,.air文件夾中必需要有同名的.py文件,不然在命令行執行airtest run test.air這樣的運行指令時會致使失敗。

AirTest腳本示例

image (13).jpeg

初始化環境

首先,就像一個普通的Python腳本同樣,咱們須要在代碼文件的最開頭部分,寫上from airtest.core.api import *,將AirTest 的主要API都import進來,以便在後續腳本中使用這些API。

auto_setup是一用來初始化環境的接口,接口文檔在這裏,它接受4個參數,咱們能夠設置當前腳本所在的路徑、指定運行腳本的設備、設置默認的log路徑和設置腳本父路徑。

  • 若是auto_setup不傳入任何參數,AirTest將會讀取運行時命令行中傳入的各項參數,來對環境進行初始化。
  • 在AirTestIDE建立腳本時,默認生成的代碼裏是最簡單的初始化代碼auto_setup(__file__),意思是將腳本文件做爲腳本路徑傳入,其餘參數內容將默認讀取運行命令行傳入的參數。

腳本運行命令行有兩種形式,命令行中的參數包含device,log等:

  • 命令行運行AirTest腳本的示例:>airtest run untitled.air --device Android:///手機設備號 --log log。
  • 在使用AirTestIDE運行腳本時,會在"Log 查看窗"中自動生成一個可用的命令行,能夠供你們做爲參考。

模擬點擊

Airtest做爲自動化測試框架,模擬的是人的操做,常見的接口主要有:

  • Touch點擊某個位置,能夠設定被點擊的位置、次數、按住時長參數
  • Swipe從一個位置華東到另外一個位置
  • Text調用輸入法輸入指定內容
  • KeyEvent輸入某個按鍵響應,禮盒回車鍵、刪除鍵
  • Wait等待某個指定的圖片元素出現
  • Snapshot對當前畫面截一張圖
  • 其餘

核心API請參見文檔,在這個文檔頁裏出現的API都是跨平臺API,因爲咱們在代碼的第一行裏將airtest.core.api裏的接口所有import進來了,所以這些API能夠在代碼裏直接進行調用,像這樣:
image (14).jpeg
在不少接口中,支持傳入Template圖片對象做爲參數,在運行時將會去點擊圖片在畫面中的所在位置,相似這樣:
image (15).jpeg
其中,Template對象是一個圖片類,AirTest會先嚐試在當前畫面中找到匹配這張圖片的位置,若是找到了,將對這個座標進行點擊操做,若是找不到,就拋出識別異常。

斷言語句

斷言在單元測試代碼中很是重要,所以建議在咱們的腳本里使用斷言語句來斷定被測應用當前的漲停是不是咱們預期中的狀態。Airtest提供了assert_exists和assert_not_exists兩個接口,來斷言一張圖片存在或者不存在於當前畫面中。同時,還提供了assert_equal和assert_not_equal兩個語句,來斷言傳入的兩個值相等或者不相等。

如何在Python腳本中使用AirTest

AirTestIDE在建立新腳本時,也可以直接建立一個.py腳本文件,可是在建立以前會彈出一個設置窗口,要求填寫一些指定的參數。

在咱們瞭解過auto_setup接口後就會知道,這些參數就是爲了傳給它,而後初始化AirTest運行環境使用的。所以,一個純.py腳本的初始化代碼能夠是這樣的:
image (16).jpeg
上邊這段代碼的意思是說,當使用python xxx.py來運行本文件,且不帶任何命令行參數是,則自動使用auto_setup這個接口來對AirTest相關的參數進行初始化。這樣只須要在寫py腳本時,填好指定的參數就能直接用python xxx.py指令來運行腳本。

同時,原先傳統的airtest run xxx.air --devices Android: /// 命令行方式也不受影響,只要腳本檢測到傳入了命令行參數(即代碼中的 if not cli_setup()判斷),就依然優先使用命令行參數來初始化AirTest環境。

固然,熟練掌握API的各位,也能夠根據實際需求在本身的Python腳本中調用AirTest API,與使用正常的pyhton第三方庫方法相同。

6、總結

本文只是簡單講解了如何使用AirTest進行UI自動化腳本的錄製和回放,以及對自動化腳本進行了介紹。若是要進行UI自動化的持續集成,還須要進一步的瞭解和學習。

但願有時間的同窗能夠進行一些實踐,瞭解一下UI自動話相關的知識。在之後的工做中,咱們就能夠將測試重複度高,執行效率低的用例,經過UI自動化快速重複執行,以達到提升測試效率的目的。

此外,本文只是介紹了經過AirTest的框架進行圖像識別,編寫測試腳本,可是在某些特殊狀況下,例如對於遊戲或者APP裏的動態元素,經過圖像識別比較困難。AirTest還提供了另一種基於UI控件搜索的自動化框架Poco,同窗們能夠在下邊的文章中,進行學習和實踐。詳情請查看:https://edu.uwa4d.com/lesson-...

文|Lynne

關注得物技術,攜手走向技術的雲端

相關文章
相關標籤/搜索