首页 > 解决方案 > 有没有办法使用与 argparse 模块相同的语法向 pytest 添加自定义 CLI 参数?

问题描述

TLDR:

我想扩展 pytest 的 cli,我知道如何使用他们自己的 API 来完成,但我只是想知道是否有办法直接使用 argparse 模块(或至少它的语法),因为我已经拥有了所有我想为程序的另一部分添加以标准 argparse 模块的语法编写的 cli 参数。

完整问题:

我有大约 20 个 CLI(命令行界面)参数/标志/选项,我希望能够在标准 python 模块中以及通过调用 pytest 运行测试时接受这些参数/标志/选项。

我已经有了标准的 python 模块设置来接受我需要的所有 CLI 参数,使用 argparse 模块使用语法,如argparse 文档示例中所示:

# standard_python_module.py

import argparse

# Initialize argument
parser = argparse.ArgumentParser(description='Program Description.')
parser.add_argument('--my_int', metavar='INT', type=int, nargs='?', help='an integer', default=0)

# Parse/get value
args = parser.parse_args()
my_int = args.myint

我也知道您可以使用此处conftest.py描述的语法创建自定义的附加 CLI 参数以与 pytest 一起使用:

# conftest.py

import pytest

# Initialize argument
def pytest_addoption(parser):
    parser.addoption('--my_int', metavar='INT', type=int, nargs='?', help='an integer', default=0)

# Parse/get value
def setup(pytestconfig):
    my_int = pytestconfig.getoption("my_int")

对于使用 argparse 与 pytest 初始化/创建自定义 CLI 参数,我知道只有一个细微差别。解析:

parser.add_argument('--my_int', metavar='INT', type=int, nargs='?', help='an integer', default=0)

测试:

parser.addoption('--my_int', metavar='INT', type=int, nargs='?', help='an integer', default=0)

对于稍后解析/访问参数及其各自的值,会有更多的区别。我讨厌不得不再次重复几乎完全相同的代码来为 pytest 设置所有 20 个自定义 CLI 参数,而且我相信 pytest 现在在幕后使用 argparse,所以我想知道是否有一种能够重用代码的好方法我已经编写了使用 argparse 模块为 pytest 设置自定义 CLI 参数的 CLI 参数。如果还有一种方法可以重用解析/访问代码,那就太棒了!

我尝试conftest.py直接使用 argparse 模块,并以与标准 python 模块相同的方式执行所有操作,但这不适用于 pytest。我还使用了 allure 报告模块,它向 pytest 添加了自己的自定义 CLI 参数,当我使用上述方法时,它不再识别 allure 自定义 CLI 参数,可能是因为我正在重新定义/覆盖现有的 argparse CLI 参数集.

也许有一种方法可以访问 pytest 使用的底层 argparse.ArgumentParser 实例?

我还考虑过创建一个包装类来包装 pytest 解析器并添加一个与标准 argparse 函数同名的附加函数,它只是调用底层重命名函数,但我不完全确定如何实现它,而且没有解决稍后解析参数的问题。

可能相关链接: pytest Config 类文档 pytest Parser 类文档

标签: pythonpytestargparseconftest

解决方案


推荐阅读