• 跳至主要內容
  • 跳至主要資訊欄
  • 跳至頁尾
  • Python應用
    • Python基礎操作
    • Web
      • Django
      • Flask
    • Chat bot
      • Line Bot
      • Telegram Bot
    • GUI
      • QT5
    • Google API
      • Google Drive
      • Google Gmail
      • Google sheet
    • 網頁技術
      • WordPress
      • HTML
      • CSS
      • JavaScript
  • 基本測試技術
    • Linux
    • 功能測試
    • 使用者測試
    • 壓力測試
    • 封包測試
    • 測試報告撰寫
    • 編寫測試用例
  • 自動化測試技術
    • API 自動化測試
      • Python API 測試
      • Postman
      • Jmeter
    • UI 自動化測試
      • AirTest
      • Appium
      • Robot Framework
      • Selenium
  • 問題跟蹤系統
    • Jira
    • Redmine
  • CI/CD
    • Git
    • Jenkins
    • Docker
    • K8S
    • Ngrok
  • 資料庫
    • MongoDB
    • MySQL
    • PostgreSQL
    • Redis
  • 伺服器
    • Heroku
    • Linode
    • Cloudways
    • GCP
    • AWS
  • 關於我
測試先生

測試先生

提供測試相關領域的技術文章以及其他軟體技術相關文章,如WordPress,Js,Css,Html,Python,Docker,Kubernetes,devops,k8s,jenkins,git,heroku,line,telegram

目前位置: 首頁 / 自動化測試技術 / UI 自動化測試 / Appium / 【自動化測試 教學】Airtest Project 就算你不會寫程式也能快速上手!

【自動化測試 教學】Airtest Project 就算你不會寫程式也能快速上手!

文章更新日期: 2022 年 4 月 19 日

分享一個不錯的自動化測試工具給各位參考!

Airtest Project 這是一個輕鬆上手又方便的建立自動化腳本

編寫自動化時,可以配合Airtest Project 提供的 AirtestIDE編輯器快速寫腳本

內容目錄

  • Airtest Project 是什麼?
  • Airtest Project 適合用哪些平台?
  • Airtest Project 使用上難易度?
  • Airtest Project 如何操作使用?
    • Airtest
    • Poco
  • Airtest Project 架構
  • Airtest 測試報告樣式
  • 如何將多個AirTest 測試結果集合成一個報告?
  • 個人使用 Airtest Project 心得感想
  • 更多技術文章

Airtest Project 是什麼?

Airtest Project是一款由網易研發開發源的自動化測試框架,相比於其他的自動化測試框架,主要有兩個主要優勢:

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

Airtest Project 希望能夠通過一種所見即所得的方式完成腳本的錄製,即使測試人員不會編程不懂腳本,也可以通過正常用戶的點擊拖拽等操作,自動完成腳本的錄製,從而大幅度降低企業和項目的自動化維護成本。

  • 解決遊戲測試的痛點

Airtest Project希望能夠通過對遊戲的不同引擎做支持,成為一個真正意義上的跨引擎跨平台的自動化測試平台。

Airtest Project 適合用哪些平台?

不論是Game、Android、iOS、Web、Windows通通都適合使用!

個人目前是使用Android 操作上沒什麼大問題,非常實用!

Airtest Project 使用上難易度?

Airtest Pojrect 項目主要是基於Python語法,因此寫出來的腳本都是Python代碼

建議在使用前,可以先學習Python基本語法知識。

如果是第一次使用的話,官網有提供5分鐘上手自動化測試教學

編寫自動化時,可以配合Airtest Project 提供的 AirtestIDE編輯器快速寫腳本

自動化腳本主要是針對Airtest和Poco,都是基於Python語法

當然也可以使用自己喜歡的Python編輯器來寫腳本。

簡單操作、容易上手,透過錄製的方式輕鬆建立自動化測試腳本

Airtest 以及 Poco是什麼呢?後面會簡單介紹

Airtest Project 如何操作使用?

通過Airtest IDE跨平台的UI自動化測試編輯器,內置了Airtest和Poco的相關插件功能,能夠使用它快速簡單地寫Airtest和Poco代碼

airtest project
圖片來源:Airtest project

Airtest

基於Python的、跨平台的UI自動化測試框架,基於圖像識別原理,適用於遊戲和App。

透過左側的Airtest插件工具,透過錄製的方式,可以輕鬆擷取圖片

當執行到某程式碼時,會開始搜尋手機頁面,是否有截圖的圖片

如果圖片辨識率大於0.7時,就會認定PASS 進行程式碼的指令動作

0.7參數是可以進行修改,目前滿多遊戲類型都是透過unity包成Android

導致說有些元素是無法透過定位的方式取得,因此可以使用Airtest 圖片辨識的方式,來進行操作

airtest

Poco

基於同時UI控件搜索的自動化測試框架,核心優勢是除了Android、IOS之外,對遊戲支持的,也支持微信小程序、微信游戲和H5應用。

