python+pytest介面自動化(16)-介面自動化專案中日誌的使用 (使用loguru模組)
通過上篇文章日誌管理模組loguru簡介,我們已經知道了loguru
日誌記錄模組的簡單使用。在自動化測試專案中,一般都需要通過記錄日誌的方式來確定專案執行的狀態及結果,以方便定位問題。
這篇文章我們使用loguru
模組來記錄介面自動化測試中的日誌。
一,封裝日誌記錄器
實際專案中,我們不可能每個模組都去匯入loguru
模組,每個模組都單獨去寫一遍日誌配置,這樣麻煩又冗餘。
最好的方式是針對專案單獨封裝、配置一個日誌記錄模組,作為公共的日誌記錄器,這既其他模組進行呼叫,也方便維護。
在loggerController.py
中封裝的日誌記錄器,程式碼及註釋示例如下:
# @time: 2022-04-05 # @author: 給你一頁白紙 # 微信公眾號:測試上分之路 from loguru import logger from datetime import datetime class ApiAutoLog(): ''' 利用loguru封裝介面自動化專案日誌記錄器 ''' def __new__(cls, *args, **kwargs): log_name = datetime.now().strftime("%Y-%m-%d") # 以時間命名日誌檔案,格式為"年-月-日" sink = "../log/{}.log".format(log_name) # 日誌記錄檔案路徑 level = "DEBUG" # 記錄的最低日誌級別為DEBUG encoding = "utf-8" # 寫入日誌檔案時編碼格式為utf-8 enqueue = True # 多執行緒多程序時保證執行緒安全 rotation = "500MB" # 日誌檔案最大為500MB,超過則新建檔案記錄日誌 retention = "1 week" # 日誌保留時長為一星期,超時則清除 logger.add( sink=sink, level=level, encoding=encoding, enqueue=enqueue, rotation=rotation, retention=retention ) return logger log = ApiAutoLog() if __name__ == '__main__': log.debug("這是一條debug日誌資訊") log.info("這是一條info日誌資訊") log.warning("這是一條warning日誌資訊") log.critical("這是一條critical日誌資訊")
這樣,在別的地方需要記錄日誌時,只需匯入該模組即可使用,且當天的日誌會記錄在以指定時間格式命名的.log
檔案裡,如2022-04-05.log
。
接下來我們通過呼叫該日誌記錄器來記錄日誌。
二,呼叫日誌記錄器記錄日誌
1. 明確介面自動化需要記錄哪些日誌
在做介面自動化時,我們首先需要確定測試用例需要記錄哪些資訊,換句話說,記錄哪些日誌才有意義?
-
為了清晰地定位執行了哪條用例,執行時測試用例名稱需要記錄在日誌資訊裡。
-
介面的請求引數與返回引數必須記錄在日誌裡,方便定位介面問題。
總之,博主認為,在介面自動化測試中,日誌主要記錄執行某條用例時對應的請求引數與返回引數
即可,當然也可以更細化,這裡不做過多說明。
2. 用例中記錄日誌示例
在明確了測試用例中需記錄哪些日誌資訊後,我們用封裝好的日誌記錄器去記錄測試用例執行時的日誌。
測試用例模組test_log.py
中加入日誌記錄程式碼,示例如下:
# @time: 2022-04-05 # @author: 給你一頁白紙 # 微信公眾號:測試上分之路 import requests import pytest import json # 匯入封裝好的日誌記錄器 from tools.loggerController import log # 測試類,僅為示例 class TestLogDemo: '''get請求''' def test_get_weather_normal(self): '''校驗百度天氣查詢介面''' url = "https://weathernew.pae.baidu.com/weathernew/pc" params = { "query": "浙江杭州天氣", "srcid": 4982 } log.info("請求引數為:{}, {}".format(url, params)) res = requests.get(url=url, params=params) log.info("返回結果為:{}".format(res.text)) assert res.status_code == 200 assert "window.tplData" in res.text # 測試函式,post請求 def test_login_normal(): '''正確使用者名稱、正確密碼登入''' url = "http://127.0.0.1:5000/login" headers = {"Content-Type": "application/json;charset=utf8"} data = { "username": "AndyLiu", "password": "123456" } log.info("請求引數為:{}, {}, {}".format(url, headers, data)) res = requests.post(url=url, json=data, headers=headers) log.info("返回結果為:{}".format(res.text)) # 斷言 assert res.status_code == 200 assert json.loads(res.text)["token"] if __name__ == '__main__': pytest.main()
用例test_get_weather_normal
即請求查詢天氣介面。用例test_login_normal
查詢的是自定義介面,該介面構造比較簡單,學習過程中沒有可用於請求除錯的介面,則可以參考文章使用Flask開發簡單介面自己開發簡單介面。
接下來我們來執行該測試模組test_log.py
,結果如下:
用例test_get_weather_normal
返回的結果是一大串html文件內容。用例test_login_normal
顯示在日誌檔案的最後面,如下所示:
從結果可以看出來,日誌檔案中記錄的日誌非常清晰,且使用loguru
預設的format
格式時,會自動記錄日誌對應的函式名、方法名。
三,總結
最後我們一起來做個總結,如下:
-
在實際專案中需要自己封裝相應配置的日誌記錄器用於公共呼叫,而不是每個模組單獨配置使用
loguru
或者logging
。 -
我們要先明確自動化專案執行過程中需要哪些資訊需要記錄,然後再在程式碼中記錄對應的內容。
-
相對於python自帶的
logging
模組,我們進一步看到了loguru
模組簡單得不可以思議。