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
我有以下测试用例:
@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