Python 将命令行参数作为参数传递给py.test fixture

Python 将命令行参数作为参数传递给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

诚然,从一开始这并不是最好的方法,更重要的是解决夹具参数,即选项。get_option()是在调用其他所有参数之前调用的。 如有建议,将不胜感激

从config.py

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的贡献者,但如果您想请求获取文档,当然可以。请将相关内容复制到这里。链接可以删除或更改