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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:27:13