DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

测试结束却没有 pass

Go JSON 测试流有 run 却没有单测结束事件,检查显式 -v 是否覆盖 test2json 模式。未换行输出会粘住结果标记,包级 pass 不能代替单测结果。

go test -json -v 已经退出,CI 却把某个测试一直显示为运行中。先看 JSON 事件:如果有带 Test 的 run,没有对应的 pass、fail 或 skip,而 --- PASS: 混在普通 Output 里,可能是显式 -v 破坏了结果标记。

Go 1.27.1 中已经出现这个场景,核对的 1.27.2 参数处理仍保留相同路径。它不表示测试函数真的卡住,也不能只看到整个包的 pass 就补造所有测试的成功状态。

未换行输出粘住结果

测试直接使用 fmt.Print,最后没有换行时,后面的 --- PASS: 可能紧接在业务输出之后。普通详细模式没有供转换器识别的特殊帧标记,转换器按行开头查找结果,于是把合并的整行当成输出。

-json 本来会为测试二进制加入 -test.v=test2json,使框架输出带特殊标记。显式传入的 -v 会在后面变成 -test.v=true,覆盖这个模式。检查 CI 包装器展开后的真实参数,尤其是追加的 -v 或 -test.v=true,不要只看配置里的第一条命令。

并行子测试可能让另一条框架输出先接在未换行内容后,结果行又恰好恢复正常。因此偶尔能收到完整结果,不能排除这条路径。

JSON 模式不用叠加 -v

在已有测试入口中去掉显式详细参数,保留 -json 及原来的包选择、测试筛选和超时。以下是针对隔离样例的调用形式:

go test -count=1 -json -run '^TestUnterminated$' .

TestUnterminated 是已有样例的测试名,需要替换;-count=1 会绕过测试结果缓存,实际执行测试,不在有真实外部写入的测试集上随意重跑。

如包装器直接运行一个已经编译的测试二进制,使用该二进制的 -test.v=test2json,而不是 -test.v=true。一份 test2json 转换器只用于一个测试二进制的输出,多包测试优先交给 go test -json。

日志样式由消费者处理

去掉 -v 后,输出中的子测试层级和结果顺序可能改变。CI 应按 Package、Test 和 Action 构建展示,再输出需要的人类日志;不能为了保留一种缩进样式牺牲结构化结果。

用原先的未换行样例确认每个 run 都能得到带相同 Test 的结束事件,并分别检查并行子测试。包级成功与单测结束是不同事件;普通日志里的一段 --- PASS: 也不能被任意正则当成可靠结果,否则测试自己打印的文字可能被误认。