此功能就類似定位某個座標的方式進行,類似我寫的這篇工具查詢Android手機頁面元素【自動化測試 教學】 Macaca 透過 app-inspector 輕鬆獲取 Android 手機頁面資訊!

但這裡可以更快速地獲取到定位元素,只要透過左側的poco插件,錄製的方式進行,就可以快速將代碼呈現在中間給你看

只能說Airtest project真的挺強大的!

poco

Airtest Project 架構

簡單說明一下,我會使用到的部分,由上往下開始

目前雲測試平台暫時沒用到,主要使用AirtestIDE,進行錄製、調適運行以及透過IDE的輔助,讓我可以更快速的完成腳本製作

接著透過Airtest project內建提供的 Airtest, Poco的測試功能,可以快速地找出節點、等待條件以及判斷的結果

因次要透過UI定位的方式獲取APP相關的資訊,就如上面所說的使用圖匹配(Airtest)以及UI檢視(Poco)的方式,進行操作

最後就是看你用哪些平台進行測試,目前我是只有用到Android,如果未來有接觸到到其他平台的話,也會使用Airtest project來進行操作。

airtest project 架構
圖片來源:Airtest project

Airtest 測試報告樣式

測試報告有什麼好介紹的呢?

可以說大家都喜歡以結論為主,過程老闆是不會看的,大部分都只看結果

因此最後的測試報告顯示相當重要,再Airtest 測試報告有提供各種截圖的功能以及過程中操作錄製的影片

透過測試報告頁面顯示給你看,可以輕鬆地看出問題點以及操作到哪一個步驟導致Fail

image5

如何將多個AirTest 測試結果集合成一個報告?

原先Airtest Project 產生的報告,是不會統整的,只會將每一個跑完的測試腳本一個一個分開為不同的檔案給你

因此在閱讀上有些麻煩,所以我上網找的一些解法修改代碼,可以完成下方的報告顯示。

可針對執行結果有問題的部分,點擊對應的用例名稱進行查看,就會像上面那樣顯示。

image7

那如何整合AirTest跑出來的報告呢?提供以下代碼給各位參考

# runCase.py
from airtest.cli.runner import AirtestCase,run_script
import airtest.report.report as report
from conf.settings import *
from argparse import *
import shutil,os,io,jinja2,datetime
from lib.common import RetryFunc
from lib import video
from airtest.core.helper import device_platform
from airtest.core.api import auto_setup, log, connect_device


class CustomAirtestCase(AirtestCase):
    def __init__(self):
        super(CustomAirtestCase, self).__init__()

    def setUp(self):
        print("custom setup")
        # add var/function/class/.. to globals
        # self.scope["hunter"] = "i am hunter"
        # self.scope["add"] = lambda x: x+1
        # exec setup script
        super(CustomAirtestCase, self).setUp()

    def tearDown(self):
        print("custom tearDown")
        # exec teardown script
        super(CustomAirtestCase, self).tearDown()


    def run_air(self, air_dir, device):
        start_time = datetime.datetime.now()
        start_time_fmt = start_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]  # 取得現在的時間

        results = []  # 所有結果放置的地方
        root_log = log_path  # 執行腳本時,放log的位置

        # 判 log底下是否有任何資料,有的話就全部刪除,沒有的話就建立一個新的log資料夾
        # 目的是將執行過的記錄刪除掉
        if os.path.isdir(root_log):
            shutil.rmtree(root_log)
        else:
            os.makedirs(root_log)


        for file in os.listdir(air_path):
            if file.endswith(".air"):
                airName = file  # 腳本的名稱
                airDirName = file.replace(".air", "")  # 移除掉.air腳本名稱
                script = os.path.join(air_dir, file)  # 腳本的絕對路徑位置

                air_log = os.path.join(root_path,"log/" + airDirName)  # 建立預計放置腳本log資料夾

                # 判斷 腳本log資料夾是否有資料,有的話就全部刪除紀錄,建立對應的腳本log資料夾
                # 目的是將之前腳本執行產生的log相關資料刪除
                if os.path.isdir(air_log):
                    #print(air_log)
                    shutil.rmtree(air_log)
                else:
                    os.makedirs(air_log)

                html = os.path.join(air_log,"log.html")  # 每個腳本log轉成html絕對位置


                # 每個腳本執行時需要的參數, device代表對應的手機, log 代表存放的log位置, recording 代表執行過的程影片, script 代表要執行的腳本
                # language 顯示的語言 目前只有 zh 跟 en 其他語言要自己新增, compress 壓縮圖片(如果沒有加入這個參數會有錯誤問題)
                args = Namespace(device=device, log=air_log, recording=airDirName+".mp4", script=script, language="zh", compress=10)

                # 不錄製影片以及語言
                # args = Namespace(device=device, log=air_log, recording=None, script=script, compress=10)

                # 執行腳本
                try:
                    run_script(args, AirtestCase)
                except:
                    pass
                finally:
                    # 把執行腳本以及存放腳本log位置交給 LogToHtml去做處理
                    rpt = report.LogToHtml(script, air_log)

                    # log_template 代表預設的html範本, 會對應到我們要放置的html檔案
                    rpt.report("log_template.html", output_file=html)

                    # 將每個跑完腳本,取得名稱以及結果加入到 results list
                    result = {}
                    # result["name"] = airName.replace('.air', '')  # 原先的,但上面就有對應的參數
                    result["name"] = airDirName
                    result["result"] = rpt.test_result
                    results.append(result)

        # 取得跑完的結束時間
        end_time = datetime.datetime.now()
        end_time_fmt = end_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]

        # 獲取整體跑完的秒數
        duration = (end_time - start_time).seconds

        # 下方為開始建立整合的report報告
        # 透過 conf -> settings.py 做設定
        # template_path 代表 模板的路徑位置
        # template_name 代表 模板的名稱

        env = jinja2.Environment(
            loader=jinja2.FileSystemLoader(template_path),
            extensions=(),
            autoescape=True
        )

        template = env.get_template(template_name, template_path)

        project_name = root_path.split("/")[-1]  # 執行整體專案的名稱

        # 測試只有成功跟失敗,如果 res['result'] = True代表 成功 +1 沒有就代表 失敗 +1
        success = 0
        fail = 0
        for res in results:
            if res['result']:
                success += 1
            else:
                fail += 1

        
        report_name = "testReport_"+end_time.strftime("%Y%m%d_%H%M%S")+".html"  # 整合的測試報告名稱

        # 透過Html內的{{XXX}} 給予對應的參數顯示在報告內。
        html = template.render({"results": results,"device":device,"stime":start_time_fmt,'etime':end_time_fmt,'duration':duration,"project":project_name,"success":success,"fail":fail})
        
        # 輸出位置放置在 專案底下的 report資料夾內顯示 report_name.html報告
        output_file = os.path.join(root_path, "report" ,report_name)

        # 將 html的格式寫入到 output_file
        with io.open(output_file, 'w', encoding="utf-8") as f:
            f.write(html)
        print("測試完成")
        print("測試報告位置: {0}".format(output_file))

