python+pytest介面自動化(16)-介面自動化專案中日誌的使用 (使用loguru模組)

給你一頁白紙發表於2022-05-17

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

相關文章