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

如何通过pytest获取待执行测试用例及对应显式参数?

获取pytest待执行用例及对应参数的可行方法

方法1:利用pytest_itemcollected钩子实时输出

在项目根目录的conftest.py中添加以下代码,这个钩子会在每个测试用例被收集完成后触发,直接输出用例路径和对应参数:

def pytest_itemcollected(item):
    # 构建用例标识(文件路径::类名::方法名)
    case_id = item.nodeid
    # 判断是否存在参数化配置
    if hasattr(item, "callspec"):
        # 提取参数并格式化为可读性强的字符串
        param_info = ", ".join([f"{k}={repr(v)}" for k, v in item.callspec.params.items()])
        print(f"[待执行用例] {case_id} | 参数: {param_info}")
    else:
        print(f"[待执行用例] {case_id} | 无参数")

运行pytest时,不管是正常执行还是用--collect-only,都会输出完整的用例和参数信息。比如执行pytest --collect-only,就能看到所有待执行用例的参数。

方法2:在pytest_collection_modify_items钩子中获取参数

你之前尝试这个钩子没成功,大概率是没正确访问参数属性。修改钩子代码如下,直接遍历收集到的所有用例提取参数:

def pytest_collection_modify_items(items):
    print("\n=== 所有待执行测试用例及参数 ===")
    for idx, item in enumerate(items, 1):
        case_id = item.nodeid
        if hasattr(item, "callspec"):
            params = item.callspec.params
            param_str = ", ".join(f"{k}={v}" for k, v in params.items())
            print(f"{idx}. {case_id} | {param_str}")
        else:
            print(f"{idx}. {case_id} | 无参数")

执行pytest --collect-only时,这个钩子会在收集完成后统一输出所有用例和参数。

方法3:用pytest内部API批量收集并导出

如果需要将结果保存到文件或做进一步处理,可以写一个独立脚本,调用pytest的内部收集机制:

import pytest
from _pytest.config import Config
from _pytest.main import Session

def collect_and_export_cases():
    # 初始化pytest配置
    config = Config.from_args(["--collect-only", "-q"])
    # 创建会话并执行收集
    session = Session(config)
    session.perform_collect()

    # 整理结果
    case_list = []
    for item in session.items:
        case_info = {"case_id": item.nodeid}
        if hasattr(item, "callspec"):
            case_info["params"] = item.callspec.params
        else:
            case_info["params"] = None
        case_list.append(case_info)

    # 输出到控制台
    print("\n=== 待执行测试用例列表 ===")
    for case in case_list:
        param_str = ", ".join(f"{k}={v}" for k, v in case["params"].items()) if case["params"] else "无参数"
        print(f"{case['case_id']} | {param_str}")

    # 可选:写入JSON文件
    # import json
    # with open("test_cases.json", "w", encoding="utf-8") as f:
    #     json.dump(case_list, f, ensure_ascii=False, indent=2)

if __name__ == "__main__":
    collect_and_export_cases()

运行这个脚本,就能直接获取所有待执行用例和参数,还可以轻松导出为JSON等格式。

注意事项

  • 以上方法支持@pytest.mark.parametrize和fixture参数化的用例,都能正确提取参数。
  • 如果用例路径包含特殊字符,item.nodeid会自动处理转义,无需额外操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:07:46