我花了四个月把一个Agent项目从原型推到可上线状态,前三个月都在折腾规划、记忆、工具调用、多轮对话这些功能,看起来好像都通了。但真正把我卡住的,是最后一个月——甚至可以说,最后一个月才是我对“Agent开发”这五个字理解最深的时间段。那段时间我反复面对同一个问题:这个系统改了一版又一版,规划策略换了、记忆机制调了、工具调用重写了,我怎么证明核心行为没有被改坏?答案最终落在一套专门为Agent设计的回归测试体系上。这期的项目实践笔记,就是最终定位,我把我从“不知道回归测试该测什么”到“敢按下发布按钮”的完整思路和落地细节整理出来。
先说一个可能有点反直觉的结论:Agent项目和传统后端项目在回归测试这件事上,本质上不是同一个物种。传统Web服务的回归测试,核心假设是“相同的输入必然得到相同的输出”,你构建一套用例集,跑一遍,绿的过红的修,逻辑清晰。但Agent项目从第一天开始就没有这个假设——LLM的输出本身就是概率性的,同样的用户请求,两次规划路径可能完全不同。如果你用传统的断言方式去测Agent,要么用例永远过不了,要么你为了让它“稳定通过而不断放宽断言,最后回归测试形同虚设。
这篇文章主要适合四类人:正在做Agent项目但不知道怎么测试的开发者、被“AI应用无法做质量保障”这个说法困扰的技术负责人、想把Agent项目推到生产环境但缺乏信心的团队,以及纯粹对Agent工程化感兴趣的人。我不会讲很玄的理论,所有内容都来自我在这一个项目里的实操、踩坑和最终定下来的方案。
1. Agent回归测试为什么不能照搬传统Web项目的套路
1.1 “确定性假设”失效之后,回归测试的底层逻辑要变
传统回归测试能成立,是因为被测系统是确定性的。你给一个接口传一组参数,它永远返回同一份响应。所以你可以把历史版本里发现的bug变成回归用例,断言“这个响应不能变”,一旦变了就说明有人改坏了东西。
Agent不是这样。同样是“帮我订一张明天下午去上海的高铁票”,模型可能这次选择调用12306的查询工具,下次选择先询问出行偏好;同样是工具返回的结果,模型这次把信息组织成表格,下次用自然语言段落回复。如果你硬要用“响应完全一致”来做断言,你测的不是Agent的行为,而是模型的随机性——那这个测试基本没法写。
我一开始就栽在这里。项目第一版回归用例,我是照搬传统接口测试的思路写的,一个用户问题对应一个期望输出,然后跑测试。结果同一组用例,我的通过率在62%到89%之间来回跳,完全没法看。当时的第一反应是“模型太不稳定了”,后来才意识到,问题出在我把Agent当成确定性系统来测,而它本不是。
1.2 Agent的“状态”比传统请求复杂得多,回归用例难以独立
传统接口测试的另一个默认条件是“请求之间无状态”。你测订单接口,不需要关心上一个用例是不是也操作过订单。但Agent项目里,这个前提也不成立。
一个Agent通常有三个层面的状态:对话上下文(这个session里用户和Agent聊了什么)、短期记忆(Agent自己总结的中间步骤和结论)、长期记忆(从历史交互中沉淀下来的用户偏好或知识库片段)。这三层状态都会影响Agent下一步的行为。这就意味着,同一个用户问题,在对话早期和对话后期输入,Agent的行为可能完全不同——但你很难说这是“bug”,因为这恰恰是Agent的设计目标之一。
这对回归测试的影响很直接:如果用例之间共享Agent实例或共享记忆存储,后一个用例的输入实际上受到了前一个用例的污染,跑出来的结果既不准确也不可复现。我踩过的坑是写了几个连续用例,分别测试“查天气”和“订会议室”,结果第二个用例总是能“回忆起”第一个用例的信息,导致断言飘忽不定。后来我强制每个用例独立创建Agent实例、独立记忆沙盒,情况才稳定下来。这件事下面会详细展开。
1.3 回归测试的目标变了:从“结果一致”到“行为边界稳定”
既然“输出完全一致”不可能,那Agent的回归测试到底在守什么?我在项目里反复推敲之后,定下来一个核心原则:回归测试守的不是结果的确定性,而是行为边界的安全性。
换句话说,我不关心模型这次是用自然语言解释还是用表格展示高铁信息,我关心的是这四件事:
- 该调工具的时候它确实调了工具,不该调的时候它没乱调
- 工具调用的参数是正确的、完整的,没有把用户意图传错
- 涉及敏感操作的场景(比如删除、支付、发送消息)有确认流程,没有被跳过
- 面对拒绝服务的边界场景(比如用户要求越权操作、工具返回异常),Agent的行为是可预期的
这个切换很关键。一旦接受了“行为边界稳定”这个目标,回归测试的用例设计、断言方式和通过标准就全都变了,后面我所有的方案都是围绕这个原则展开的。
2. 从“能跑”到“可上线”:先把回归测试的目标拆清楚
2.1 “可上线”不是功能做完,而是质量问题收敛
做Agent项目的人很容易陷入一个误区:Demo能跑通,就代表项目快上线了。事实上,在我看来“能跑”和“可上线”之间的差距,比“没做出来”和“能做出来”之间的差距还要大。
“能跑”的意思是:在理想场景下,Agent能完成核心任务链。“可上线”的意思是:在不可控的真实环境下,Agent的失败率、安全风险、资源消耗、可观测性都达到了一个可接受的范围。后者是典型的工程质量问题,而工程质量问题的收敛,主要靠的就是持续回归。
我在项目中定义的“可上线”状态,必须同时满足四个条件:
- 核心业务场景的成功率稳定在90%以上(这里的“成功”是指完成了用户目标,而不是模型输出了合理的文字)
- 所有高危险操作路径上,Agent的使用者确认节点必须被触发,改配置不能绕过
- 单次任务的平均token消耗和工具调用次数在预算范围内,没有失控的循环调用
- 所有Agent的关键决策(工具调用、记忆写入、信息输出)都有完整日志,能够事后追溯
这四个条件对应的不是一组简单的功能测试,而是一套持续运行的回归机制。所以接下来,我把回归测试的覆盖面按“层次”拆开,而不是按“功能模块”拆开。
2.2 回归测试的四个层次:原子能力、子任务链路、端到端场景、发布前冒烟
我在项目里把Agent回归测试分成四个层次,每一层解决不同类型的问题,在CI流水线里跑的时机和频率也完全不同。
第一层:原子能力层(Atomic Capability)。这一层测的是Agent工具箱里的每个工具,可以类比成传统单元测试。比如“查询天气”这个能力,你要验证的是:输入城市名/日期是否正确解析、工具参数是否正确拼接、工具返回异常时是否有兜底回复。这一层必须保持最高的确定性要求,因为它完全不依赖LLM的生成能力,是纯代码逻辑。这一层的回归频率最高,每次代码提交都会触发。
第二层:子任务链路层(Subtask Chain)。一个Agent任务通常由多个子任务串联完成,比如“订高铁票”=用户意图识别 + 行程查询 + 车次筛选 + 提交订单 + 支付确认。我要保证的是:每个子任务之间的衔接是稳定的,前一个子任务的输出能被后一个子任务正确消费。这一层开始涉及LLM的规划能力,但测试目标仍是“结构正确”——工具调用顺序是否正确、参数传递是否完整、任务是否在给定轮次内收敛。
第三层:端到端业务场景层(End-to-End Scenario)。这一层模拟真实用户和Agent的完整对话,覆盖从用户首次提问到目标完成的全过程。这一层的用例核心不是“输出预期”,而是“关键里程碑是否达成”。比如对“帮我安排一场和客户的视频会议”这个场景,里程碑包括:创建会议邀请、发送参会链接、写入日程、通知参会人。我断言的是这四个里程碑全部发生,至于Agent先做哪个后做哪个,并不重要。
第四层:发布前冒烟层(Release Smoke)。这一层是在每次发版前运行的精选用例子集,数量控制在几十个以内,覆盖所有高风险操作路径和核心业务链路。它不追求全量覆盖,追求的是在30分钟之内给出一个“这版能不能发”的快速判断。
这个分层模型解决了一个很实际的问题:不同类型的改动,回归策略完全不同。你改了一个工具的API参数,第一层立刻能暴露问题;你换了prompt模板,第三层才是有效的验证手段。把四个层次混在一起回归,既慢又难定位。
2.3 一张验收矩阵表,把“可上线”翻译成可执行的回归条件
为了让团队所有人对“可上线”有统一的理解,我整理了一张验收矩阵,把每一项质量要求映射到具体的回归测试手段上。这里直接贴出来。
| 质量维度 | 可上线标准 | 对应回归层次 | 核心断言方式 |
|---|---|---|---|
| 功能正确性 | 核心场景成功率≥90% | 链路层+场景层 | 关键里程碑达成、工具调用成功 |
| 工具调用安全 | 敏感操作必经确认、无越权工具调用 | 原子能力层+场景层 | 工具调用序列白名单校验 |
| 上下文一致性 | 对话历史无引用错乱、记忆无张冠李戴 | 场景层 | 记忆读写审计、关键信息一致性校验 |
| 资源配置 | 单任务工具调用次数≤10次,token消耗在预算内 | 链路层+场景层 | 调用次数统计、token统计 |
| 可观测性 | 决策日志完整,可重建任务全过程 | 冒烟层 | 日志完整性schema校验 |
| 失败兜底 | 工具异常时有兜底回复,不抛出裸错误 | 原子能力层 | 异常分支用例断言 |
这张表是我整个回归体系的地基。后面所有的用例设计、断言开发、测试工具选型,都是围绕这张表来的。每次开发一个新功能,我都会先看它落在哪个质量维度,然后补充对应的回归用例。没有这张表之前,测试用例是散的,有了这张表,用例集合成了一个有逻辑的系统。
3. 一套可落地的回归防线:输入快照、工具Mock、结果断言、在线巡检
3.1 输入快照:把“非确定性Agent”变成“可重放测试”
Agent回归遇到的最大障碍就是不可复现。解决这个问题的第一步,不是控制LLM的随机性,而是保证“同一个输入快照”可以被完整重放。
我在项目里做了一个名为Scenario Recorder的组件,它会在测试模式下自动记录一次Agent任务的所有输入上下文,包括:
- 完整的对话消息序列(用户消息、Agent回复、工具结果)
- Agent的短期记忆快照和长期记忆检索结果
- 运行时配置(模型版本、prompt模板版本、工具列表版本)
- 外部工具调用的请求和响应(这些都是Mock的,具体下面说)
有了这个快照,我可以在任意时间点重新拉起一个一模一样的Agent实例,跑同一段对话,观察改动后的行为差异。这就相当于传统后端里的“录制回放”测试,只不过它回放的不只是HTTP请求,而是整个Agent的交互状态。
这个设计意味着什么?意味着当你改了prompt模板之后,不需要发明新的测试用例,只需要把历史录制的快照全部重跑一遍,用旧版本的行为和新版本的行为做对比,差异一目了然。这是Agent回归测试里投入产出比最高的一笔投资。
3.2 工具Mock:把真实世界的影响隔离在测试之外
Agent即使没有用户交互,它还会做另一件事:调用工具。而工具调用是有副作用的。你测试“发送邮件”这个Agent任务,总不能真的给客户发一封测试邮件;测试“下单支付”也不能真的扣钱。
所以这里的核心是工具层全面Mock。我在项目里给每个Agent可调用的工具都实现了一套测试替身,它们的行为特征如下:
- 接收和真实工具完全相同的入参
- 返回预先录入的、模拟真实响应格式的数据
- 记录每次调用的完整参数——这个记录是断言的核心数据源
- 对敏感动作(发消息、下单、删除)返回特定的“模拟成功”但标记为测试模式
工具Mock的难点不在于“挡住副作用”,而在于“让Mock的行为足够真实”。我遇到的问题一开始是Mock返回的数据太规则了,导致Agent在测试里表现得比真实环境好得多——真实工具偶尔会超时、会返回异常格式、会部分成功。后来我在Mock数据里注入了异常分支模拟,比如“每10次调用模拟1次超时”这种概率性故障,回归测试的真实性瞬间提升了一个档次。
3.3 结果断言:结构化断言、语义断言、行为断言三层组合
有了快照和Mock,剩下最核心的问题就是:跑完一轮回归之后,我拿什么判断“通过”还是“失败”。我最终放弃了“期望输出精确匹配”,改为三层断言组合。
第一层:结构化断言(Structural Assertion)。关注的是Agent行为里那些可量化的硬性指标。比如“工具调用的顺序是否符合规范”“敏感操作前是否出现了用户确认环节”“任务是否在N轮对话内收敛”。这些断言直接用代码检查Agent的轨迹记录(Trace)就能完成,不需要任何语义理解。这是三层里最牢固的一层,大约覆盖了我所有回归断言的60%。
第二层:语义断言(Semantic Assertion)。关注的是Agent回复的内容质量。比如用户问“上海的明天天气适合跑步吗”,Agent不仅要回答天气,还需要给出适合跑步与否的判断。这时候我会用一个小型评测模型(或者直接用GPT-4作为judge)对回复内容做“是否覆盖关键信息”的打分。注意这里不需要做全面的内容质量评估,只需要做“关键信息点是否命中”的二元判断。
第三层:行为断言(Behavior Assertion)。关注的是Agent面对边界条件和意外情况时的行为模式。比如“工具连续失败三次,Agent是否转而求助用户而不是陷入死循环”“用户明确要求越权操作,Agent是否礼貌拒绝并说明原因”。这类断言必须用真实场景用例来测,因为它考察的是模型在压力下的行为倾向。
我把这三层断言写在了同一个测试框架里,用一段简单的伪Python代码表示的话,大致长这样:
def test_book_train_ticket_scenario(recorder): # 1. 重放输入快照 snapshot = recorder.load("2025-11-20_normal_booking") trace = recorder.replay(snapshot) # 2. 结构化断言 tools = [step.tool for step in trace.tool_calls] assert tools[:2] == ["search_high_speed_route", "query_train_schedule"], \ "任务开头应先查询线路再查询车次" assert confirm_step in trace.sensitive_operations, \ "提交订单前必须经过用户确认" # 3. 语义断言 assert semantic_judge(trace.final_response, keywords=["车次号", "时间", "价格"]), \ "回复必须包含车次、时间、价格三项关键信息" # 4. 行为断言 assert trace.tool_call_count <= 8, \ "单次订票任务工具调用次数应控制在8次以内,防止失控循环"第一层和第二层的代码化程度很高,可以全自动跑。第三层相对主观一些,我把它大量用于发布前的灰度回归,而不是每次提交都跑,因为它的用例设计和结果解释都需要人来介入。
3.4 在线巡检:上线之后的“持续回归”
离线回归再完善,也覆盖不了所有真实场景。Agent项目上线之后的另一个关键问题是:你无法预知用户会怎么跟Agent对话。总有一些输入是你离线用例集里没覆盖到的。
所以我额外搭了一个**在线巡检(Online Sentinel)**模块,它的工作方式是:
- 在生产环境旁边起一个影子Agent实例,不对外提供服务,但它会实时接收真实用户的脱敏输入
- 影子Agent不调用真实工具,只用Mock工具执行完整的任务推演
- 每完成一个任务,它会把推演结果和线上Agent的实际行为做对比,把差异超过阈值的情况上报
这个方案相当于把回归测试从“发布前”扩展到了“运行中”,而且用的是真实流量,不是人工构造的用例。上线第一个月,在线巡检就抓到了三个离线用例完全没覆盖到的问题,其中一个是在用户连续追问时,Agent会出现记忆覆盖导致信息自相矛盾的情况——这个case离线真造不出来。
在线巡检有一个要注意的点:它在影子环境里跑的Agent也是要花钱买token的。我目前的做法是按线上流量的5%抽样,平均每天消耗量可以接受,但如果你所在的团队对成本敏感,可以把抽样比例调低,或者只在核心业务时段开启。
4. 实测踩坑记录:非确定性、上下文泄漏、工具副作用
4.1 非确定性问题的“不可能三角”破解
Agent回归测试跑得多了,你会遇到一个非常哲学的问题:一个测试用例今天过了,明天不一定过;同一个用例跑10次,可能有2次失败。这不是你的测试写错了,而是LLM的采样温度导致的天然波动。
我试验了三种处理方式,最后是组合使用才稳定下来:
- 降低随机性开关:在测试模式下,把模型推理参数里的temperature调成0,把top_p调成1。这能显著降低输出的随机性,但并不能完全消除,因为LLM的并行计算本身就有一定的非确定性。
- 多采样投票:对于关键场景,同一个用例跑三次,至少两次通过才算通过。这个策略只应用于发布前冒烟层,因为成本较高,但对稳定性判断非常有效。
- 区分“硬失败”和“软失败”:硬失败指结构化断言没过、关键工具没调用,这个必须全红;软失败指语义断言分数略低于阈值,这时候我会容忍一定比例的浮动,通过统计趋势来观察。
这个组合方案的实际效果是:核心用例在正式回归中的通过率从前面提到的62%-89%波动,稳定到了95%以上。代价是多花了大概三分之一的token消耗,但对可上线判断来说,这点成本不值一提。
4.2 上下文泄漏:换了无状态用例设计才真正解决
我在第1.2节提到了用例互相污染的问题。这是一个细节极多、非常容易踩的坑,我详细梳理一遍。
Agent测试用例之间如果共享同一个记忆存储,或者共享同一个对话session池,那么前面用例产生的短期记忆和长期记忆都会影响后面用例的表现。表现形式非常隐蔽:比如第3个用例本来应该从零开始问“请帮我把上周的会议纪要整理成邮件草稿”,结果因为第2个用例里提前聊过“上周的会议”,Agent直接就从记忆里取数了,跳过了本应发生的检索流程。
我一开始用“清理记忆”来解决问题,发现根本不彻底。因为Agent的上下文状态不只是存储在显式的记忆数据库里,还有模型内部的KV Cache——你清理了外部记忆,模型上下文窗口里的历史token还是留着。
最终的解法是彻底的隔离:每个测试用例独立创建Agent实例,独立创建记忆沙盒,独立创建工具mock环境,一个用例跑完直接销毁整个环境。这听起来简单,但对测试框架的架构有一定要求——你的Agent不能是全局单例,必须是可工厂化的。如果你现在的Agent项目是全局单例写法,改造起来会有点肉疼,但这件事必须做,否则回归测试的地基就是歪的。
4.3 工具副作用:不要低估“Mock不彻底”的破坏力
工具Mock做得不够彻底,会给你制造非常隐蔽的问题。我遇到过最尴尬的一次:回归测试跑完之后,测试环境里的数据库被写入了几百条假订单数据,因为“创建订单”这个工具只在HTTP层做了Mock,但是数据库层还链着真实测试库。
后来我定了一条硬性规范:Agent工具的Mock必须作用在“副作用边界”,而不是“网络边界”。什么意思?就是你在Mock的不是“工具的网络调用”,而是“工具产生的外部影响”。一个工具如果会写数据库,你在Mock层就不应该让它进入任何真实的存储层;一个工具如果会经邮件网关发送真实邮件,Mock层就应该把“邮件发送成功”拦截在崩溃点之外。
这个规范听起来很基础,但实际上做起来比想象中麻烦,尤其是当你用了第三方Agent框架时,工具调用的封装层级很多,你需要在正确的那一层做拦截。我花了不少时间调这个,最终方案是对接框架的Tool Interface层面做一层代理,统一改写工具的“执行函数”,这才彻底根治了副作用泄漏的问题。
4.4 Agent记忆安全在回归中的位置
最近业内对Agent记忆安全的关注度明显提升,我也在几个技术社区看到类似A-MemGuard这样针对LLM Agent记忆的防御框架讨论。这一点在我的回归测试里也有对应的实践,简要提一下。
Agent的长期记忆是回归测试中一个很容易被忽略的维度。你的Agent如果会在用户允许之后存储用户偏好,那么理论上记忆本身也可能成为被攻击的入口——恶意用户通过对话引导Agent写入错误记忆,之后再利用这个错误记忆影响后续行为。
我目前的做法是把“记忆写入审计”作为结构化断言的一部分:每次回归断言时会检查写入记忆的记录,密钥是否符合schema、敏感信息是否被脱敏、写入前是否经过了用户确认。这个方向的完整防御体系还在逐步完善,但即使在现阶段,把它纳入回归范围也已经帮我抓到过几个记忆冲突的case。
5. 发布前的最后一道关卡:灰度对齐与验收清单
5.1 离线全量回归通过之后,还要再过一遍灰度对齐
离线回归通过不等于可以直接发布。我的经验是,离线回归只能证明“在构造的场景里Agent没问题”,不能证明“在真实流量里Agent没问题”。所以在正式发布之前,还要过一个步骤,我称之为灰度对齐。
灰度对齐的具体做法:
- 把新版本Agent部署到灰度环境,让它接收一小部分(比如5%)真实用户流量,但它的所有工具调用仍然走Mock,不产生真实副作用
- 同时让旧版本Agent继续处理同一批用户请求
- 对两个版本的处理结果做自动化对比,重点看三个方面:关键工具调用序列是否一致、是否有新的异常分支触发、资源消耗是否显著偏离
- 灰度对齐运行48小时以上,如果差异率和旧版本的自变异率在一个量级内(我们定的阈值是5%),才允许切换更大比例的流量
这个环节替代了“人工验证新版没问题”这一步。它可以帮你自动发现那些离线用例没覆盖到的新边界场景,而且不会影响到线上用户。灰度对齐是我项目里整个回归体系中最后一环,同时也是投入产出比最高的环节之一——它在发布前一周内帮我拦下过两个会导致线上事故的问题,都是离线回归完全没暴露的。
5.2 发布验收清单:从回归报告到“按钮可按下”的完整流程
在最终发布当天,我手上需要同时具备这几份材料,缺任何一份都不允许按发布按钮:
| 材料 | 内容 | 通过标准 |
|---|---|---|
| 全量回归报告 | 所有离线用例的执行结果、失败用例的根因分析 | 失败率为0,已修复并回归通过 |
| 三层断言分析 | 结构化/语义/行为断言的通过率统计 | 结构化断言通过率100%,语义断言通过率≥90%,行为断言无严重偏离 |
| 灰度对齐报告 | 新旧版本在真实流量上的差异率 | 差异率≤5% |
| 在线巡检配置确认 | 影子Agent实例已就绪、抽样比例已配置 | 配置与线上当前版本一致 |
| 成本监控基线 | 单任务平均token消耗、工具调用次数 | 在预算范围内,无持续增长曲线 |
这套验收清单解决了一个很实际的问题:发布时不再靠某个人的“我觉得差不多了”,而是所有人面对同一份报告做判断。如果回归报告里出现了失败用例,但团队里有人觉得“这个失败不重要,可以跳过”,那我的答案是:先把失败用例的根因定位清楚,或者把它从用例集里移除并说明理由,而不是带着一个已知失败的用例发版。允许“已知失败”存在的发布,最后几乎都会变成生产事故。
5.3 回归失败之后的响应机制
回归测试只有和“响应机制”配合,才能真正成为质量防线,否则它只是一份报告。我在项目里把回归失败分成了三个等级来处理:
- P0(立即处理):敏感性操作绕过确认、核心链路关键里程碑未达成、任何可能引发安全事故的工具调用异常。一级告警,负责人立刻处理。
- P1(当日处理):核心场景成功率下降超过阈值、工具调用次数明显超预算、语义断言覆盖率下降。当天出结论并修复。
- P2(本周处理):非核心场景的语义质量下降、token消耗轻微上升、新出现的边界case。在当前迭代内关闭。
我见过不少团队把回归测试做成“每天看一眼,红了就重跑一遍,绿的就算了”的游戏,这样做的回归测试其实完全没意义。回归测试给你最大的价值不是“发现bug”,而是“暴露变化”——任何信号都不应该轻率忽略。
6. 写在最后:回归测试的维护节奏与一些个人的感受
关于回归测试的用例维护,我想分享一点真实体会:用例集不是越多越好。我项目后期的全量离线用例维持在500个左右,但其中有大约50个是“黄金用例”,它们覆盖了所有核心链路和高风险路径,每轮必跑。剩下的450个按模块拆分,按改动范围定向跑。如果贪图覆盖率把用例膨胀到几千个,你会面临一个更头疼的问题——用例本身变成了需要维护的负担。
这里补充一个具体的用例维护技巧:每个季度做一次“用例失效分析”,把所有在过去三个月内从未失败过的用例拉出来,检查它们是否还在守护真实的风险。如果一个用例连续多次全绿,且所覆盖的行为已经由更底层的机制兜底,就果断砍掉。保留冗余的用例并不会提升信心,反而会让回归报告的噪音掩盖真正有价值的失败信号。
最后说说“可上线”这件事本身。我现在的理解是,“可上线”不是一个功能状态,而是一个质量状态。这个质量状态不是开发者自己感觉良好就能成立的,它需要一整套回归机制来持续验证和守护。有一个很重要的心态调整:回归测试每天红那么一两次是很正常的事,关键是你要知道为什么红,以及你的用例集能不能快速定位到变化源。如果你能做到这一点,你按下发布按钮的时候,手就不会抖了。
另外想对正在搭Agent质量体系的同学说一句:不要一开始就把所有维度铺满。从最关键的一条核心链路入手,把一个场景的三层断言完整跑通,然后逐步扩展。我项目里第一版回归体系只有12个用例,但它每天帮我守住的就是那个最核心的订票场景。后来的500个用例,都是从这12个用例的生长方式长出来的。方向对了,慢一点反而是快。
这期笔记就写到这。Agent回归测试这件事本身还在快速演进,尤其是记忆安全和多Agent协同场景的回归,我后面如果有了新的项目进展,会继续更新。