您可以添加可用于启用灯具的命令行标志:
conftest.py
def pytest_addoption(parser):
parser.addoption('--option2', action='store_const', const=True)
parser.addoption('--option2', action='store_const', const=True)
你必须在你的夹具中检查这些参数:
@pytest.fixture(name="fixture1", scope="session", autouse=True)
def fixture1(request):
# only use with option1 command line argument
if request.config.getoption("--option1"):
...
@pytest.fixture(name="fixture2", scope="session", autouse=True)
def fixture2(request):
# only use with option2 command line argument
if request.config.getoption("--option2"):
...
@pytest.fixture(name="fixture3", scope="session", autouse=True)
def fixture3(request):
# only use if option1 command line argument is not provided
if not request.config.getoption("--option1"):
...
我在这里使用了autouse=True,因为我希望灯具执行不同的设置代码,当然您的使用可能会有所不同。
你现在可以打电话了:
-
pytest -> 不会应用任何夹具
-
pytest --option1 -> 将应用fixture1
-
pytest --option1 --option2 -> 两个夹具都将被应用
您也可以将这些参数添加到您的pytest.ini:
[pytest]
# always apply fixture2
addopts = --option2
编辑:
至于关于继承夹具的后续问题,您可以这样做:
@pytest.fixture
def wait_for_sql_server(request):
if request.config.getoption("--my_option"):
...
@pytest.fixture
def wait_for_docker(request):
if not request.config.getoption("--my_option"):
...
@pytest.fixture(name="az_sql_db_inst")
def az_db_connection_fixture(
az_sql_creds, wait_for_sql_server, wait_for_docker):
...
EDIT2:
如果您无法自己编写或调整基本装置(问题的编辑部分中的wait_for_),您可以采用其他方式。
您可以在单独的插件中编写基本夹具的单独实现,并根据配置加载所需的插件:
plugin_docker.py
@pytest.fixture
def wait_for_service(wait_for_docker):
yield
plugin_server.py
@pytest.fixture
def wait_for_service(wait_for_sql_server):
yield
conftest.py
def pytest_addoption(parser):
parser.addoption('--docker', action='store_const', const=True)
def pytest_configure(config):
use_docker = config.getoption("--docker")
plugin_name = 'plugin_docker' if use_docker else 'plugin_server'
if not config.pluginmanager.has_plugin(plugin_name):
config.pluginmanager.import_plugin(plugin_name)
@pytest.fixture(name="az_sql_db_inst")
def az_db_connection_fixture(az_sql_creds, wait_for_service):
...
wait_for_service 固定装置只是实际固定装置的包装,但这样您就可以在两种情况下从同一个固定装置派生。