Airtest API精講之報告日誌log()

上期回顧:Airtest API精講之斷言


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

log()用於將日誌顯示在Airtest HTML報告中,我們可以主動調用記錄日誌,Airtest自身也會調用log()記錄執行日誌。

源碼解析

先來看看源碼(不想看源碼的可以直接跳到後面的演示實例):

# 文件位置:your_python_path/site-packages/airtest/core/helper.py
def log(arg, timestamp=None, desc="", snapshot=False):
    from airtest.core.cv import try_log_screen
    if G.LOGGER:
        depth = 0
        if snapshot:
            # 如果指定了snapshot參數,強制保存一張圖片
            save_image = ST.SAVE_IMAGE
            ST.SAVE_IMAGE = True
            try:
                try_log_screen(depth=2)
            except AttributeError:
                # if G.DEVICE is None
                pass
            else:
                depth = 1
            finally:
                ST.SAVE_IMAGE = save_image
        if isinstance(arg, Exception):
            if hasattr(arg, "__traceback__"):
                # in PY3, arg.__traceback__ is traceback object
                trace_msg = ''.join(traceback.format_exception(type(arg), arg, arg.__traceback__))
            else:
                trace_msg = arg.message  # PY2
            G.LOGGER.log("info", {
                    "name": desc or arg.__class__.__name__,
                    "traceback": trace_msg,
                }, depth=depth, timestamp=timestamp)
            G.LOGGING.error(trace_msg)
        elif isinstance(arg, six.string_types):
            # 普通文本log內容放在"log"裏,如果有trace內容放在"traceback"裏
            # 在報告中,假如"traceback"有內容,將會被識別爲報錯,這個步驟會被判定爲不通過
            G.LOGGER.log("info", {"name": desc or arg, "traceback": None, "log": arg}, depth=depth, timestamp=timestamp)
            G.LOGGING.info(arg)
        else:
            G.LOGGER.log("info", {"name": desc or repr(arg), "traceback": None, "log": repr(arg)}, depth=depth,
                         timestamp=timestamp)
            G.LOGGING.info(repr(arg))

參數:
arg:要記錄的信息,顯示在報告右側。
timestamp:自定義該條log的時間,默認爲time.time()。一般情況下我們就用默認值就好,所以可以忽略此參數。
desc:自定義log標題,默認與arg相同,顯示在報告左側。
snapshot:是否截屏,方便查看當時設備的情況。

源碼很簡單,先判斷是否截圖,是的話就截一張圖;
之後判斷arg是不是報錯信息,是的話走記錄報錯的邏輯;
之後判斷是普通文本走普通信息的邏輯(也就是我們要用到的情況);否則走特殊類型邏輯。
我們一般用到的就是普通信息的邏輯,這所以log()源碼這麼多種情況,是因爲Airtest內部生成各種日誌也會用到。

實例演示

# 例1:最典型的應用
log("開始執行用例")

# 例2:把json數據存到日誌中
# 假設已經將json轉爲了字典
dic = {"q":"測試工程師小站","p":False,"g":[{"type":"sug","sa":"s_1","q":"一個測試工程師"},{"type":"sug","sa":"s_2","q":"測試開發工程師"},{"type":"sug","sa":"s_3","q":"測試技術工程師"},],"slid":"1536329420958301","queryid":"0x7c62fdc7d"}
log(dic, desc="請求返回的數據")

# 例3:異常時使用
# 正常應該找到"測試工程師小站",找不到時記錄日誌並截圖
if poco("測試工程師小站").wait():
    poco("測試工程師小站").click()
else:
    log("未找到測試工程師小站", snapshot=True)

 

我們看下最後生成的報告:
例1:就是普通的一個信息的記錄

 

 

例2:左側顯示描述,右側記錄了詳細的數據

 

 

例3:因爲元素是亂寫的,肯定不存在,所以記錄信息的同時截屏

 

 

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

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

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