pytest文档81 - 如何管理Captured logging日志

news2024/11/27 22:39:55

前言

pytest 自动捕获级别为 WARNING 或以上的日志消息,并以与捕获的 stdout 和 stderr 相同的方式在每个失败测试的各自部分中显示它们。

日志显示

当输入pytest命令,不带任何参数时

pytest

如果运行的用例没有报错,那么打印的内容很简洁

以下示例,当用例中有报错的时候

# content of test_sample.py
import pytest
import logging
log = logging.getLogger(__name__)


@pytest.fixture
def first():
    print('set up :first to do ...')


def inc(x):
    log.warning('function inc--------')
    return x + 1


def test_answer(first):
    assert inc(3) == 6


运行后日志

collected 1 item                                                                                           

case\test_sample.py F                                                                                [100%]

================================================ FAILURES =================================================
_______________________________________________ test_answer _______________________________________________

first = None

    def test_answer(first):
>       assert inc(3) == 6
E       assert 4 == 6
E        +  where 4 = inc(3)

case\test_sample.py:18: AssertionError
------------------------------------------ Captured stdout setup ------------------------------------------
set up :first to do ...
-------------------------------------------- Captured log call --------------------------------------------
WARNING  case.test_sample:test_sample.py:13 function inc--------
========================================= short test summary info =========================================
FAILED case/test_sample.py::test_answer - assert 4 == 6
============================================ 1 failed in 0.24s ============================================


默认情况下,每个捕获的日志消息都显示模块、行号、日志级别和消息。
如果需要,可以通过传递特定的格式选项将日志和日期格式指定给日志模块支持的任何内容:

pytest --log-format="%(asctime)s %(levelname)s %(message)s" --log-date-format="%Y-%m-%d %H:%M:%S"

加上log的格式后显示效果

--------------------------- Captured stdout setup ----------------------------
set up :first to do ...
----------------------------- Captured log call ------------------------------
2022-11-16 11:30:17 WARNING function inc--------
========================== short test summary info ===========================
FAILED case/test_sample.py::test_answer - assert 4 == 6

--log-format--log-date-format 也可以加到pytest.ini的配置文件

[pytest]
log_format = %(asctime)s %(levelname)s %(message)s
log_date_format = %Y-%m-%d %H:%M:%S

禁用捕获内容(stdout、stderr和log)

可以完全禁用对失败测试的捕获内容(stdout、stderr和log)的报告:

pytest --show-capture=no

禁用后就不再显示stdout、stderr和log

caplog 内置 fixture

在测试中,可以更改捕获的日志消息的日志级别。这由caplog fixture支撑:

def test_foo(caplog):
    caplog.set_level(logging.INFO)

默认情况下,级别在根记录器上设置,但为了方便起见,也可以设置任何记录器的日志级别

def test_foo(caplog):
    caplog.set_level(logging.CRITICAL, logger="root.baz")

测试结束时,将自动恢复设置的日志级别。

还可以使用上下文管理器临时更改with块内的日志级别:

def test_bar(caplog):
    with caplog.at_level(logging.INFO):
        pass

同样,默认情况下,根记录器的级别会受到影响,但任何记录器的级别都可以改为:

def test_bar(caplog):
    with caplog.at_level(logging.CRITICAL, logger="root.baz"):
        pass

最后,测试运行期间发送给记录器的所有日志都以两种日志的形式在设备上可用。LogRecord实例和最终日志文本。当您想断言消息内容时,这很有用:

def test_baz(caplog):
    func_under_test()
    for record in caplog.records:
        assert record.levelname != "CRITICAL"
    assert "wally" not in caplog.text

有关日志记录的所有可用属性,请参阅日志记录。LogRecord类。
如果您只想确保某些消息以给定的记录器名称记录,并具有给定的严重性和消息,您还可以使用record_tuples:

def test_foo(caplog):
    logging.getLogger().info("boo %s", "arg")

    assert caplog.record_tuples == [("root", logging.INFO, "boo arg")]

您可以调用caplog.clear()重置测试中捕获的日志记录:

def test_something_with_clearing_records(caplog):
    some_method_that_creates_log_records()
    caplog.clear()
    your_test_method()
    assert ["Foo"] == [rec.message for rec in caplog.records]

caplog.records 属性只包含当前阶段的记录,因此在setup阶段中,它只包含设置日志,与callteardown 阶段相同。

要从其他阶段访问日志,请使用caplog.get_records(when)方法。
例如,如果您希望确保使用某个固定装置的测试不会记录任何警告,您可以在拆卸过程中检查设置和调用阶段的记录,如下所示:

@pytest.fixture
def window(caplog):
    window = create_window()
    yield window
    for when in ("setup", "call"):
        messages = [
            x.message for x in caplog.get_records(when) if x.levelno == logging.WARNING
        ]
        if messages:
            pytest.fail(f"warning messages encountered during testing: {messages}")

完整的 API 参考 pytest.LogCaptureFixture https://docs.pytest.org/en/stable/reference/reference.html#pytest.LogCaptureFixture

实时日志

