Loguru

demo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from loguru import logger

# 添加log
logger.debug("That's it, beautiful and simple logging!")

# handler, 设置处理方式
logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")
logger.add("file_{time}.log")
# 写入文件方式
logger.add("file_1.log", rotation="500 MB")    # Automatically rotate too big file
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

# 类似 format 的格式
logger.info("If you're using Python {}, prefer {feature} of course!", 3.6, feature="f-strings")

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

# 支持 html 标签格式化
logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")

# 为 backtrace 异常调用栈,单独设置 log handler
logger.add("out.log", backtrace=True, diagnose=True)  # Caution, may leak sensitive data in prod

概念

Sink

参考:

Pytest

Exception assert

参考:

方法:

1
2
3
>>> import pytest
>>> with pytest.raises(ZeroDivisionError) as exe_info:
...    1/0

注意:

  1. 用于捕获单个 Exception

exception 文本匹配

解说:

  • 使用 match 关键字参数
  • 匹配对象

    • 文本
    • 正则
1
2
>>> with pytest.raises(ValueError, match=r'must be \d+$'):
...     raise ValueError("value must be 42")

直接传入函数和参数,不适用 with 语句

有参数

1
2
3
4
5
6
>>> def f(x): return 1/x
...
>>> raises(ZeroDivisionError, f, 0)
<ExceptionInfo ...>
>>> raises(ZeroDivisionError, f, x=0)
<ExceptionInfo ...>

无参数

1
2
>>> raises(ZeroDivisionError, lambda: 1/0)
<ExceptionInfo ...>

数据驱动

通过 csv 文件传入测试参数

参考: