ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pytest框架实战--2--print--loguru--封装

2022-07-08 00:32:54  阅读:165  来源: 互联网

标签:02 log loguru -- py print Pytest test logger


Pytest教程

Pytest框架中print的奇怪现象

test_02_01.py

"""
pytest 中print的使用
"""
from assertpy import assert_that
import pytest


# fun1为我们测试的函数:传一个参数自动+1
def fun1(x):
    """
    假如我们开发的时候不小心把1写成了0.1
    :param x:
    :return:
    """
    return x + 0.1


def test_fun1():
    print('这是失败的用例,这个print会打印')
    assert_that(fun1(10)).is_equal_to(11)


def test_fun2():
    print('这是成功的用例,这个print不会打印')
    assert_that(fun1(10)).is_instance_of(float)

我们在终端执行

pytest .\test_02_01.py

输出结果:

PS D:\code\pytest_test\test_2_day> pytest .\test_02_01.py
============================================================ test session starts 
        print('这是失败的用例,这个print会打印')
>       assert_that(fun1(10)).is_equal_to(11)
E       AssertionError: Expected <10.1> to be equal to <11>, but was not.

test_02_01.py:20: AssertionError
----------------------------------------------------------- Captured stdout call -----------------------------------------
这是失败的用例,这个print会打印
========================================================== short test summary info =======================================
FAILED test_02_01.py::test_fun1 - AssertionError: Expected <10.1> to be equal to <11>, but was not.
======================================================== 1 failed, 1 passed in 0.14s =====================================
PS D:\code\pytest_test\test_2_day>

可以看到---- Captured stdout call ---下面打印了这是失败的用例,这个print会打印,而没有打印出这是成功的用例,这个print不会打印

这里我们需要注意下test_fun1是失败用例test_fun2是一条执行成功的用例.所以总结一下:

若,用例执行结果为Pass,那用例中的print不会打印出来
若,用例执行结果为Fail,那用例中的print都会打印出来

如果我就是想打印出所有的print的呢?

我们在终端执行:

pytest .\test_02_01.py -s

输出结果:

PS D:\code\pytest_test\test_2_day> pytest .\test_02_01.py -s
============================================================ test session starts ==============================================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: D:\code\pytest_test\test_2_day
collected 2 items                                                                                                                             

test_02_01.py 这是失败的用例,这个print会打印
F这是成功的用例,这个print不会打印
.

================================================================= FAILURES ===================================================
_________________________________________________________________ test_fun1 ____________________________________________________

    def test_fun1():
        print('这是失败的用例,这个print会打印')
>       assert_that(fun1(10)).is_equal_to(11)
E       AssertionError: Expected <10.1> to be equal to <11>, but was not.

test_02_01.py:20: AssertionError
========================================================== short test summary info ============================================
FAILED test_02_01.py::test_fun1 - AssertionError: Expected <10.1> to be equal to <11>, but was not.
======================================================== 1 failed, 1 passed in 0.11s ==========================================
PS D:\code\pytest_test\test_2_day> 

这样我们的print都打印出来了,就是很丑~

接下来我们引入日志~

不不不~

Loguru第三方日志库

我们不用python自带的logging模块,我们今天介绍的是第三方库:Loguru

Loguru is a library which aims to bring enjoyable logging in Python.

安装logurn

pip install loguru

这次我们先创建一个mytest_02_02.py 消除pytest框架自动捕获test开头文件.

"""
loguru使用
"""
from assertpy import assert_that
from loguru import logger
import pytest
logger.debug('这是我第一次使用loguru')

输出结果:

2022-07-06 23:12:35.809 | DEBUG    | __main__:<module>:7 - 这是我第一次使用loguru

我瞌睡了,明天继续

今天我们继续loguru....

打印的日志存到文件中

创建一个mytest_02_03.py

from loguru import logger
logger.add("mytest.log", rotation="500 MB")  # 这样就创建了一个mytest.log文件,若文件大于500m就会重新存,并且下面log信息都存在文件中

# 下面功能自行理解啊
logger.add("file_2.log", rotation="12:00")     # New file is created each day at noon

