如何仅针对某些参数执行参数化夹具?

How to execute a parameterized fixture for only some of the parameters?

来自官方文档,在关于参数化夹具的示例中:

Parametrizing fixtures

Extending the previous example, we can flag the fixture to create two smtp_connection fixture instances which will cause all tests using the fixture to run twice.

@pytest.fixture(scope="module", params=["smtp.gmail.com", "mail.python.org"])
def smtp_connection(request):

我像上面的例子一样写了一个参数化的夹具,但现在我的问题是我想在不同的测试函数中使用夹具,它应该只对一个参数执行一次......像这样:

def my_test_function(smtp_connection)
    # I want this function to execute only once for the first or the second parameter...

所以我的问题是:测试函数是否可以使用夹具并仅针对使用 pytest API 的某些参数执行?或者这个用例已经是一个错误,在这种情况下是否应该以不同的方式实现夹具或测试功能?如果是这样,从概念上讲,正确的设计方案是什么?

我正在寻找一种编程解决方案,当我 运行 pytest 时不需要使用命令行标志。

您可以使用 indirect fixture parametrization - 在这种情况下,您将定义要在测试中使用的参数而不是夹具:

@pytest.fixture(scope="module")
def smtp_connection(request):
    url = request.param
    ...

pytest.mark.parametrize("smtp_connection", ["smtp.gmail.com", "mail.python.org"], indirect=True)
def def my_test_function(smtp_connection):
    ...

pytest.mark.parametrize("smtp_connection", ["smtp.gmail.com"], indirect=True)
def def my_other_test_function(smtp_connection):
    ...

这将使用您在列表中为特定测试提供的每个参数对夹具进行参数化。可以从request.param读取参数,如上图

当然,如果您有许多使用相同参数的测试,您最好使用特定的固定装置。