文章目录
- 前言
- 配置日志收集
- 验证日志收集
- 拓展-收集断言错误信息
- 拓展-动态生成日志文件
- 拓展-自定义封装日志收集类
前言
在
pytest
框架中,日志记录(logging)
是一个强大的功能,它允许我们在测试期间记录信息、警告、错误等,从而帮助调试和监控测试进度。
pytest
与Python
标准库中的logging
模块完美集成,因此你可以很容易地在pytest测试中使用日志记录。
配置日志收集
通过修改
pytest.ini
配置文件来配置日志记录。创建一个名为
pytest.ini
的文件在项目的根目录,并添加以下内容来配置日志记录:
[pytest]
;打印详细日志,相当于命令行加 -vs
addopts = --capture=no --tb=long
;日志开关 true/false
log_cli = true
;输出到终端
;日志级别
log_cli_level = info
;日志格式
log_cli_format = %(asctime)s --> %(filename)-10s [line:%(lineno)-3d] --> %(levelname)-5s --> %(message)s
;日志时间格式
log_cli_date_format = %Y-%m-%d %H:%M:%S
; 输出到文件
;日志文件位置
log_file = ./log/test.log
;日志文件等级
log_file_level = info
;日志文件格式
log_file_format = %(asctime)s --> %(filename)-10s [line:%(lineno)-3d] --> %(levelname)-5s --> %(message)s
;日志文件日期格式
log_file_date_format = %Y-%m-%d %H:%M:%S
验证日志收集
示例代码
import logging
import pytest
logger = logging.getLogger(__name__)
@pytest.mark.parametrize(argnames=["v1", "v2"], argvalues=[[1, 2], [2, 3], [3, 4]])
def test_case_01(v1, v2):
logger.info(f"断言:{v1} < {v2}")
assert v1 < v2, "断言失败"
执行结果
拓展-收集断言错误信息
利用
钩子函数
在测试用例执行结束阶段收集执行信息。在目标目录创建
conftest.py
配置文件
import json
import logging
def pytest_runtest_makereport(item, call):
if call.excinfo is not None:
msg = {
"module": item.location[0],
"function": item.name,
"line": item.location[1],
"message": str(call.excinfo.value).replace("\n", ":")
}
logging.error(json.dumps(msg, indent=4, ensure_ascii=False))
新增测试用例函数
import logging
import pytest
logger = logging.getLogger(__name__)
@pytest.mark.parametrize(argnames=["v1", "v2"], argvalues=[[1, 2], [2, 3], [3, 4]])
def test_case_01(v1, v2):
logger.info(f"断言:{v1} < {v2}")
assert v1 < v2, "断言失败"
def test_case_02():
logger.info(f"断言:1 == 2")
assert 1 == 2, "断言失败"
执行结果
拓展-动态生成日志文件
在
conftest.py
文件添加如下代码
import json
import logging
import os
from datetime import datetime
def pytest_runtest_makereport(item, call):
if call.excinfo is not None:
msg = {
"module": item.location[0],
"function": item.name,
"line": item.location[1],
"message": str(call.excinfo.value).replace("\n", ":")
}
logging.error(json.dumps(msg, indent=4, ensure_ascii=False))
# 动态生成log文件的名称,哪怕配置文件中配置了log_file选项也不会生效
def pytest_configure(config):
time_now = datetime.now().strftime('%Y_%m_%d_%H_%M_%S')
config.option.log_file = os.path.join(config.rootdir, 'log', f'{time_now}.log')
执行结果
拓展-自定义封装日志收集类
封装代码:Python 3 日志处理logging模块