我可以拥有一个通用夹具并在我的测试中调用不同的值吗?

I can have a generic fixture and call different values from that in my test?

我是 python 和 pytest 的新手,目前我了解基本的工作原理。但我找不到以下场景的文档:

我创建了一个通用夹具,它具有我项目中使用的默认模拟值,并在测试中使用了这个夹具,它工作正常。类似于:

#fixture
@pytest.fixture()
def generic_fixture(mocker):
    mocker.patch('project.some_class.url', "http://some_url:5002")

#test
def test_1(generic_fixture):
    do_something() # method that uses values from my generic fixture
    assert True

现在我想知道是否有办法将我的测试中的参数传递给我的夹具调用,以做出一些决定,例如:

#fixture
@pytest.fixture()
def generic_fixture(mocker, parameter_url):
    if parameter_url == None
        mocker.patch('project.some_class.url', "http://some_url:5002")
    else:
        mocker.patch('project.some_class.url', parameter_url)

#test
def test_1(generic_fixture(parameter_url)):
    do_something() # method that uses values from my generic fixture
    assert True

我怎样才能正确地做到这一点?我查看了 monkeypath、@pytest.mark.parametrize 和其他一些结构,但其中 none 看起来符合我的要求。

您可以为此使用 Pytest's marks

#fixture
@pytest.fixture()
def generic_fixture(request, mocker):
    parameter_url = request.node.get_closest_marker("generic_fixture_url")
    ...

#test
@pytest.mark.generic_fixture_url("url")
def test_1(generic_fixture):
    ...

其他选项是将您的夹具变成测试模块上的 factory or to set some attribute

D马兰的回答对我帮助很大!

我会把我的最终解决方案放在这里,因为我使用了上面的答案描述的内容和其他东西,我认为它对具有类似结构的人很有用,因为至少对我来说很难弄明白(如果更好,有人注意到我所以我把这个答案放在问题中):

conftest.py

def pytest_configure(config):
    # to avoid warnings
    config.addinivalue_line("markers", "my_fixture_url")

@pytest.fixture()
    def my_fixture(request):
        if request.node.get_closest_marker("my_fixture_url") and request.node.get_closest_marker("my_fixture_url").args[0]:
            something = request.node.get_closest_marker("my_fixture_url").args[0]
        else:
            something = 'www.google.com'
            ...

test.py

@pytest.mark.my_fixture_url({'url': 'www.whosebug.com'})
def test_1(my_fixture):
    ...

def test_2(my_fixture):
    ...

我在标记中使用了一本字典,因为在某些情况下我想发送多个参数,and/or使用每个参数来覆盖一些默认值。

请注意,我使用夹具进行了第二次测试,但没有标记。我可以做到并使用 fixture 中的默认值。

通过这种方式,我可以在需要默认值和需要覆盖部分夹具配置的情况下使用相同的夹具。

希望对大家有所帮助 :D