繁体   English   中英

Pytest中的夹具工厂参数化

[英]Parameterize fixture factory in Pytest

我有一个假名工厂夹具:

@pytest.fixture
def dummy_name():
    def func(name="Dummy Name"):
        yield name
        num = 2
        while True:
            yield f"{name}_{num}"
            num += 1

    return func

我有一个利用这个的夹具:

@pytest.fixture
def dummy_document_file_name(dummy_name, extension):
    if extension:
        return dummy_name(name="test_file" + f".{extension}")
    return dummy_name(name="test_file.dummy_extension")

但是extension应该不是另一个夹具,而是该夹具用户提供的参数。

所以我想实现这一点:

dummy_file = next(dummy_document_file_name(extension="txt")) # test_file.txt
dummy_file2 = next(dummy_document_file_name(extension="txt")) # test_file2.txt

自然它会寻找另一个夹具:

  @pytest.fixture
  def dummy_document_file_name(dummy_name, extension):
E       fixture 'extension' not found
>       available fixtures: ...

有没有办法注入非夹具参数?

您可以使用fixture 装饰器中的params 设置默认值, request获取传递给fixture 的参数,并使用pytest.mark.parameterize装饰器设置测试级别的参数。 pytest.mark.parameterize中,您必须定义要参数化的夹具的名称,将参数作为可迭代对象传递,最重要的是,将间接标志设置为 True。 在代码中,这看起来像


@pytest.fixture(params=[None])
def dummy_document_file_name(dummy_name, request):
    if extension := request.param:
        return dummy_name(name="test_file" + f".{extension}")
    return dummy_name(name="test_file.dummy_extension")


@pytest.mark.parametrize('dummy_document_file_name', ("csv","pdf",None), indirect=True)
def test_this(dummy_document_file_name):
    print(dummy_document_file_name)
    assert True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM