Я опубликую свое текущее работающее решение здесь:
в файле utils.py Я определяю функцию param
:
def param(name, default_value):
parser = argparse.ArgumentParser()
parser.add_argument("--param", action="store")
args, unknown = parser.parse_known_args()
try:
if args.param:
for p_name, p_value in (param.split("=") for param in args.param.split(";")):
if p_name == name:
return p_name, ast.literal_eval(p_value)
except (SyntaxError, ValueError):
raise RuntimeError(
"Wrong parameter definition: %r, must be 'name1=<expr>;name2=<expr>;..'"
% args.param)
return name, default_value
, которая можетиспользовать следующим образом:
import pytest
from util import param
@pytest.mark.parametrize(*param("bar", [1, 2, 3]))
def test_foo(bar, env_type):
print("param: ", "bar", bar)
assert bar < 7
Теперь вызов pytest может выглядеть следующим образом:
pytest --param "bar=[5,6,7];unused=range(5)"
в conftest.py
Теперь я должен добавить также аргумент param
- в противном случаеВозникает исключение, когда я определяю параметры в командной строке:
def pytest_addoption(parser):
parser.addoption("--param", action="store", help="overwrite test parameters")
Сверху: это работает:)
Недостаток: это уродливый обходной путь, param()
не может быть определен внутри conftest.py