Pytest 记录日志输出到控制台和写入文件

目录

自定义日志记录器和内置的日志记录器

项目代码

 项目目录树

自定义日志记录器

函数源代码

pytest中定义和覆盖日志记录信息

使用cli定义Logging

使用pytest.ini定义Logging

修改单个测试级别的日志


日志输出的重要性不言而喻,不仅可以观测执行过程,更重要的是在发生bug时可以快速的定位到问题所在, Pytest 是出色的测试框架,但它不会自动显示 print 语句或日志的输出,这在尝试调试失败的测试或了解流程时可能会成为问题。同时也是支持设置日志级别,记录日志的到指定的文件

自定义日志记录器和内置的日志记录器

日志记录器的重要性在于可以随时设置不同级别的日志,python内置的日志记录器分类了5类的日志级别。标识日志的严重级别:

  • - 未设置 NOTSET(0):此级别捕获所有消息,无论其严重性如何。
  • - 调试 Debug(10):此级别用于任何可以帮助识别潜在问题的内容,例如变量值或程序执行的步骤。
  • - 信息 Infor(20):此级别用于确认事情是否按预期工作。
  • - 警告 Warning (30):此级别表示发生了意外情况,或者在不久的将来可能会出现一些问题(例如“磁盘空间不足”)。但是,该软件仍按预期工作。
  • - 错误 Error(40):此级别表示存在更严重的问题,导致软件无法执行某项功能。
  • - 严重 Critical(50):此级别表示一个非常严重的错误,可能会阻止程序继续运行。

自定义记录器允许您更方便地定义和处理这些级别,从而进一步提高记录过程的精度和控制。

基于以上的目标,本文旨在学习在python中设置 pytest 日志记录的过程。因此我们将探讨如何在 Pytest 中输出日志、如何禁用日志以及如何在单个测试级别更改日志级别。

项目代码

 项目目录树

temperature_convertor
├── requirements.txt
├── src
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-310.pyc
│   │   └── custom_logger.cpython-310.pyc
│   ├── custom_logger.py
│   └── temp_convertor.py
└── tests
    ├── __init__.py
    └── test_temp_convertor.py

运行环境:

% which python3
/usr/local/bin/python3
macOS 14.0

自定义日志记录器

我们使用了一个自定义记录器,配置为在级别显示日志消息。DEBUG通过创建自己的记录器,您可以控制记录器的行为,从而可以自定义它以满足您的特定要求。

src/custom_logger.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This module is ***
# @Time : 2024/6/9 10:25
# @Author :
# function :
# @File : custom_logger.py
import logging
from enum import Enum


class LogLevel(Enum):
    DEBUG = logging.DEBUG
    INFO = logging.INFO
    WARNING = logging.WARNING
    ERROR = logging.ERROR
    CRITICAL = logging.CRITICAL


def console_logger(name:str, level:LogLevel) -> logging.Logger:
    logger = logging.getLogger(f"__{name}__")
    logger.setLevel(level.value)

    # Create a console 
Pytest中,可以使用`-r`选项来输出测试结果的详细信息,包括测试结果、测试耗时、测试文件名等。你可以将这些信息重定向到一个日志文件中,并使用`-s`选项在终端上输出运行日志。 如果你想控制日志文件的大小,可以考虑使用Python内置的`RotatingFileHandler`类,该类可以在日志文件达到指定大小时自动滚动日志,以避免日志文件过大。 以下是一个示例代码,可以在Pytest中使用`RotatingFileHandler`类来控制日志文件大小: ```python import logging import pytest from logging.handlers import RotatingFileHandler # 定义日志文件路径 log_file = "test.log" log_path = "./logs" # 创建RotatingFileHandler对象,设置日志文件大小为10MB,保留最近3个日志文件 handler = RotatingFileHandler(filename=log_file, mode='a', maxBytes=10*1024*1024, backupCount=3) # 设置日志级别为INFO handler.setLevel(logging.INFO) # 定义日志格式 formatter = logging.Formatter('[%(asctime)s] %(levelname)s: %(message)s') handler.setFormatter(formatter) # 添加handler到root logger中 logging.getLogger('').addHandler(handler) def test_example(): logging.info("Running test example...") # 测试代码 assert 1 == 1 if __name__ == "__main__": # 运行pytest,并将日志输出控制台日志文件pytest.main(["-s", "-rA", "--log-file={}/{}".format(log_path, log_file)]) ``` 在这个示例中,我们创建了一个`RotatingFileHandler`对象,并将其添加到root logger中。然后,我们定义了一个测试函数`test_example()`,在其中使用`logging`模块写入日志信息。最后,我们使用Pytest运行测试,并将日志输出控制台日志文件中。你可以在`RotatingFileHandler`构造函数中根据需要调整`maxBytes``backupCount`参数来控制日志文件大小保留的日志文件数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值