Pytest----caplog的应用场景以及使用方法

news/2024/11/29 6:40:09/

【原文链接】Pytest----caplog的应用场景以及使用方法

文章目录

    • 如何在测试用例中设置日志级别
    • 如何对日志级别进行断言
    • 如何对日志内容进行断言
    • 如何同时对日志级别和日志内容进行断言

如何在测试用例中设置日志级别

通过caplog可以对特定的测试函数内设置日志级别,而不影响全局的日志级别,比如如下,首先在pytest.ini中开启实时日志。

[pytest]
log_cli = True

然后测试代码中test_demo和test_demo2中均打印debug、info、warning、error、critical级别的日志,不同的是在test_demo2中通过caplog临时将日志级别设置为debug级别,因为在默认情况下,日志级别为warning,因此根据理论分析,test_demo中的日志打印将采用默认的日志级别,即只会显示warning、error、critical级别的日志,而在test_demo2中由于临时将日志级别设置为debug,因此这里所有的日志都将显示处理。

import loggingdef test_demo():logging.debug("this is debug log ...")logging.info("this is info log ...")logging.warning("this is warning log ...")logging.error("this is error log ...")logging.critical("this is critical log ...")assert 1==1def test_demo2(caplog):caplog.set_level(logging.DEBUG)logging.debug("this is debug log ...")logging.info("this is info log ...")logging.warning("this is warning log ...")logging.error("this is error log ...")logging.critical("this is critical log ...")assert 1==1

执行结果如下,可以看出,在test_demo中只显示了warning、error、critical级别的日志,而在test_demo2中则所有的日志都显示出来了,即此时的日志级别已经通过caplog修改为debug级别了。

(demo-HCIhX0Hq) E:\demo>pytest
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
rootdir: E:\demo, configfile: pytest.ini
plugins: assume-2.4.3, rerunfailures-10.2
collected 2 itemstest_demo.py::test_demo
---------------------- live log call ----------------------
WARNING  root:test_demo.py:6 this is warning log ...
ERROR    root:test_demo.py:7 this is error log ...
CRITICAL root:test_demo.py:8 this is critical log ...
PASSED                                               [ 50%]
test_demo.py::test_demo2
---------------------- live log call ----------------------
DEBUG    root:test_demo.py:13 this is debug log ...
INFO     root:test_demo.py:14 this is info log ...
WARNING  root:test_demo.py:15 this is warning log ...
ERROR    root:test_demo.py:16 this is error log ...
CRITICAL root:test_demo.py:17 this is critical log ...
PASSED                                               [100%]==================== 2 passed in 0.03s ====================(demo-HCIhX0Hq) E:\demo>

如何对日志级别进行断言

caplog会将日志都记录在records属性中,这样一来就可以在测试脚本末尾,对当前测试脚本中产生的日志级别进行判断,比如脚本中可能存在当某些条件触发时写入error日志,而在脚本末尾则可以对日志级别进行断言,比如要求日志不能有error日志,则可以使用类似如下测试代码。

import loggingdef test_demo(caplog):logging.warning("this is warning log ...")logging.error("this is error log ...")logging.critical("this is critical log ...")for record in caplog.records:assert record.levelname != "ERROR"

执行结果如下,

(demo-HCIhX0Hq) E:\demo>pytest
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
rootdir: E:\demo, configfile: pytest.ini
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 itemtest_demo.py::test_demo
---------------------- live log call ----------------------
WARNING  root:test_demo.py:4 this is warning log ...
ERROR    root:test_demo.py:5 this is error log ...
CRITICAL root:test_demo.py:6 this is critical log ...
FAILED                                               [100%]======================== FAILURES =========================
________________________ test_demo ________________________caplog = <_pytest.logging.LogCaptureFixture object at 0x0000029BEF29C608>def test_demo(caplog):logging.warning("this is warning log ...")logging.error("this is error log ...")logging.critical("this is critical log ...")for record in caplog.records:
>           assert record.levelname != "ERROR"
E           assert 'ERROR' != 'ERROR'
E            +  where 'ERROR' = <LogRecord: root, 40, E:\demo\test_demo.py, 5, "this is error log ...">.levelnametest_demo.py:8: AssertionError
-------------------- Captured log call --------------------
WARNING  root:test_demo.py:4 this is warning log ...
ERROR    root:test_demo.py:5 this is error log ...
CRITICAL root:test_demo.py:6 this is critical log ...
================= short test summary info =================
FAILED test_demo.py::test_demo - assert 'ERROR' != 'ERROR'
==================== 1 failed in 0.08s ====================(demo-HCIhX0Hq) E:\demo>

如何对日志内容进行断言

caplog同样可以做到对日志的内容进行断言,比如如下测试代码,判断日志中是否有 error log 内容。即通过record的message即可获得日志的内容。

import loggingdef test_demo(caplog):logging.warning("this is warning log ...")logging.error("this is error log ...")logging.critical("this is critical log ...")for record in caplog.records:assert "error log" not in record.meesge

执行结果如下,可以看到断言错误,即日志中含有 error log 内容。

