如何从命令行激活PyTest设备



我使用的是Python3.8和pytest。如何根据一些命令行规范为会话激活fixture?现在我有一个tests/conftest.py文件,其中包括

@pytest.fixture(name="fixture1", scope="session")
def fixture1():
...
@pytest.fixture(name="fixture2", scope="session")
def fixture2():
...

但我只想在会话中包含某些fixture,并且我希望能够在pytest.ini文件中或通过传递给pytest的命令行参数来指定它。我该怎么做?

编辑:这是我的用例。。。

如果命令行选项被启用,我想依赖于一个固定装置

@pytest.fixture(name="az_sql_db_inst")
def az_db_connection_fixture(az_sql_creds, wait_for_sql_server)

但如果命令行没有启用,我想依赖另一个fixture。。。

@pytest.fixture(name="az_sql_db_inst")
def az_db_connection_fixture(az_sql_creds, wait_for_docker_sql_server)

您可以添加可用于启用固定装置的命令行标志:

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:
如果您不能自己编写或调整基本固定装置(问题的EDIT部分中的wait_for_(,您可以稍微换一种方式。

您可以在单独的插件中编写基本fixture的单独实现,并根据配置加载所需的插件:

plugin_docker.py

@pytest.fixture
def wait_for_service(wait_for_docker):
yield

插件服务器.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固定装置只是实际固定装置的包装,但通过这种方式,您可以在两种场景中从同一固定装置派生。

相关内容

  • 没有找到相关文章

最新更新