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

meh*_*etg 7 python pytest

不可否认,这不是开始时最好的方法,更重要的是解决了夹具参数,即在其他一切之前调用Options.get_option().建议和建议将不胜感激.

来自config.py

class Options(object):
    option = None

    @classmethod
    def get_option(cls):
        return cls.option
Run Code Online (Sandbox Code Playgroud)

来自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")
Run Code Online (Sandbox Code Playgroud)

And*_*lov 8

不要使用自定义Options类,而是直接从config请求选项.

pytest_generate_tests 可用于参数化类似夹具的测试参数.

conftest.py

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
Run Code Online (Sandbox Code Playgroud)

编辑:用旧metafunc.parametrize用途替换旧示例.