問題1:我們在運行測試用例的時候如何記錄測試的log,如何使用?
問題2:我寫的函數,為了方便log記錄,但是在pytest運行時,會兼容pytest且不會重復記錄,怎么解決?
1、pytest有內置的log功能,我們只需要配置使用即可。
配置方法:在項目根目錄下配置pytest.ini日志內容
[pytest] log_cli = true log_cli_level = INFO log_cli_format = %(asctime)s [%(levelname)8s] %(name)s:%(filename)s:%(lineno)d - %(message)s log_cli_date_format = %Y-%m-%d %H:%M:%S log_file = logs/pytest.log log_file_level = DEBUG log_file_format = %(asctime)s [%(levelname)8s] %(name)s:%(filename)s:%(lineno)d - %(message)s log_file_date_format = %Y-%m-%d %H:%M:%S
有了上訴配置,pytest運行時,就會將配置參數傳給log模塊,在代碼中直接使用即可。
2、在測試用例中如何使用?
在測試用例中,將日志模塊傳進去:caplog
class TestDemo:def test_log_capture(self,caplog):logging.debug("Debug message")res = add(1, 2)assert res == 3
然后直接調用logging相關的日志方法即可:示例
3、在非pytest環境運行時,如何使用log?
因為pytest有內置的log以及我們配置了相關參數,如果非pytest方式運行,我們就需要手動封裝一個log功能,且兼容log不會重復記錄。
代碼:
# -*- coding: utf-8 -*-
# @Time : 2025/7/19 22:39
# @Author : 夏槐
# @Motto : 遙遙領先,領先不止一點點
# @File : log_util.py
# @ide : PyCharm
# log_util.py
import logging
import sys
import os
from logging.handlers import RotatingFileHandler # 添加日志輪轉處理器def setup_logger(name=None):"""配置并返回一個日志記錄器參數:name (str): 記錄器名稱,通常使用 __name__返回:logging.Logger: 配置好的日志記錄器"""logger = logging.getLogger(name)# 檢查是否在 pytest 環境中運行if "pytest" in sys.modules:# pytest 會自動配置日志,無需額外設置logger.debug(f"在 pytest 環境中運行,使用 pytest 的日志配置")return logger# 如果不是在 pytest 環境中,配置基礎日志if not logger.handlers:# 創建格式化器formatter = logging.Formatter('%(asctime)s [%(levelname)8s] %(name)s %(filename)s:%(lineno)d - %(message)s',datefmt='%Y-%m-%d %H:%M:%S'
)# 創建控制臺處理器console_handler = logging.StreamHandler(sys.stdout)console_handler.setFormatter(formatter)# 創建日志目錄(如果不存在)log_dir = r"..\logs"os.makedirs(log_dir, exist_ok=True)# 創建文件處理器(添加日志文件支持)log_file = os.path.join(log_dir, "單獨調試.log")file_handler = RotatingFileHandler(log_file,maxBytes=10 * 1024 * 1024, # 10MBbackupCount=5,encoding='utf-8')file_handler.setFormatter(formatter)# 設置日志級別logger.setLevel(logging.DEBUG)console_handler.setLevel(logging.DEBUG)file_handler.setLevel(logging.INFO) # 文件日志級別設為INFO# 添加到記錄器logger.addHandler(console_handler)logger.addHandler(file_handler) # 添加文件處理器# 防止日志傳播到根記錄器logger.propagate = Falselogger.debug(f"初始化獨立日志記錄器: {name}")logger.info(f"日志文件保存在: {os.path.abspath(log_file)}")return logger
4、怎么使用?
一般測試case下面,還會封裝一些功能,這些功能基本就沒辦法使用log,我們上訴3中封裝了log之后,會檢測當前的運行環境,如果是pytest,就用pytest.ini的配置,否則就使用自定義的log配置,且log兼容pytest,下面給出示例:
這里的log就會單獨記錄在一個調試文件內。pytest運行這個add時,log就會保存在pytest.ini的文件路徑中。