不可否认,这不是开始时最好的方法,更重要的是解决了夹具参数,即在其他一切之前调用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)
不要使用自定义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用途替换旧示例.