pytest断言失败后执行停止,如何跑完全部数据驱动用例并正确上报失败?
pytest数据驱动测试单组失败不终止其余用例执行方案
问题核心原因
你当前遇到的问题本质是两个错误导致:
- 未将每组测试数据集拆分为pytest可识别的独立测试用例,同一个测试用例内抛出异常会直接终止整个用例的执行
- 异常处理逻辑不符合pytest的失败上报规则,第一种写法中单独写
pytest.raises(Exception)没有实际作用,异常被吞导致pytest判定用例执行成功
解决方案
方案1(优先推荐):使用@pytest.mark.parametrize实现标准数据驱动
pytest的@pytest.mark.parametrize装饰器会自动将每组测试数据映射为独立的子用例,单个子用例断言失败不会影响其他子用例的执行,测试报告中也会独立展示每组数据的执行结果,无需手动写异常捕获逻辑。
代码示例:
import pytest # 替换为你实际的10组测试数据集 test_datasets = [ {"request_param": "xxx1", "expect_response_len": 1}, {"request_param": "xxx2", "expect_response_len": 1}, # 剩余8组数据按同样格式补充 ] # ids参数可自定义每组子用例的展示名称,方便报告中定位失败数据 @pytest.mark.parametrize("test_case", test_datasets, ids=lambda x: f"请求参数:{x['request_param']}") def test_response_length(test_case): # 替换为你自己的接口请求逻辑,拿到返回的json_response_plan json_response_plan = send_request(test_case["request_param"]) # 直接断言即可,无需手动try-catch assert len(json_response_plan) == test_case["expect_response_len"]
方案2:单测试用例内循环执行所有数据集
如果有特殊需求不能拆分独立子用例,可以在循环内捕获异常存储失败信息,所有数据集执行完成后统一上报失败:
import pytest def test_all_datasets(): test_datasets = ["xxx1", "xxx2", "xxx3"] # 替换为你的10组测试数据 failed_infos = [] for idx, param in enumerate(test_datasets, 1): try: json_response_plan = send_request(param) assert len(json_response_plan) == 1 except Exception as e: failed_infos.append(f"第{idx}组数据(参数:{param})执行失败:{str(e)}") # 全部执行完成后统一校验是否有失败 if failed_infos: pytest.fail("多组数据测试存在失败项,详情如下:\n" + "\n".join(failed_infos))
内容的提问来源于stack exchange,提问作者Apratim Chaudhuri
相关产品推荐
相关产品推荐

