最简单的解决方案是更改回溯格式,例如pytest --tb=short 将省略打印测试函数 args。这也可以持久化在pytest.ini中,有效地修改了默认的pytest调用:
[pytest]
addopts = --tb=short
不过,您也可以通过扩展 pytest 来自定义输出。
从技术上讲,pytest 打印到终端的所有内容都包含在TestReport 中,因此您可以在测试完成后,但在打印失败摘要之前修改报告对象。示例代码,放在项目中的conftest.py 或测试根目录:
def pytest_runtest_logreport(report):
if report.longrepr is None:
return
for tb_repr, *_ in report.longrepr.chain:
for entry in tb_repr.reprentries:
if entry.reprfuncargs is not None:
args = entry.reprfuncargs.args
for idx, (name, value) in enumerate(args):
if name == "token":
args[idx] = (name, "********")
if entry.reprlocals is not None:
lines = entry.reprlocals.lines
for idx, line in enumerate(lines):
if line.startswith("token"):
lines[idx] = "token = '*********'"
虽然笨拙且未经测试,但这演示了该方法:获取存储在报告中的回溯信息,如果任何条目具有可用的reprfuncargs(这包含所有测试函数参数的值,包括固定装置),修改token存在时的价值。对reprlocals 执行相同操作(那些是记录帧的f_locals,并在您调用例如pytest --showlocals 时打印出来)。
现在运行测试时,您应该得到修改后的错误输出,如
===== FAILURES =====
_____ test_foo _____
token = ********
def test_foo(token):
> assert False
E assert False
pytest_runtest_logreport 挂钩用于在实际报告开始之前对在pytest_runtest_makereport 中创建的报告对象进行后处理。