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

如何统计并打印pytest fixture的累计耗时?

统计pytest Fixture累计耗时的方法

直接通过自定义pytest钩子函数就能实现fixture累计耗时的统计,不需要额外依赖,步骤如下:

自定义统计逻辑(写入conftest.py)

在你的测试项目根目录下的conftest.py中添加以下代码:

import time
from collections import defaultdict

# 用字典存储每个fixture的累计耗时与调用次数
fixture_performance = defaultdict(lambda: {"total_duration": 0.0, "call_count": 0})

def pytest_fixture_setup(fixturedef):
    # 记录fixture启动时间
    fixturedef._start_timestamp = time.perf_counter()

def pytest_fixture_post_finalizer(fixturedef):
    # 计算单次fixture执行耗时并累计
    elapsed = time.perf_counter() - fixturedef._start_timestamp
    fixture_name = fixturedef.argname
    fixture_performance[fixture_name]["total_duration"] += elapsed
    fixture_performance[fixture_name]["call_count"] += 1

def pytest_sessionfinish(session, exitstatus):
    # 测试结束后按总耗时降序输出统计结果
    print("\n=== Fixture 性能统计报告 ===")
    sorted_fixtures = sorted(
        fixture_performance.items(),
        key=lambda item: item[1]["total_duration"],
        reverse=True
    )
    for name, stats in sorted_fixtures:
        avg_duration = stats["total_duration"] / stats["call_count"]
        print(f"- {name}: 总耗时 {stats['total_duration']:.2f}s | 调用次数 {stats['call_count']} | 单次平均 {avg_duration:.2f}s")

效果说明

运行测试套件后,会在测试结束时自动打印所有fixture的累计耗时统计,按总耗时从高到低排序,帮你快速定位占比最高的fixture。如果需要过滤内置fixture(比如tmp_path、capsys),可以在pytest_fixture_post_finalizer中添加判断,比如只统计你自己定义的fixture:

# 在pytest_fixture_post_finalizer函数内添加
if fixturedef.module.__name__ == "your_custom_fixture_module":  # 替换成你的自定义fixture所在模块名
    # 执行累计逻辑

内容的提问来源于stack exchange,提问作者Martin Thoma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:59:57