自定义pytest命令行参数解析:分离--前后参数存至Fixture报错求助
自定义pytest命令行参数,通过
--分隔两组参数的实现方案 问题原因
你当前的代码里,pytest_load_initial_conftests钩子只是重新赋值了局部变量args,但没有修改early_config对象里的args属性——pytest最终还是会读取原始的完整命令行参数,导致--myarg被误当成测试文件/目录处理,触发错误。
修正方案:修改early_config.args
直接修改early_config的args属性,替换为处理后的参数即可。修正后的args_plugin.py代码如下:
import pytest from typing import List _test_args: List[str] = [] def _setup_args(args: List[str]): sep = "--" if sep in args: idx = args.index("--") global _test_args _test_args = args[idx + 1 :] return args[:idx] return args @pytest.hookimpl(hookwrapper=True) def pytest_load_initial_conftests(early_config, parser, args: List[str]): # 关键:修改early_config的args属性,替换为处理后的参数 early_config.args = _setup_args(args) print(_test_args, early_config.args) outcome = yield @pytest.fixture def cli_args() -> List[str]: return _test_args
运行测试命令:
PYTHONPATH=. pytest -p args_plugin -s . -- --myarg 10
此时会正确收集测试用例,cli_args fixture也能拿到['--myarg', '10']。
其他实现思路
思路1:用pytest原生addoption规范实现
通过pytest_addoption添加自定义选项,直接接收测试需要的参数,不需要手动处理分隔符:
# args_plugin.py import pytest from typing import List @pytest.hookimpl(tryfirst=True) def pytest_addoption(parser): parser.addoption("--test-args", nargs="*", help="传递给测试用例的自定义参数") @pytest.fixture def cli_args(request) -> List[str]: return request.config.getoption("--test-args") or []
使用方式:
pytest -s . --test-args --myarg 10
这种方式更贴合pytest的参数设计规范,用户使用起来更直观。
思路2:直接修改sys.argv
在pytest配置阶段直接修改sys.argv,提前剥离--后的参数:
# args_plugin.py import pytest import sys from typing import List _test_args: List[str] = [] def pytest_configure(config): global _test_args sep = "--" if sep in sys.argv: idx = sys.argv.index(sep) _test_args = sys.argv[idx+1:] sys.argv = sys.argv[:idx] @pytest.fixture def cli_args() -> List[str]: return _test_args
这种方式逻辑更直接,绕开pytest钩子的参数传递限制,在pytest启动前就完成参数处理。
内容的提问来源于stack exchange,提问作者Aravind Nujella
相关产品推荐
相关产品推荐

