В pytest можно ли получить доступ к аргументам командной строки в параметризаторах декораторов? - PullRequest
1 голос
/ 01 июля 2019

Представьте определение игрушечного теста:

@pytest.mark.parametrize("bar", [1, 2, 3])
def test_foo(bar):
    assert some_result(bar)

Теперь я хочу предоставить bar в командной строке.Насколько я знаю, это еще не встроено в Py.Test:

pytest --param "bar=7"

И напишите определение моего тестового параметра следующим образом:

@pytest.mark.parametrize(*from_args_if_available("bar", [1, 2, 3]))
def test_foo(bar):
    assert some_result(bar)

I can реализовать from_args_if_available() повторный анализ всех аргументов командной строки и, конечно, поиск --params.Другим способом было бы сделать request.config доступным глобально (что было бы некрасиво).

Интересно, возможно ли получить доступ к элементу request.config из любого места, чтобы все определения параметров командной строки были в одном месте?(и, следовательно, справка).

Так есть ли другой способ получить доступ к параметрам проанализированной командной строки, которые я могу использовать описанным способом?

1 Ответ

0 голосов
/ 01 июля 2019

Я опубликую свое текущее работающее решение здесь:

в файле 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...