Pytest:参数化fixture返回路径或读取数据

Pytest: parameterized fixture returning path or read data

我有以下测试用例:

@pytest.mark.parametrize('env_a, env_b', [(env_a, env_b)], indirect=True) #its existing fixture, cannot modify it
@pytest.mark.parametrize('platform_a, platform_b', [(platform_a, platform_b)])
@pytest.mark.parametrize('resource', [resource1, resource2, resource3, resource4])
def test_compare_items_lists(env_a, env_b, platform_a, platform_b, resource):

    path_a = env_a / platform_a / resource / file.txt #move to fixture
    path_b = env_b / platform_b / resource / file.txt #move to fixture

    list_of_items_in_a = path_a.read() #move to fixture
    list_of_items_in_b = path_b.read() #move to fixture

    extras_in_a = get_extras(list_of_items_in_a, list_of_items_in_b)
    extras_in_b = get_extras(list_of_items_in_b, list_of_items_in_a)

    assert not extras_in_a and not extras_in_b

这个参数化测试做:

但这是测试,所以应该只比较数据。

所以我想应该创建 fixture(s?) 来准备路径和读取文件。然后应该将其传递给只比较数据的测试。但是怎么办呢?

pytest 灯具可以 parametrized 通过设置 params 选项。

您可以将每个标记提取到一个单独的固定装置。

@pytest.fixture(params=[(platform_a, platform_b)], ids=['platform_a,platform_b'])
def platform(request):
    yield request.param

@pytest.fixture(params=[(env_a, env_b)], ids=['env_a,env_b'])
def env(request):
    yield request.param

@pytest.fixture(params=[resource1, resource2, resource3, resource4])
def resource(request):
    yield request.param

然后在构建资源路径和returns其中内容的另一个装置中使用它们。

@pytest.fixture
def diffable_resources(request, env, platform, resource):
    env_a, env_b = env
    platform_a, platform_b = platform
    resource = resource

    path_a = env_a / platform_a / resource / 'file.txt'
    path_b = env_b / platform_b / resource / 'file.txt'
    yield (path_a.read(), path_b.read())

这样你的测试就可以像这样:

def test_foo(diffable_resources):
    list_of_items_in_a, list_of_items_in_b = diffable_resources
    extras_in_a = get_extras(list_of_items_in_a, list_of_items_in_b)
    extras_in_b = get_extras(list_of_items_in_b, list_of_items_in_a)

    assert not extras_in_a and not extras_in_b