如何从Pytest的request fixture中获取测试的开始时间
从pytest的request fixture提取测试开始时间
直接从request fixture本身无法获取测试开始时间,但可以通过conftest.py自定义fixture结合pytest钩子函数实现,无需修改命令行参数或依赖外部插件。
实现方案
1. 记录单个测试用例的开始时间
定义自动执行的函数级fixture,在测试启动时记录时间,还可同步计算耗时:
# conftest.py import pytest import time @pytest.fixture(scope="function", autouse=True) def record_test_start(request): test_start_time = time.time() # 将时间存入request自定义属性,方便后续调用 request._test_start_time = test_start_time print(f"\n测试 {request.node.name} 开始时间: {time.ctime(test_start_time)}") yield # 测试结束后计算耗时 test_end_time = time.time() print(f"测试 {request.node.name} 耗时: {test_end_time - test_start_time:.2f} 秒")
2. 在session级fixture中批量获取测试开始时间
结合pytest_runtest_setup钩子记录所有测试的启动时间,再在session级fixture中统一处理:
# conftest.py import pytest import time # 存储测试节点与对应开始时间的映射 test_start_map = {} def pytest_runtest_setup(item): # 测试执行前记录启动时间 test_start_map[item] = time.time() @pytest.fixture(scope='session', autouse=True) def make_report(request): yield # 所有测试完成后遍历输出开始时间 for test_item, start_time in test_start_map.items(): print(f"测试 {test_item.name} 开始时间: {time.ctime(start_time)}")
注意事项
request.node对应当前测试用例的节点对象,可获取测试名称、所属模块等信息- 自定义属性(如
request._test_start_time)建议加下划线前缀,避免与pytest内置属性冲突 - 若需要更友好的时间格式,可替换
time.ctime()为datetime模块的格式化方法
内容的提问来源于stack exchange,提问作者igor
相关产品推荐
相关产品推荐

