You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:12:39