通過上篇文章日誌管理模組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
模組簡單得不可以思議。