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都打印出来了,就是很丑~
接下来我们引入日志~
不不不~
我们不用python自带的logging模块,我们今天介绍的是第三方库:Loguru
Loguru is a library which aims to bring enjoyable logging in Python.
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