Python 将命令行参数作为参数传递给py.test fixture
诚然,从一开始这并不是最好的方法,更重要的是解决夹具参数,即选项。get_option()是在调用其他所有参数之前调用的。 如有建议,将不胜感激 从config.pyPython 将命令行参数作为参数传递给py.test fixture,python,pytest,Python,Pytest,诚然,从一开始这并不是最好的方法,更重要的是解决夹具参数,即选项。get_option()是在调用其他所有参数之前调用的。 如有建议,将不胜感激 从config.py class Options(object): option = None @classmethod def get_option(cls): return cls.option 从conftest.py @pytest.yield_fixture(scope='session', aut
class Options(object):
option = None
@classmethod
def get_option(cls):
return cls.option
从conftest.py
@pytest.yield_fixture(scope='session', autouse=True)
def session_setup():
Options.option = pytest.config.getoption('--remote')
def pytest_addoption(parser):
parser.addoption("--remote", action="store_true", default=False, help="Runs tests on a remote service.")
@pytest.yield_fixture(scope='function', params=Options.get_option())
def setup(request):
if request.param is None:
raise Exception("option is none")
def pytest_addoption(parser):
parser.addoption("--pg_tag", action="append", default=[],
help=("Postgres server versions. "
"May be used several times. "
"Available values: 9.3, 9.4, 9.5, all"))
def pytest_generate_tests(metafunc):
if 'pg_tag' in metafunc.fixturenames:
tags = set(metafunc.config.option.pg_tag)
if not tags:
tags = ['9.5']
elif 'all' in tags:
tags = ['9.3', '9.4', '9.5']
else:
tags = list(tags)
metafunc.parametrize("pg_tag", tags, scope='session')
@pytest.yield_fixture(scope='session')
def pg_server(pg_tag):
# pg_tag is parametrized parameter
# the fixture is called 1-3 times depending on --pg_tag cmdline
不要使用自定义的
选项
类,而是直接从配置中请求选项
pytest\u generate\u tests
可用于参数化测试的fixture-like参数
conftest.py
@pytest.yield_fixture(scope='session', autouse=True)
def session_setup():
Options.option = pytest.config.getoption('--remote')
def pytest_addoption(parser):
parser.addoption("--remote", action="store_true", default=False, help="Runs tests on a remote service.")
@pytest.yield_fixture(scope='function', params=Options.get_option())
def setup(request):
if request.param is None:
raise Exception("option is none")
def pytest_addoption(parser):
parser.addoption("--pg_tag", action="append", default=[],
help=("Postgres server versions. "
"May be used several times. "
"Available values: 9.3, 9.4, 9.5, all"))
def pytest_generate_tests(metafunc):
if 'pg_tag' in metafunc.fixturenames:
tags = set(metafunc.config.option.pg_tag)
if not tags:
tags = ['9.5']
elif 'all' in tags:
tags = ['9.3', '9.4', '9.5']
else:
tags = list(tags)
metafunc.parametrize("pg_tag", tags, scope='session')
@pytest.yield_fixture(scope='session')
def pg_server(pg_tag):
# pg_tag is parametrized parameter
# the fixture is called 1-3 times depending on --pg_tag cmdline
编辑:将旧示例替换为
元函数。参数化
用法。最新文档中有一个示例介绍如何执行此操作。它有点隐秘,老实说,我第一次阅读文档时就对它感到茫然
基本pytest_生成_测试示例
有时,您可能希望实现自己的参数化方案或
实现一些动态性来确定
固定装置为此,您可以使用pytest_generate_tests钩子,它是
在收集测试函数时调用。通过传入的metafunc
对象,您可以检查请求的测试上下文和
重要的是,可以调用metafunc.parametrize()来
参数化
例如,假设我们想要运行一个测试,该测试使用字符串输入
我们希望通过一个新的pytest命令行选项来设置它。我们先来
编写一个接受stringinput fixture函数参数的简单测试:
# content of test_strings.py
def test_valid_string(stringinput):
assert stringinput.isalpha()
现在,我们添加一个conftest.py文件,其中包含添加的命令
行选项和测试功能的参数化:
# content of conftest.py
def pytest_addoption(parser):
parser.addoption("--stringinput", action="append", default=[],
help="list of stringinputs to pass to test functions")
def pytest_generate_tests(metafunc):
if 'stringinput' in metafunc.fixturenames:
metafunc.parametrize("stringinput",
metafunc.config.getoption('stringinput'))
如果我们现在通过两个stringinput值,我们的测试将运行两次:
$ pytest -q --stringinput="hello" --stringinput="world" test_strings.py`
..
2 passed in 0.12 seconds
我非常希望避免自动生成测试参数,并根据使用该类所需的每个参数运行所有测试。参见重写的示例,它使用
pytest\u generate\u tests
和metafunc.parametrize
来添加参数化参数该示例应在文档中。我已经使用了所有的部件,但没有想到这种组合。谢谢。我不是pytest的贡献者,但如果您想请求获取文档,当然可以。请将相关内容复制到这里。链接可以删除或更改