Airtest之全局變量

上期回顧:Airtest API精講之text()


以下基於
python3.8;airtestIDE1.2.11;airtest1.2.2;pocoui1.0.83

如同所有測試框架都有一個存放全局變量的地方,Airtest也有一個存在全局變量的地方:

# 文件位置:your_python_path/site-packages/airtest/core/settings.py
class Settings(object):
    DEBUG = False
    LOG_DIR = None
    LOG_FILE = "log.txt"
    RESIZE_METHOD = staticmethod(cocos_min_strategy)
    # keypoint matching: kaze/brisk/akaze/orb, contrib: sift/surf/brief
    CVSTRATEGY = ["mstpl", "tpl", "surf", "brisk"]
    if LooseVersion(cv2.__version__) > LooseVersion('3.4.2'):
        CVSTRATEGY = ["mstpl", "tpl", "sift", "brisk"]
    KEYPOINT_MATCHING_PREDICTION = True
    THRESHOLD = 0.7  # [0, 1]
    THRESHOLD_STRICT = None  # dedicated parameter for assert_exists
    OPDELAY = 0.1
    FIND_TIMEOUT = 20
    FIND_TIMEOUT_TMP = 3
    PROJECT_ROOT = os.environ.get("PROJECT_ROOT", "")  # for ``using`` other script
    SNAPSHOT_QUALITY = 10  # 1-100 https://pillow.readthedocs.io/en/5.1.x/handbook/image-file-formats.html#jpeg
    # Image compression size, e.g. 1200, means that the size of the screenshot does not exceed 1200*1200
    IMAGE_MAXSIZE = os.environ.get("IMAGE_MAXSIZE", None)
    SAVE_IMAGE = True

在之前的文章中,已經用過或講過少部分全局變量,在將來的文章中也會在用到的地方再次陳述。這裏我們簡單再說下比較典型的:

  • LOG_DIR和LOG_FILE:設置生成LOG的目錄和文件名,這個一般情況下我們就用默認的就好了,對Python不熟悉的話自定義設置後可能導致無法生成日誌和報告

  • RESIZE_METHOD:分辨率適配規則,用默認的即可。具體原理稍有複雜,引用官網原文:

在使用不同分辨率的設備進行圖像識別時,可能會導致識別成功率不佳,因此Airtest提供了默認的分辨率適配規則(使用的是Cocos引擎的默認縮放規則)http://docs.cocos.com/creator/manual/zh/ui/multi-resolution.html

想要提高2d遊戲的識別精度,最好的辦法就是明確指定你的遊戲的分辨率適配規則,例如,直接在.air腳本文件的開頭這樣寫:

from airtest.core.api import *

def custom_resize_method(w, h, sch_resolution, src_resolution):
    return int(w), int(h)

# 替換默認的RESIZE_METHOD
ST.RESIZE_METHOD = custom_resize_method

上面的代碼指定了一個自定義的縮放規則:直接return原來的值,不管屏幕分辨率,所有UI都不進行縮放(有的遊戲就是這種策略)。

這裏的RESIZE_METHOD,即我們定義的custom_resize_method使用的輸入參數爲:
w, h # 錄製下來的UI圖片的寬高
sch_resolution # 錄製時的屏幕分辨率
src_resolution # 回放時的屏幕分辨率

輸出爲:
回放時的UI圖片寬高

若要自定義你的RESIZE_METHOD,只需要知道你測試的遊戲的縮放規則,然後在custom_resize_method中用代碼實現即可。這樣做,能夠大大提升不同分辨率設備下的圖像識別成功率。

from airtest.core.settings import Settings as ST
ST.CVSTRATEGY = ["mstpl", "tpl"]
  • THRESHOLD:圖片識別的闕值。詳情可以看之前的文章Airtest-API精講之Template

  • OPDELAY:操作之間的間隔,保持默認就好。但如果你力求穩定,想讓每個操作之前多停一會,可以調大。

  • FIND_TIMEOUT和FIND_TIMEOUT_TMP:在Airtest源碼分析--圖像識別整體流程中我們講了,圖像識別是在一個指定時間內進行的,超時則認爲失敗。FIND_TIMEOUT和FIND_TIMEOUT_TMP分別爲長、短超時時間。
    使用FIND_TIMEOUT的接口有:assert_exists()、touch()、wait()、swipe() 等;
    使用FIND_TIMEOUT_TMP的接口有:assert_not_exists()、exists() 等。

    全局變量是在全局生效的,在一些接口中還可以自定義超時時間,如:

from airtest.core.settings import Settings as ST

# 設置全局的超時時長爲60s
ST.FIND_TIMEOUT = 60
ST.FIND_TIMEOUT_TMP = 60

# 設置單條wait語句的超時時長
wait(Template(r"tpl.png", record_pos=(-0.044, -0.177), resolution=(1080, 1920)),timeout=120)

 

from airtest.core.settings import Settings as ST

# PROJECT_ROOT需要填寫絕對路徑
ST.PROJECT_ROOT = "D:/test/user/project"
using("test1.air")
using("test2.air")

# 如不設置項目根目錄,我們可能要這麼調用test1.air、test2.air
using("D:/test/user/project/test1.air")
using("D:/test/user/project/test2.air")

 

  • SNAPSHOT_QUALITY和IMAGE_MAXSIZE:分別表示截圖精度和截圖大小,以用在報告中。Airtest核心API彙總 第12點snapshot中有詳細示例

  • SAVE_IMAGE:是否保存腳本運行過程中截圖。保存截圖會體現在報告中,以圖片顯示當時的截圖以及操作的點位,如:

from airtest.core.api import *

ST.SAVE_IMAGE = False  # 關閉截圖
touch((100, 100))  # 這條語句將不會保存當前畫面圖片

ST.SAVE_IMAGE = True  # 保存截圖
touch((100, 100))

生成報告後,第一個touch將沒有截圖,第二個touch會顯示截圖

第一個touch

第二個touch

注意:如果要修改全局變量並使其全局有效,記得一定要放在腳本的開頭。

 

---------------------------------------------------------------------------------

關注微信公衆號即可在手機上查閱,並可接收更多測試分享~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章