如何统计并打印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
相关产品推荐
相关产品推荐