if __name__ == "__main__":
    for device in devices:
        test = CustomAirtestCase()
        test.run_air(air_path, device)

個人使用 Airtest Project 心得感想

如果你有用過Appium自動化架構轉換到AirTest自動化測試架構,會覺得差異非常大

因為AirTest大部分工具都幫你完成了許多功能,只需要拼拼湊湊就能搞定很多事情。

Airtest 透過辨識圖片可以算出符合當下看到的頁面與比對的圖片比例多少才算PASS

以及直接透過Poco透過點擊的方式,快速轉換成程式碼,編寫代碼時,減省很多的時間。

由於AirTest是透過錄製的方式進行,因為再執行某些功能的時候

行為有些相同,如果會編寫代碼的話,就不需要重新錄製直接套用,比較快速並且會比較好維護。

以上是我使用Airtest Project 心得想法。

備註:如果你有玩手遊想多開或是想到得到寶物需要十抽,你第一個角色就可以錄製到全部任務結束,就可以全部按照這個腳本去跑,省去滿多時間。

之後會陸續簡單編寫幾個簡單腳文章給各位參考使用!

文章內的程式碼都可以直接複製下來練習操作,或是直接套用到自己的專案都行!

多練習,對自已會有很大的幫助!

一回生二回熟,將所學習到內容變成自己的知識。

人就是要學習自己不會的事情,這樣才會不斷的成長、進步!

更多技術文章

透過下方按鈕找尋到相關的技術文章,希望可以幫助到正在學習的你

html 教學文章
Python 教學文章
Ngrok 教學
Jenkins 教學
WordPress 教學
Chatbot 教學

加入到我的粉絲專頁,不定期發布最新文章資訊!
有任何文章問題都可以詢問喔!

測試先生

文章分類: Appium 文章標籤: airtest, airtest project, airtestIDE, poco © 2021–2022

讀者互動方式

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

主要資訊欄

  • 電子郵件
  • Facebook
  • GitHub
  • LinkedIn
  • Airtest Project 是什麼?
  • Airtest Project 適合用哪些平台?
  • Airtest Project 使用上難易度?
  • Airtest Project 如何操作使用?
    • Airtest
    • Poco
  • Airtest Project 架構
  • Airtest 測試報告樣式
  • 如何將多個AirTest 測試結果集合成一個報告?
  • 個人使用 Airtest Project 心得感想
  • 更多技術文章

Footer

  • 隱私權政策
  • 免責聲明與使用條款
  • 聯絡我們
  • 電子郵件
  • Facebook
  • GitHub
  • LinkedIn

Copyright © 2022 · Magazine Pro on Genesis Framework · WordPress · 登入