subprocess执行newman命令抛CalledProcessError但os.system无异常
问题解决:subprocess.check_output执行Newman命令触发CalledProcessError
问题根源
subprocess.check_output会在命令返回非0退出码时强制抛出CalledProcessError,而你的Newman命令虽然正常输出了TestRail报告URL,但返回了退出码1,因此触发了异常。os.system仅返回退出码,不会主动抛出异常,所以没有报错。
解决方案
方案1:改用subprocess.run(推荐,Python3.5+)
subprocess.run是更现代的API,能灵活捕获输出和返回码,不会主动因非0退出码抛异常,你可以自行判断是否属于正常情况:
import subprocess # 执行命令并捕获输出 result = subprocess.run(npmCLi, shell=True, capture_output=True, text=True) newmanCLI_output = result.stdout.strip() # 判断返回码和输出内容 if result.returncode != 0: # 检查输出是否是预期的TestRail报告URL if "https://host.testrail.io/index.php?/runs/view/" in newmanCLI_output: # 属于正常输出,继续处理 print(f"TestRail报告链接:{newmanCLI_output}") else: # 真正的执行错误,抛出异常 raise RuntimeError(f"命令 '{result.args}' 执行失败(错误码 {result.returncode}):{result.stderr}")
方案2:保留check_output,捕获异常后判断输出
如果必须使用check_output,可以在捕获CalledProcessError后,检查输出内容是否为预期的TestRail URL,再决定是否抛出异常:
import subprocess try: newmanCLI_output = subprocess.check_output(npmCLi, shell=True).decode().strip() except subprocess.CalledProcessError as e: output = e.output.decode().strip() # 判断输出是否是TestRail报告链接 if "https://host.testrail.io/index.php?/runs/view/" in output: newmanCLI_output = output else: # 非预期错误,抛出异常 raise RuntimeError(f"命令 '{e.cmd}' 执行失败(错误码 {e.returncode}):{output}") # 后续处理newmanCLI_output
补充说明
Newman的TestRail reporter返回非0退出码,可能是因为测试用例存在失败,或者该reporter本身的设计逻辑就是如此。你可以根据实际测试场景,调整判断条件(比如检查输出中是否包含测试失败的关键词),更精准地区分正常输出和真正的错误。
内容的提问来源于stack exchange,提问作者gabriel munteanu
相关产品推荐
相关产品推荐

