在pytest中是否可以在参数装饰器中访问命令行参数?

时间:2019-07-01 09:08:23

标签: python parameters command-line-arguments pytest

想象一个玩具测试定义:

@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)

可以再次实现from_args_if_available()来解析所有命令行参数并寻找--params。另一种方法是使request.config在全球范围内可用(这很丑陋)。

我想知道是否可以从任何地方访问request.config元素,以便将所有命令行选项定义都放在一个位置(从而提供帮助)。

那么还有另一种方式来访问我可以以上述方式使用的已解析命令行选项吗?

1 个答案:

答案 0 :(得分:0)

我将在此处发布当前工作的解决方案:

在文件 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内定义