如何在pytest中获取筛选后的测试数量以禁用耗时日志?
解决pytest筛选测试后动态控制日志的问题
你的核心问题是pytest_collection_modifyitems钩子执行时机过早——它在测试筛选(如-k、-m规则)生效前就已触发,因此无法获取最终要运行的测试数量。
正确的钩子选择:pytest_collection_finish
这个钩子会在测试收集完成且所有筛选规则应用后执行,此时可以通过session.items拿到最终要运行的测试列表,数量判断完全准确。
在conftest.py中添加以下代码:
import os def pytest_collection_finish(session): # 获取筛选后的测试总数 test_count = len(session.items) # 根据数量设置环境变量控制日志开关 if test_count > 100: os.environ["DISABLE_DATAFRAME_LOG"] = "1" else: # 确保环境变量被清理,避免影响后续运行 os.environ.pop("DISABLE_DATAFRAME_LOG", None)
在日志函数中应用开关
修改你的DataFrame日志函数,读取环境变量判断是否执行:
import os def log_dataframe(df): # 检查开关,若禁用则直接返回 if os.getenv("DISABLE_DATAFRAME_LOG") == "1": return # 原有的日志逻辑 print("Logging DataFrame...") # ...其他日志代码
替代方案:使用session级自动fixture
如果更习惯用fixture的方式,也可以定义一个session级的自动fixture来实现:
import pytest import os @pytest.fixture(scope="session", autouse=True) def dataframe_log_control(session): test_count = len(session.items) if test_count > 100: os.environ["DISABLE_DATAFRAME_LOG"] = "1" # 测试结束后清理环境变量 yield os.environ.pop("DISABLE_DATAFRAME_LOG", None)
这两种方法都能准确获取筛选后的测试数量,完美解决你用-k筛选少量测试时误禁用日志的问题。
内容的提问来源于stack exchange,提问作者Kashyap
相关产品推荐
相关产品推荐

