如何从使用monkeypatch的pytest测试函数中获取返回数据
报错原因
monkeypatch是pytest的内置fixture,仅在pytest框架自动执行测试用例时会自动注入参数,手动调用test_take_sample()没有传入该参数,因此触发参数缺失报错。- 现有代码存在逻辑错误:
test_take_sample中return语句写在所有assert校验之前,执行到return时函数会直接退出,后续校验逻辑完全不会运行,测试校验失效。 - 直接调用测试函数传递测试数据的做法不符合pytest的设计规范,测试用例应当保持独立,共享测试数据/前置逻辑应使用fixture实现。
最优解决方案:使用pytest fixture共享测试数据
fixture是pytest专门用于封装测试前置逻辑、共享测试数据的功能,支持自动注入fixture依赖,可完美解决你的需求,改造后代码示例如下:
import pytest # 封装前序测试的输出数据为fixture @pytest.fixture def data_to_test_1(): # 此处替换为原test_load_sample中生成测试数据的逻辑,直接返回结果即可 return test_load_sample() # 封装take_sample的输出数据为fixture,自动注入monkeypatch和前置fixture @pytest.fixture def data_to_test_2(monkeypatch, data_to_test_1): monkeypatch.setattr('builtins.input', lambda _: "373978487") return take_sample(data_to_test_1, NAME_FILE_1) # 原take_sample测试用例直接注入fixture做校验即可 def test_take_sample(data_to_test_2): assert data_to_test_2["GT"] == "0/1" assert data_to_test_2["AD"] == "28,46" assert data_to_test_2["DP"] == "74:99" # 后续测试直接注入data_to_test_2即可使用,无需手动调用生成 def test_filter_1(data_to_test_2): # 直接使用data_to_test_2作为入参完成测试逻辑 ...
注意事项
- 普通测试用例中不要随意添加return语句,尤其不能放在校验逻辑之前,否则会导致测试校验失效。
- 若有跨测试用例的数据共享需求,优先使用fixture实现,避免手动调用测试用例传递数据。
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