通过将log_cli配置选项设置为true,pytest将在日志记录直接发送到控制台时输出日志记录。

您可以通过传递--log-cli-level来指定日志记录的级别,对于该级别,具有相同或更高级别的日志记录将打印到控制台。
此设置接受日志记录文档中显示的日志记录级别名称或数值。此外,您还可以指定--log-cli-format--log-cli-date-format,如果没有提供,
这些格式将镜像并默认为--log-format--log-date-format,但仅应用于控制台日志处理程序。

还可以在配置INI文件中设置所有CLI日志选项。选项名称为:

log_cli_level

log_cli_format

log_cli_date_format

如果您需要记录对文件的整个测试套件日志调用,可以传递--log-file=/path/to/log/file
此日志文件以写模式打开,这意味着它将在每次运行测试会话时被覆盖。请注意,日志文件位置的相对路径(无论是在CLI上传递的还是在配置文件中声明的)始终相对于当前工作目录进行解析。

您还可以通过传递--logfile-level来指定日志文件的日志记录级别。此设置接受日志记录文档中显示的日志记录级别名称或数值。

此外,您还可以指定--log-file-format--log-file-date-format,它们等于--log-format--log-date-format ,但应用于日志文件日志处理程序。
也可以在配置INI文件中设置所有日志文件选项。选项名称为:

log_file

log_file_level

log_file_format

log_file_date_format

您可以调用set_log_path() t动态自定义log_file路径。该功能被认为是实验性的。

自定义颜色

如果启用彩色终端输出,则日志级别为彩色。通过add_color_level()支持更改默认颜色或在自定义日志级别上添加颜色。例子:

@pytest.hookimpl
def pytest_configure(config):
    logging_plugin = config.pluginmanager.get_plugin("logging-plugin")

    # Change color on existing log level
    logging_plugin.log_cli_handler.formatter.add_color_level(logging.INFO, "cyan")

    # Add color to a custom log level (a custom log level `SPAM` is already set up)
    logging_plugin.log_cli_handler.formatter.add_color_level(logging.SPAM, "blue")

Warning
This feature and its API are considered experimental and might change between releases without a deprecation notice.
警告
此特性及其API被认为是实验性的,可能会在不同版本之间进行更改,而不会发出弃用通知。

说明

这个特性是作为pytest-catchlog插件的替代品引入的,它们相互冲突。引入此功能时,与pytest-capturelog的向后兼容性API已被删除,因此如果出于此原因您仍然需要pytest-catchlog,您可以通过在pytest.ini中添加以下内容来禁用内部功能:

[pytest]
    addopts=-p no:logging

pytest 3.4中的不兼容更改

该功能在3.3中引入,在社区反馈后,在3.4中进行了一些不兼容的更改:

  • 除非Log_level配置或--log-level命令行选项明确请求,否则不再更改日志级别。这允许用户自己配置记录器对象。设置log_level将设置全局捕获的级别,因此如果特定测试需要的级别低于此级别,请使用caplog.set_level()功能,否则该测试将容易失败。
  • 实时日志现在在默认情况下被禁用,并且可以通过将log_cli 配置选项设置为true来启用。启用后,详细信息会增加,因此每个测试的日志记录都是可见的。
  • 实时日志现在被发送到sys.stdout ,不再需要-s命令行选项。

如果要部分恢复3.3版的日志记录行为,可以将以下选项添加到ini文件中:

[pytest]
log_cli=true
log_level=NOTSET

以上知识点来自官方文档https://docs.pytest.org/en/stable/how-to/logging.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

导出pdf高清

导出pdf高清 # 1.qq截图或者snipast截图 你可以qq 或者snipast软件截图。这两个软件截图都差不多。截图的时候你可以把pdf的图放到最大之后截图。到word里边调整尺寸。这样会清晰一些。 # 2.pdf编辑软件裁剪导出 这种方式最清晰 但是复杂点。 1.选择你要用的那个pdf 之后右键…

CIGS太阳能电池中的吸收

摘要 太阳能电池是可再生能源领域的一种基础技术。为了优化效率,大多数常见的设计使用薄膜结构和具有高吸收系数的介质——因为正是这种吸收的光能最终会转化为电流。基于铜铟硒化镓(CIGS)的太阳能电池,与基于其他材料的电池相比,它们可以变…

智能两轮电动车成消费新宠,利尔达电动车软硬件一体解决方案引领“智慧升级”

中国作为曾经的“自行车大国”,如今也是全球最大的两轮电动车生产和消费市场。两轮电动车承载着每日约7亿次的通勤需求,大约占据国人每天出行需求的1/4。 如今,在新消费场景需求的推动和新消费主力群体偏好的影响下,两轮电动车产品…

计算机毕业设计之java+ssm网上出差审批与费用报销系统

项目介绍 本课题是一个基于SSM的管理系统,本网上出差审批与费用报销系统是在Windows7系统的环境下,利用Eclipse和Mysql工具开发的。在网上出差审批与费用报销系统中分为管理员和普通用户2个模块。其中网上出差审批与费用报销系统中的管理人员在登陆之后…

