Skip to content

契约回归、灰度与退役 ​

同一输入,比较执行证据 ​

迁移测试先在只读任务上并行运行旧入口与新入口,比较权限、工作目录、工具次数、终态和输出结构。文字不必逐字相同,文件引用和事实必须可核对。写任务不能双跑到同一真实资源,应使用隔离工作区和独立测试数据。

准备四种固定 fixture:正常完成、服务端工具失败、网络中断、未知新字段。下面 result.py 验证兼容解析器只接受明确的成功 envelope:

python
def decode(envelope):
    if envelope.get('isError') is not False:raise RuntimeError('not explicit success')
    blocks=envelope.get('content',[])
    texts=[b['text'] for b in blocks if b.get('type')=='text']
    if not texts:raise ValueError('missing text result')
    return '\n'.join(texts)
assert decode({'isError':False,'content':[{'type':'text','text':'ok'}]})=='ok'
for e in [{'isError':True,'content':[{'type':'text','text':'failed'}]},{}]:
    try:decode(e)
    except RuntimeError:pass
    else:raise AssertionError('error became success')
print('result decoder passed')

这是应用规范化后的 envelope;实际 SDK 的 isError 默认值应在适配层显式转为布尔值,再送进解码器。不要要求原始协议每条结果都显式携带 false。完整结果若有结构化字段,应为其建立独立分支,而非无条件拼文字。

灰度不是同时执行两次 ​

按业务任务 ID 稳定选择旧或新路径,同一任务重试仍走同一路径。记录适配器版本与底层版本,出现权限扩大、丢会话或取消失效立即回滚。回滚不能撤销已产生的文件修改,应另有工作区检查点。

退役需确认三项:没有活跃调用者、没有需要旧入口恢复的存量会话、关键故障路径被新入口覆盖。仅请求量连续一小时为零不足以证明月度任务不再使用;应查所有权和业务周期。保留一段可控回滚窗口,最后才删除旧依赖与配置。

日志可观察请求层级、会话路由、错误、取消和结果,不复制全部源码与凭证。兼容层只保留真正仍需维护的差异,不把过时字段无限转发到新平台。升级本机 CLI 后重新跑第一章发现实验,以事实决定保留或移除。

练习 ​

对含两段 text 与一段 image 的规范化成功结果,decode 应只拼接两段 text。解释为什么这不代表图片任务已完整支持。

先记录自己的输出与解释,再核对本章答案。

用心记录每一步成长