(demo-HCIhX0Hq) E:\demo>pytest -s
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
rootdir: E:\demo, configfile: pytest.ini
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 itemtest_demo.py::test_demo
---------------------- live log call ----------------------
WARNING  root:test_demo.py:4 this is warning log ...
ERROR    root:test_demo.py:5 this is error log ...
CRITICAL root:test_demo.py:6 this is critical log ...
FAILED======================== FAILURES =========================
________________________ test_demo ________________________caplog = <_pytest.logging.LogCaptureFixture object at 0x00000260C060D6C8>def test_demo(caplog):logging.warning("this is warning log ...")logging.error("this is error log ...")logging.critical("this is critical log ...")for record in caplog.records:
>           assert "error log" not in record.meesge
E           AttributeError: 'LogRecord' object has no attribute 'meesge'test_demo.py:8: AttributeError
-------------------- Captured log call --------------------
WARNING  root:test_demo.py:4 this is warning log ...
ERROR    root:test_demo.py:5 this is error log ...
CRITICAL root:test_demo.py:6 this is critical log ...
================= short test summary info =================
FAILED test_demo.py::test_demo - AttributeError: 'LogRecord' object has no attribute 'me...
==================== 1 failed in 0.08s ====================(demo-HCIhX0Hq) E:\demo>

如何同时对日志级别和日志内容进行断言

除此以外,caplog还可以对logger,日志级别,日志内容组成的元组进行判决,caplog.record_tuples 保存了所有logger、日志级别、日志内容组成的元组集合。
如下测试代码,这里有一点需要注意的是,当直接使用logging.xxx打印日志的时候,实际上使用的logger是root,这一点需要注意,若对python中logging有更深入的理解,比如定义自己的logger,则在此处就会很容易理解了。

import loggingdef test_demo(caplog):logging.warning("this is warning log ...")logging.error("this is error log ...")logging.critical("this is critical log ...")assert ("root",logging.ERROR,"this is error log ...") in caplog.record_tuples

执行结果如下,可以看到此时断言成功。

(demo-HCIhX0Hq) E:\demo>pytest
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
rootdir: E:\demo, configfile: pytest.ini
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 itemtest_demo.py::test_demo
---------------------- live log call ----------------------
WARNING  root:test_demo.py:4 this is warning log ...
ERROR    root:test_demo.py:5 this is error log ...
CRITICAL root:test_demo.py:6 this is critical log ...
PASSED                                               [100%]==================== 1 passed in 0.02s ====================(demo-HCIhX0Hq) E:\demo>

http://www.ppmy.cn/news/1953.html

相关文章

CentOS7一键安装OpenStack

环境 CentOS 7 CPU核心数&#xff1a;2x2 RAM&#xff1a;8G DISK&#xff1a;60G 问题说明 在安装openstack过程中&#xff0c;一直卡在下面过程&#xff1a; Testing if puppet apply is finished: 192.168.100.132_controller.pp [ | ]等待一会儿之后会报各种不同的错误…

获取鼠标在画布中的位置

获取鼠标在画布中的位置 效果展示 概述 本文讲解如何实现我们平时用的画布软件中&#xff0c;怎么获取的我们鼠标时刻在画布中的位置。 构建HTML框架 <body><div class"box"></div> </body>CSS样式 <style>.box {/* 设置盒子…

移除元素、分数到小数、整数转罗马数字

文章目录移除元素分数到小数整数转罗马数字移除元素 给你一个数组 nums_ 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val _的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地修改输入数组。 元…

STC 51单片机55——加速度计GY-29 ADXL345

//实现与VB模拟鼠标通信&#xff0c;但是噪声很大 //采用输出角度的方式&#xff0c;输出x与z的角度和y与z的角度 //在VB中将屏幕水平与垂直等分1800份&#xff08;角度*10得到的结果&#xff09; //*************************************** // GY-29 ADXL345 IIC测试程序 // …

KubeSphere开启DevOps 功能教程

基于 Jenkins 的 KubeSphere DevOps 系统是专为 Kubernetes 中的 CI/CD 工作流设计的&#xff0c;它提供了一站式的解决方案&#xff0c;帮助开发和运维团队用非常简单的方式构建、测试和发布应用到 Kubernetes。它还具有插件管理、Binary-to-Image (B2I)、Source-to-Image (S2…

01 初识HTML5

HTML5结构组成 HTML5主要是由标签组成的&#xff0c;如下代码就是HTML5的主要组成部分&#xff1a;<!DOCTYPE html> <!-- 文档声明标签&#xff0c;表示用html5解析 --> <html lang"zh-CN"> <!-- languangen 表示英文 “…

第42讲:MySQL数据库索引的基本使用规则以及在正确使用索引的方式

文章目录1.索引规则之最左前缀法则1.1.最左前缀法则的概念1.2.最左前缀法则的验证案例2.索引规则之范围查询3.使用索引时会导致索引失效的几种情况3.1.索引列使用运算导致索引失效3.2.索引列的值不加引号导致索引失效3.3.索引列模糊查询可能会导致索引失效3.4.OR连接条件使用不…

数据库分库分表方案

一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0c;进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是&#xff0c;可用数据库连接少甚至无连接可用。接下来就可以想象了吧&#xff08;并发…