Python遥感开发之arcpy批量投影栅格

Python遥感开发之arcpy批量投影栅格1.投影栅格2.ARCGIS实现3.python_arcpy实现投影栅格前言:主要介绍ARCGIS中的重投影,以及用python代码实现批量投影栅格。1.投影栅格 作用:将栅格数据从一个投影变换到另一个投影。 NEAREST 选项&#xff0…

贝加莱工控机维修主板维修5PC600.SX01-00常见故障排查

KRONES PC机维修贝加莱工控机维修5PC600.SX01-00,5PC600.FLRP-K ;贝加莱5PC600.SX05-00;5PC600.SX02-01等型号。 常见故障:工控机无显示、自检不过、卡机、触摸不灵、按键无法操作、与PLC通讯不上驱动器报过流过载、电压高、编码器错误 等。…

GIS Office国产基础软件,助力移动通信基础资源管理建设工程

万物互联,移动5G时代的蓬勃发展,为我们带来高速率、低时延、大连接的网络与通信体验,这离不开移动通信的基础资源管理建设工程。 面对种类繁多、设备资源管理要求极高且庞大的设备量,如何建立一个简单、高效的设备管理流程&#x…

Herodotus——无需bridge借助Storage proof实现的以太坊跨层数据访问

1. 引言 Herodotus——无需bridge借助Storage proof实现的以太坊跨层数据访问,为基于Starknet的State Verifier,开源代码见: https://github.com/HerodotusDev/herodotus-eth-starknet(Python&Cairo) Storage p…

底层程序员4年的逆袭之旅:穷屌丝-->小老板

我创业了 3年前立的flag,现在做到了我当时难以想象的程度,我自己一直激励我自己,要努力,要坚持!结果如何,交给老天!我离职了,结束了4年的前端职业生涯,比我想象的要快很…

前台自动化测试:基于敏捷测试驱动开发(TDD)的自动化测试原理

一、自动化测试概述 自动化测试主要应用到查询结果的自动化比较,把借助自动化把相同的数据库数据的相同查询条件查询到的结果同理想的数据进行自动化比较或者同已经保障的数据进行不同版本的自动化比较,减轻人为的重复验证测试。多用户并发操作需要自动…

构造函数原型prototype

一、原型prototype 构造函数通过原型分配的函数是所有对象所共享的。 JavaScript规定,每一个构造函数都有一个prototype属性,指向另一个对象,注意这个prototype就是个对象,这个对象的所有属性和方法,都会被构造函数所…

校园论坛网站设计设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

Kotlin高仿微信-第16篇-单聊-红包

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

【Pandas数据处理100例】(九十六):Pandas使用cumsum()函数计算某列的累计和

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

c#机器学习之opencv(1)-opencvsharp显示图片与边缘提取

目录Using块概念using 添加到局部变量声明。安装opencvsharp显示图片边缘检测Using块 概念 有时你的代码需要非托管的资源,如文件句柄、 COM 包装器或 SQL 连接。 一个Using块确保一个或多个此类资源的释放你的代码完成与之时。 这使它们可用于其他代码使用。 托管…

一个新公众号怎么吸粉?教你几招

都说万事开头难,但我不觉得啊,关键是要找对方法! 企业和品牌创建初期都会经历公众号启动期,一个新公众号必将会经历艰难的涨粉阶段。 想必下面这两种情况你也深有体会: 即使每天坚持更新,但是后台文章阅读…

迷宫问题(只有一条路径)【dfs 判断是否继续dfs 的三种方法】

dfs、bfs的迷宫问题1. 迷宫问题&#xff08;只有一条路径&#xff09;dfs迷宫问题总结&#xff1a;三种dfs判断法三&#xff1a;1. List<类> 存储过程节点2. dfs的返回值是 boolendfs的结构是 if(合法)if(走到节点)return true&#xff1b;法一&#xff1a;1. 两个数组&a…

腾讯云数据库SaaS致力于构建数据库分布式云,为更多更广的用户提供服务

大数据时代&#xff0c;数据库 SaaS 是企业实现降本增效和业务创新的重要抓手。在腾讯全球数字生态大会数据库 SaaS 专场上&#xff0c;腾讯云发布了多项数据库 SaaS 产品能力升级&#xff0c;并重点分享了其在上云、日常运维、数据库迁移等多方面的实践应用&#xff0c;为广大…

手把手教你实现一个防抖函数(debounce)

前言&#xff1a;防抖函数在日常开发中属于是一个非常非常重要的知识点。通常在一个项目的最开始构建的时候&#xff0c;都会在 utils文件夹下备上这样一个函数&#xff0c;来为以后做准备。 &#xff08;tips&#xff1a;utils 在大部分翻译软件内好像都叫跑龙套的&#xff0c…

<数据库视图>--数据库的“眼镜”(世界杯例题篇),查阅必备

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库干货铺 ⭐外模式—视图⭐ 文章目录⭐外模式---视图⭐一&#xff0c;概念提炼二&#xff0c;视图的创…