如何在pytest中使用subprocess并让测试在subprocess.run报错时失败
pytest中subprocess.run执行出错时判定测试失败的方法
默认情况下subprocess.run只会返回命令执行结果对象,不会校验命令的退出状态码,哪怕命令执行出错返回非0值,测试用例也会判定为通过,你可以用以下两种方案实现执行出错时自动判定测试失败:
- 方案1:添加
check=True参数(最简单)
将subprocess.run的check参数设置为True后,只要命令返回非0状态码,就会自动抛出subprocess.CalledProcessError异常,pytest遇到未捕获的异常会直接判定测试用例失败。
修改后的代码示例:
import pytest import subprocess @pytest.mark.parametrize("input_json", ["input.json"]) def test_main(input_json): subprocess.run(['python', 'main.py', input_json], check=True)
- 方案2:手动断言返回状态码(灵活度高)
如果你需要自定义错误提示、或者要同时校验命令的输出内容,可以手动获取返回结果的状态码做断言:
import pytest import subprocess @pytest.mark.parametrize("input_json", ["input.json"]) def test_main(input_json): result = subprocess.run( ['python', 'main.py', input_json], capture_output=True, # 可选:捕获stdout和stderr,方便出错时排查问题 text=True # 可选:将输出内容转为字符串格式,而非字节流 ) # 自定义断言,返回码非0时测试失败,同时打印错误信息 assert result.returncode == 0, f"程序执行失败,错误输出:{result.stderr}"
内容的提问来源于stack exchange,提问作者papabiceps
相关产品推荐
相关产品推荐

