ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

怎么用 k6 的进程退出码在 CI 中判断测试结果是阈值失败、中止还是异常?

怎么用 k6 的进程退出码在 CI 中判断测试结果是阈值失败、中止还是异常? 怎么用 k6 的进程退出码在 CI 中判断测试结果是阈值失败、中止还是异常【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6在 CI 流水线里跑k6 run时k6 结束后的进程退出码是流水线判断测试结果的唯一信号退出码0表示测试正常完成非0退出码则按类型区分到底是阈值被击穿、测试被中止、脚本抛异常还是配置非法。k6 在 errext/exitcodes/codes.go 中定义了一组固定的退出码常量每个失败类别对应一个独立数值CI 步骤可以直接按数值分支处理。本文基于 k6 仓库源码与 release notes给出完整退出码清单和一段可在 CI 中直接使用的判断脚本。k6 的退出码清单退出码由 errext/exitcodes/codes.go 中的ExitCode常量定义注释说明了每个码的触发条件退出码常量含义0—测试正常完成无任何错误97CloudTestRunFailed云测试运行失败k6 v0.33.0 之前该值为9998CloudFailedToGetProgressk6 无法与云同步测试进度99ThresholdsHaveFailed一个或多个阈值失败100SetupTimeoutsetup()函数执行超时101TeardownTimeoutteardown()函数执行超时102GenericTimeout原因未明确的超时103ScriptStoppedFromRESTAPI通过 k6 的 REST API 调用停止执行104InvalidConfig配置非法105ExternalAbort测试被外部信号如 SIGINT、SIGTERM中止属于“被中止”而非“失败”106CannotStartRESTAPIk6 的 REST API 服务器无法启动107ScriptException测试脚本执行期间抛出异常108ScriptAborted脚本调用k6/execution模块的test.abort()被中止109GoPanicGo 运行时 panic 导致脚本被中止110MarkedAsFailed测试被标记为失败这些码值的适用范围是 0–125见 errext/exit_code.go 中的注释。对应关系还有 release notes 佐证v0.43.0 记录 CtrlC 中止退出码为105、REST API 停止为103、test.abort()为108v0.44.0 引入109用于 Go panicv0.32.0 记录setup()/teardown()中的异常会以107退出并视为脚本错误v0.53.0 记录非法配置退出码为104。退出码是如何产生的k6 主进程结束时internal/cmd/root.go没有任何错误则退出码为0如果冒泡到顶层的错误通过errext.WithExitCodeIfNone携带了退出码进程就以该码退出若捕获到 Go panic则 recover 后强制使用109。具体到测试执行internal/cmd/run.go测试结束后做最终阈值计算若有阈值被击穿返回错误thresholds on metrics ... have been crossed并附上ThresholdsHaveFailed99收到 SIGINT/SIGTERM 等信号时中止测试运行附上ExternalAbort105脚本通过执行模块把测试标记为失败后测试跑完会返回MarkedAsFailed110。也就是说CI 里拿到的退出码是 k6 有意为之的语义化结果不需要解析日志文本就能区分失败类别。在 CI 中按退出码分支判断以下 bash 片段展示了在 CI 步骤中执行 k6 后按退出码分类的典型写法。script.js替换为你实际的测试脚本路径k6 run script.js exit_code$? case $exit_code in 0) echo 通过测试正常完成 ;; 99) echo 阈值失败有阈值被击穿 ;; 97) echo 云运行失败非阈值原因的中止 ;; 100) echo setup() 超时 ;; 101) echo teardown() 超时 ;; 103) echo 被 REST API 停止 ;; 105) echo 被外部信号如 CtrlC中止 ;; 107) echo 脚本异常 ;; 108) echo 脚本调用 test.abort() 中止 ;; 109) echo Go panic ;; 110) echo 测试被标记为失败 ;; 104) echo 配置非法 ;; *) echo 其他失败退出码 $exit_code ;; esac exit $exit_code几点说明分支依据的码值全部来自上表的常量定义99对应阈值失败103/105/108对应各类“中止”107/109/100/101对应“异常”类失败其余码按需扩展。最后的exit $exit_code把 k6 的退出码原样传给 CI 步骤保证步骤本身的成败仍由 k6 的结果决定而不是被echo的成功所掩盖。若你的流水线只关心“通过/不通过”直接依赖 k6 进程的退出码即可0成功非0失败只有需要区分失败原因时才使用上面的分支逻辑。云运行的退出码在 v2.0.0 发生了变化如果你的流水线跑的是k6 cloud run需要特别注意 release notes/v2.0.0.md 中记录的变更此前大多数云中止场景返回退出码0导致 CI 无法区分失败和成功的运行从 v2.0.0 起这些场景改为返回97。release notes 给出的对照表如下场景变更前变更后Finished正常结束00Aborted by threshold阈值中止9999Aborted by system, limit, script error, user, or timeout097官方迁移建议是审查所有把退出码0当作云运行成功的 CI 逻辑——除阈值违规外的云中止现在都会返回97。另外注意版本边界在 k6 v0.33.0 之前CloudTestRunFailed的值为99见 release notes/v0.33.0.md如果 CI 中同时存在新旧版本的 k6 二进制97与99的语义不能混用。判断结果与边界验证方式CI 中 k6 步骤的退出码即判断依据码值与 errext/exitcodes/codes.go 的常量一一对应测试正常完成时应得到0。105外部信号中止在常量注释中明确“应视为中止而非失败”如果 CI 把 CtrlC 触发的中止当作可接受场景可以在分支中将其与硬失败区分开。102GenericTimeout在源码中带有// TODO: remove?注释属于原因未明确的超时兜底值CI 中按“未知超时”处理即可。阈值失败99与云中止97都可能出现但触发场景不同前者是本地阈值计算的结果后者是 v2.0.0 起云运行非阈值中止的专用码。进一步排查时可以结合 k6 的日志输出错误文本中会说明被击穿的具体阈值名或中止原因与 release notes/v2.0.0.md 中的迁移说明核对你的 CI 逻辑是否仍按旧行为中止返回0编写。【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表