使用subprocess运行Newman命令时如何在集合报错时终止后续流程
解决方案
你之前用try和except无法捕获错误的核心原因是:run_sh函数没有根据Newman的实际运行结果抛出异常,只要Popen能正常启动Newman进程,不管集合里的断言、请求是否出错,run_sh都会正常执行完返回,自然不会触发异常。
Newman默认在集合运行出现断言失败、请求错误等问题时,会返回非0的退出码,你只需基于这个退出码做判断即可实现需求。
步骤1 修正run_sh函数,增加退出码判断
你现有代码的run_sh只读取了标准输出,没有等待进程执行完成获取返回状态,修改后的代码如下:
import shlex from subprocess import CalledProcessError, Popen, PIPE from io import TextIOWrapper def run_sh(command): process = Popen(shlex.split(command), stdout=PIPE, stderr=PIPE, text=True) # 实时打印标准输出 for line in process.stdout: print(line, end="") # 打印错误输出避免漏看问题 for line in process.stderr: print(line, end="") # 等待进程执行完成,获取退出码 return_code = process.wait() # 退出码非0则抛出异常 if return_code != 0: raise CalledProcessError(return_code, command)
步骤2 可选:给Newman命令加立即终止参数
如果需要Newman遇到第一个错误就直接终止运行,不用等整个集合跑完,可以在你的Newman命令里加上--bail参数:
cmd = '''newman run "My_Collection.postman_collection.json" --folder "My_Folder" -e ../../Postman/Environments/My_Environment.json -d "CREDS.txt" -r cli,csv -n 1 --reporter-csv-includeBody --reporter-csv-export ./RESPONSES.csv --bail'''
步骤3 外层调用增加异常捕获逻辑
之后你在外层调用run_sh(cmd)的时候,用try except捕获CalledProcessError,捕获到之后直接执行退出逻辑或者返回主菜单即可:
try: run_sh(cmd) # 没有异常才执行后续正常步骤 # 你的后续业务代码写在这里 except CalledProcessError: print("Newman集合运行出错,终止执行") # 这里写退出脚本或者返回主菜单的逻辑 exit(1)
内容的提问来源于stack exchange,提问作者PianoTiger
相关产品推荐
相关产品推荐