logger.add("file_3.log", rotation="1 week")    # Once the file is too old, it's rotated

logger.add("file_X.log", retention="10 days")  # Cleanup after some time

logger.add("file_Y.log", compression="zip")    # Save some loved space

继续修改mytest_02_03.py

from loguru import logger

logger.add("mytest.log", rotation="500 MB")  # 这样就创建了一个mytest.log文件,若文件大于500m就会重新存,并且下面log信息都存在文件中


logger.info('这是一个info')  # 文件存储  终端会打印
logger.debug('这是一个debug')
logger.warning('这是一个warning')
logger.error('这是一个error')

继续:

Loguru favors the much more elegant and powerful {}formatting over%, logging functions are actually equivalent to str.format().

# loguru 支持自动字符串格式化
logger.info("If you're using Python {}, prefer {feature} of course!", 3.6, feature="f-strings")
# print就必须加上format
print("If you're using Python {}, prefer {feature} of course!".format(3.6, feature="f-strings"))

当我们的项目越来越大的时候我们的py文件机会很多,都会调用一个公共log模块,如果出错了我们就需要知道哪个文件\函数调用了:@logger.catch

继续修改mytest_02_03.py

from loguru import logger

logger.add("mytest.log", rotation="500 MB")  # 这样就创建了一个mytest.log文件,若文件大于500m就会重新存,并且下面log信息都存在文件中


@logger.catch
def my_function(x, y, z):
    # An error? It's caught anyway!
    return 1 / (x + y + z)


my_function(0, 0, 0) # 这样传参可定会报错误,我们看看输出

控制台输出:

2022-07-07 23:30:07.902 | ERROR    | __main__:<module>:16 - An error has been caught in function '<module>', process 'MainProcess' (16084), thread 'MainThread' (15688):
Traceback (most recent call last):

> File "D:\code\pytest_test\test_2_day\my_test_02_02.py", line 16, in <module>
    my_function(0, 0, 0)
    └ <function my_function at 0x0000019D1CCE4310>

  File "D:\code\pytest_test\test_2_day\my_test_02_02.py", line 13, in my_function
    return 1 / (x + y + z)
                │   │   └ 0
                │   └ 0
                └ 0

ZeroDivisionError: division by zero

Process finished with exit code 0

mytest.log文件中输出的结果:

2022-07-07 23:30:07.902 | ERROR    | __main__:<module>:16 - An error has been caught in function '<module>', process 'MainProcess' (16084), thread 'MainThread' (15688):
Traceback (most recent call last):

> File "D:\code\pytest_test\test_2_day\my_test_02_02.py", line 16, in <module>
    my_function(0, 0, 0)
    └ <function my_function at 0x0000019D1CCE4310>

  File "D:\code\pytest_test\test_2_day\my_test_02_02.py", line 13, in my_function
    return 1 / (x + y + z)
                │   │   └ 0
                │   └ 0
                └ 0

ZeroDivisionError: division by zero

好了,学废了吧~,我们接下来就要封装这个log功能方法了

我们在项目目录下面创建了一个:public_fun\log_fun.py名字随便起

from loguru import logger
import os


# 获取项目路径
def get_pro_path():
    pro_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    return pro_path


def get_logger():
    logger.add(os.path.join(get_pro_path(), "mytest.log"), rotation="500 MB")
    return logger


我们创建一个测试用例test_02_04.py

"""
loguru使用
"""
from public_fun.log_fun import get_logger
from assertpy import assert_that
logger = get_logger()


def test_fun1():
    logger.info('我需要比较1')
    assert_that(1).is_not_equal_to(1)

项目目录下面出现了mytest.log内容是

2022-07-07 23:48:06.382 | INFO | test_02_02:test_fun1:10 - 我需要比较1

这里自动的会带上调用他的文件\方法\行数.

真的是太棒了

如果过感觉不感到棒,请使用logging模块后再来看看

2022-07-07 23:51

标签:02,log,loguru,--,py,print,Pytest,test,logger
来源: https://www.cnblogs.com/tarzen213/p/16456725.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有