JSON 解码只能确认格式,不代表字段齐全;把第三方日志转换成本文中间格式时,应另外核对键名、单位和类型。本文从Node构建JSON清单的受控中间格式读取记录,统一使用毫秒和退出码。同一步骤多次出现时,先统计执行次数比直接推断重试原因更可靠。
先固定可回放的数据
前端构建包装器可在一次运行结束后,把各阶段结果整理为受控中间格式,交给离线看板回放。这里采用对象数组保存完整快照,故意留下两次同名测试,使失败尝试不会被后来的成功覆盖。验收先确认数组成员仍是独立事件,再检查耗时与退出状态没有被显示层改写。
importjson raw='[{"step":"build","ms":120,"code":0},{"step":"test","ms":40,"code":1},{"step":"test","ms":60,"code":0},{"step":"pack","ms":80,"code":2}]'恢复结构并统一字段
清单顶层是记录数组,每条记录包含步骤名、毫秒数和退出码。读取结构化 JSON 可以保留数值类型,不需要从彩色终端输出里猜测字段。
rows=json.loads(raw)ifany(r["ms"]<0forrinrows):raiseValueError()计算本篇的指标
按步骤名累计执行次数,重复出现并不自动等同于故障重试。这里输出事实计数,让上层结合任务标识决定是否属于重跑。
result={}forrinrows:name=r["step"];result[name]=result.get(name,0)+1对照独立期望值
检查期望字典的每个键与计数,再确认所有计数相加等于原记录数量。若只有重复名字那一项不正确,优先查是否把赋值写成固定一,或者读取输入时已经将事件错误合并。
want={'build':1,'test':2,'pack':1}ifresult!=want:raiseValueError(result)print(result)准备数据时保留两个名称相同但结果不同的执行,以测试字典累计是否覆盖旧值。
其他只出现一次的步骤能够帮助区分“独立名称数量”和“总执行次数”,这两个量都不能替代频次表。
同名并行任务和同一任务重试可能采用相同名字。
要准确统计重试,还需保留任务唯一标识、尝试号或父运行编号,不能仅依赖名称推断。