Pytest:查找每个测试何时开始和结束
Pytest: Finding when each test started and ended
我有一个复杂的 Django-Pytest 测试套件,其中包含许多 运行 并行处理的测试。我想查看每个测试开始和结束的确切时间点。我怎样才能从 Pytest 中获取这些信息?
每个调用阶段的 start/stop 时间戳存储在 CallInfo
对象中。但是,访问它们以进行报告并不是很方便,因此最好将这两个时间戳都存储在报告对象中。将以下代码放入 project/test 根目录的 conftest.py
文件中:
import pytest
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
report.start = call.start
report.stop = call.stop
现在您已将每个报告增强 start/stop 次,按照您需要的方式处理它们,例如在测试执行后将它们打印在自定义部分中。通过以下方式增强您的 conftest.py
文件:
def pytest_terminal_summary(terminalreporter):
terminalreporter.ensure_newline()
terminalreporter.section('start/stop times', sep='-', bold=True)
for stat in terminalreporter.stats.values():
for report in stat:
if report.when == 'call':
start = datetime.fromtimestamp(report.start)
stop = datetime.fromtimestamp(report.stop)
terminalreporter.write_line(f'{report.nodeid:20}: {start:%Y-%m-%d %H:%M:%S} - {stop:%Y-%m-%d %H:%M:%S}')
示例测试的测试执行
def test_spam():
time.sleep(1)
def test_eggs():
time.sleep(2)
现在产量:
test_spam.py .. [100%]
------------------------------ start/stop times -------------------------------
test_spam.py::test_spam: 2020-04-26 13:29:05 - 2020-04-26 13:29:06
test_spam.py::test_eggs: 2020-04-26 13:29:06 - 2020-04-26 13:29:08
============================== 2 passed in 3.03s ==============================
注意上面的pytest_terminal_summary
hookimpl例子,我只打印了call
阶段的时间(测试函数的执行次数)。如果您想查看或包含测试 setup/teardown 阶段的时间戳,请分别使用 report.when == 'setup'
/report.when == 'teardown'
按报告对象过滤 terminalreporter.stats
。
我有一个复杂的 Django-Pytest 测试套件,其中包含许多 运行 并行处理的测试。我想查看每个测试开始和结束的确切时间点。我怎样才能从 Pytest 中获取这些信息?
每个调用阶段的 start/stop 时间戳存储在 CallInfo
对象中。但是,访问它们以进行报告并不是很方便,因此最好将这两个时间戳都存储在报告对象中。将以下代码放入 project/test 根目录的 conftest.py
文件中:
import pytest
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
report.start = call.start
report.stop = call.stop
现在您已将每个报告增强 start/stop 次,按照您需要的方式处理它们,例如在测试执行后将它们打印在自定义部分中。通过以下方式增强您的 conftest.py
文件:
def pytest_terminal_summary(terminalreporter):
terminalreporter.ensure_newline()
terminalreporter.section('start/stop times', sep='-', bold=True)
for stat in terminalreporter.stats.values():
for report in stat:
if report.when == 'call':
start = datetime.fromtimestamp(report.start)
stop = datetime.fromtimestamp(report.stop)
terminalreporter.write_line(f'{report.nodeid:20}: {start:%Y-%m-%d %H:%M:%S} - {stop:%Y-%m-%d %H:%M:%S}')
示例测试的测试执行
def test_spam():
time.sleep(1)
def test_eggs():
time.sleep(2)
现在产量:
test_spam.py .. [100%]
------------------------------ start/stop times -------------------------------
test_spam.py::test_spam: 2020-04-26 13:29:05 - 2020-04-26 13:29:06
test_spam.py::test_eggs: 2020-04-26 13:29:06 - 2020-04-26 13:29:08
============================== 2 passed in 3.03s ==============================
注意上面的pytest_terminal_summary
hookimpl例子,我只打印了call
阶段的时间(测试函数的执行次数)。如果您想查看或包含测试 setup/teardown 阶段的时间戳,请分别使用 report.when == 'setup'
/report.when == 'teardown'
按报告对象过滤 terminalreporter.stats
。