首页 > 解决方案 > 使用从夹具返回的列表参数化 Pytest 测试

问题描述

我有一个测试迭代从夹具返回的字典列表(从 S3 中的 csv 文件解析)并执行断言。

在伪代码中:

# s_3 is a fixture
def my_fixture(s_3):
  s_3.get_data_from_s3()
  yield s_3_data_as_list_of_dicts

def my_test(my_fixture):
  for entry in my_fixture:
    do my assertions

我也在将输出传递到的地方写了这个@pytest.mark.parametrize,但它不是来自固定装置,而是来自我必须实例化/连接 S3 的方法。

我希望能够利用我的固定装置来获取数据并根据输出参数化测试,如下所示:

# s_3 is a fixture
def my_fixture(s_3):
  s_3.get_data_from_s3()
  yield s_3_data_as_list_of_dicts

@pytest.mark.parametrize("entries", [output from my_fixture])
def my_test(entries):
    do my assertions

我已经看到了这些方面的事情,但没有什么可以帮助解决这个问题 - 如果除了使用非固定方法之外还有其他解决方案。

标签: pythonpytest

解决方案


您可以使用yield而不是returninmy_fixture

@pytest.fixture
def my_fixture(s_3):
    s_3.get_data_from_s3()
    yield s_3_data_as_list_of_dicts


def my_test(my_fixture):
    print(my_fixture) # my_fixture is a list of dicts

编辑:

@pytest.mark.parametrize在收集时间执行,此时 pytest 正在收集所有需要运行的测试。 @pytest.fixture在当前测试/模块/会话(取决于范围)正在运行时在执行时间执行。

如果您希望每个字典作为测试的参数,您可以构建非夹具函数并将其作为参数发送到parametrize

def data_source():
    for d in s_3_data_as_list_of_dicts:
        yield d


@pytest.mark.parametrize('d', data_source())
def test_my_test(d):
    print(d) # d is a single dict

推荐阅读