gpt4 book ai didi

python-3.x - 如何从命令行激活 PyTest fixture?

转载 作者:行者123 更新时间:2023-12-04 14:12:22 24 4
gpt4 key购买 nike

我正在使用 Python3.8 和 pytest。我如何根据某些命令行规范为我的 session 激活固定装置?现在我有一个 tests/conftest.py 文件,其中包含

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

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

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

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

如果启用了命令行选项,我想依赖一个灯具

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

但如果未启用命令行,我想依赖另一个装置 ...

@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)

你必须在你的 fixture 中检查这些参数:

@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,因为我希望 fixture 执行不同的设置代码,当然您的用法可能会有所不同。

您现在可以调用:

  • pytest -> 不会应用 fixture
  • pytest --option1 -> fixture1 将被应用
  • pytest --option1 --option2 -> 两个 fixture 都将被应用

您还可以将这些参数添加到您的 pytest.ini:

[pytest]
# always apply fixture2
addopts = --option2

编辑:
至于关于继承 fixture 的后续问题,你可以这样做:

@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):
...

编辑 2:
如果您不能自己编写或调整基本装置(wait_for_ 在问题的编辑部分),您可以采用其他方式。

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

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 fixture 只是实际 fixture 的包装器,但这样您就可以在两种情况下从相同的 fixture 派生。

关于python-3.x - 如何从命令行激活 PyTest fixture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63267623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com