通过bash脚本运行pytest时如何让GitHub Action按退出码判定失败
解决方案
核心原因
当前bash脚本的默认执行逻辑中,coverage run -m pytest "$@"运行结束后,无论pytest是否测试失败,都会继续执行coverage xml -i命令,而脚本最终的默认退出码是最后一条命令的退出码,因此pytest失败的状态会被后续覆盖率命令的执行结果覆盖,GitHub Action无法感知到测试失败。
最优修改方案(保留覆盖率报告生成能力)
把pytest运行后的退出码提前存储下来,等覆盖率报告生成完成后,再用这个退出码作为整个脚本的最终返回值即可,修改后的脚本内容如下:
#!/usr/bin/env bash coverage run -m pytest "$@" # 存储pytest命令的退出码 PYTEST_EXIT_CODE=$? coverage xml -i # 以pytest的退出码作为脚本最终返回值,非零值会直接触发GitHub Action任务失败 exit $PYTEST_EXIT_CODE
补充说明
- 现有GitHub Action配置不需要做任何修改,GitHub Action的
run步骤会自动检测执行脚本的退出码,只要返回非零值就会标记该步骤失败,对应任务也会同步标记为失败。 - 如果你不需要在pytest测试失败后生成覆盖率报告,也可以选择在脚本开头添加
set -e配置,只要任意命令返回非零退出码,脚本就会立即终止并返回对应退出码,不过该方案会导致测试失败时不会生成coverage.xml文件,请根据自身需求选择:
#!/usr/bin/env bash set -e coverage run -m pytest "$@" coverage xml -i
内容的提问来源于stack exchange,提问作者Shashika
相关产品推荐
相关产品推荐

