python - 使用从夹具返回的列表参数化 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
我已经看到了这些方面的事情,但没有什么可以帮助解决这个问题 - 如果除了使用非固定方法之外还有其他解决方案。
解决方案
您可以使用yield
而不是return
inmy_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
推荐阅读
- sql - 访问 SQL 查询 - 从一个月中的特定日期选择日期范围
- angular - 如何使 svg 可编辑?
- java - InvalidMimeTypeException:无效的 mime 类型“{Content-Type}”:不包含“/”
- c# - 如何在 Travis-ci 上针对 TimeZoneInfo.GetSystemTimeZones() 进行测试
- javascript - 在数据表单元格中创建动态按钮单击事件
- python - 对请求设置时间限制
- image-processing - 如何在 GNU Octave 中旋转图像?
- javascript - 通过两个嵌套值过滤对象
- tensorflow - 在 3D (Keras) 中使用 float16 时,从第一个 epoch 开始丢失
- regex - 当我使用 BeautifulSoup 中的 findAll 和正则表达式(re.compile)在 python 中进行网络抓取时,我无法使用 css 类正确循环它