☰
Agent Skills 重构测试流程:从用例生成到缺陷定位的智能体实践
2026/10/18 14:35:20 网站建设 项目流程

1. 测试流程的老问题与新解法

测试这活儿,干过几年的人都有一个共同感受:写用例的时候觉得自己在搞创作,跑用例的时候觉得自己在当操作工,定位缺陷的时候又觉得自己在当侦探。一个需求从评审到上线,测试环节吃掉的时间往往比开发还多,但真正产生价值的“思考”部分却少得可怜。大部分时间花在了重复的用例编写、机械的回归执行、以及翻来覆去地看日志找线索上。

我所在的团队去年下半年开始尝试把 Agent Skills 这套东西引入测试流程,目标很明确:不是搞一个花哨的自动化框架,而是让测试流程里那些“有规律但费脑子”的环节,交给具备推理能力的智能体去分担。所谓 Agent Skills,你可以理解为一组可组合的能力单元——每个单元负责一个具体的测试任务,比如“根据需求描述生成边界用例”“分析失败日志定位可疑代码”“对比两次运行的差异并判断是否为偶发”。这些能力单元通过一个调度层串联起来,形成一条从需求到缺陷定位的流水线。

这篇文章适合两类人看:一类是测试团队里负责流程优化的同学,想知道怎么把智能体能力落地到实际项目里;另一类是开发同学,想了解测试侧现在能做到什么程度,方便在提测阶段就配合好。我会把整个重构过程中的设计思路、关键实现、踩过的坑和实测数据都摊开来讲,尽量做到你读完就能在自己的项目里试起来。

2. 为什么选择 Agent Skills 而不是传统自动化

2.1 传统测试自动化的天花板在哪

传统自动化测试的核心逻辑是“录制-回放”或者“脚本-断言”。这套东西在稳定需求上跑得挺好,但一旦遇到需求频繁变更、界面元素动态化、或者业务逻辑分支复杂的情况,维护成本就会指数级上升。我统计过我们团队之前的一个项目:UI 自动化脚本大概 1200 行,每次需求迭代平均要改 15% 的脚本,改完之后还有大约 8% 的用例因为环境或数据问题变成“假失败”。测试同学每天第一件事就是筛一遍失败列表,把假失败挑出来重跑,这个动作本身不产生任何质量价值。

更根本的问题是,传统自动化只能验证“预期结果是否出现”,它没法回答“为什么没出现”以及“这个失败意味着什么”。一个断言失败,脚本只会告诉你“元素没找到”,但到底是页面加载慢了、接口返回变了、还是权限配置错了,它一概不知。这就导致缺陷定位环节仍然要人工介入,而人工介入就意味着上下文切换和效率损耗。

2.2 Agent Skills 带来的三个关键变化

引入 Agent Skills 之后,我感受到最明显的变化有三个。

第一个是从“执行脚本”变成“理解意图”。传统脚本是死的,你写click(‘submit’)它就只点那个按钮。Agent Skills 里的用例生成能力,接收的是需求描述和接口定义,它会去理解“用户提交订单时如果库存不足应该给出提示”这个意图,然后自动推导出需要覆盖的等价类、边界值和异常路径。生成出来的用例不是固定脚本,而是一组带有前置条件、操作步骤和预期结果的描述,执行层再根据当前环境把这些描述翻译成具体操作。

第二个是从“断言失败”变成“根因推测”。当一条用例执行失败时,Agent 会拉取关联的日志、接口响应、数据库快照和最近一次代码变更记录,然后给出一个带置信度的根因排序。比如它会说“80% 概率是订单服务的库存扣减接口返回了超时,建议检查该接口的线程池配置”。这个推测不一定每次都对,但它把定位时间从平均 25 分钟压缩到了 6 分钟左右,因为测试同学只需要验证最可疑的那一条,而不是从头查起。

第三个是从“一次性任务”变成“持续学习”。每次缺陷定位的结果会反馈回 Agent,如果推测正确,相关的特征权重会加强;如果推测错误,人工修正后的根因会被记录,下次遇到类似模式时优先匹配。这就让整个系统越用越准,而不是像传统脚本那样越用越臃肿。

2.3 方案选型的几个关键考量

在决定用 Agent Skills 之前,我们对比过几种方案。纯规则引擎的方案太僵硬,稍微复杂一点的业务逻辑就要写大量 if-else,维护起来比脚本还痛苦。纯机器学习的方案需要大量标注数据,我们初期根本没有那么多历史缺陷样本,冷启动是个大问题。Agent Skills 的好处在于它结合了规则的可解释性和模型的泛化能力——规则部分负责约束边界和保证安全,模型部分负责处理模糊性和生成内容。

还有一个很实际的考量是渐进式落地。我们不可能把整个测试流程一次性替换掉,所以 Agent Skills 被设计成可以逐个环节接入。第一周只接入用例生成,观察生成质量和人工修正比例;第二周接入失败分类,看能不能把假失败自动过滤掉;第三周才接入缺陷定位。每一步都有回退方案,如果某个环节效果不好,直接关掉那个 Skill 就行,不影响其他环节。

3. 核心能力拆解与实操要点

3.1 用例生成 Skill 的输入输出设计

用例生成是整个流程的入口,它的质量直接决定了后续环节的效率。我们给这个 Skill 定义的输入有三部分:需求文档的结构化描述、接口定义文件、以及历史缺陷库中与当前需求相关的条目。需求描述不是直接把 PRD 扔进去,而是先经过一个预处理步骤,提取出“角色-操作-对象-条件-结果”这五个要素。比如“普通用户在小程序端使用优惠券下单,如果优惠券已过期则提示不可用”,提取出来就是:角色=普通用户,操作=使用优惠券下单,对象=优惠券,条件=已过期,结果=提示不可用。

输出方面,每条生成的用例包含以下字段:用例编号、所属模块、前置条件、操作步骤、预期结果、优先级、以及一个“生成置信度”分数。置信度低于阈值的用例会被标记出来,提示人工重点审查。这个设计很关键,因为 Agent 生成的内容不可能 100% 准确,与其让它悄悄混过去,不如主动暴露不确定性。

实操中我发现一个很有效的技巧:给 Agent 提供“反面示例”。就是在输入里明确告诉它“以下类型的用例不要生成”,比如“不要生成需要真实支付才能验证的用例”“不要生成依赖特定用户账号状态的用例”。这比事后过滤要高效得多,因为 Agent 在生成阶段就会避开这些坑。

3.2 失败分类与假失败过滤的实现

假失败是自动化测试里最烦人的东西。我们的做法是让 Agent 在用例执行失败时,先做一个快速分类,判断这个失败属于以下哪一类:环境问题、数据问题、脚本问题、还是真实缺陷。分类的依据包括:失败时的截图、控制台日志、接口响应时间、以及该用例最近 10 次的执行历史。

这里有个细节值得展开说。接口响应时间这个特征特别有用。如果一条用例失败时,关联接口的响应时间超过了历史 P95 值的 3 倍,那大概率是环境抖动导致的超时,而不是功能缺陷。我们把这个规则写进了 Agent 的推理逻辑里,实测下来能过滤掉大约 70% 的假失败。剩下的 30% 里,有一部分是数据问题——比如用例依赖的测试数据被其他用例修改了。Agent 会检查数据的前后快照,如果发现关键字段在用例执行期间被其他操作改动过,就标记为“数据污染导致的失败”。

注意:假失败过滤不能追求 100% 准确。我们的策略是“宁可放过,不可错杀”。如果 Agent 对某个失败的分类置信度低于 60%,它会直接标记为“需人工确认”,而不是强行归类。这样虽然会增加一点人工工作量,但避免了把真实缺陷误判为假失败而漏掉的风险。

3.3 缺陷定位 Skill 的推理链路

缺陷定位是整套流程里技术含量最高的部分。Agent 拿到一个确认的真实失败后,会按以下顺序展开推理。

第一步是变更关联。它会查询最近 24 小时内与失败用例所属模块相关的代码提交记录,提取出变更的文件列表和提交信息。如果某个提交的修改范围恰好覆盖了失败用例涉及的接口或页面,这个提交就会被列为高可疑项。

第二步是日志模式匹配。Agent 会从失败时间点前后 5 分钟的日志中,提取出所有 ERROR 和 WARN 级别的条目,然后用预定义的模板去匹配常见错误模式。比如“Connection refused”通常指向服务未启动或端口配置错误,“NullPointerException”指向空值未处理,“Timeout”指向性能瓶颈或死锁。

第三步是调用链分析。如果项目接入了分布式追踪,Agent 会拉取失败请求的完整调用链,找出耗时最长的那个环节或者返回异常的那个节点。这一步能直接把问题范围从“整个订单服务”缩小到“订单服务里的库存扣减方法”。

第四步是历史相似缺陷检索。Agent 会在历史缺陷库中搜索与当前失败特征相似度最高的前 5 条记录,把它们的根因和修复方案作为参考呈现出来。这一步特别有用,因为很多缺陷本质上是同一类问题在不同模块的重复出现。

整个推理链路跑下来大概需要 8 到 12 秒,输出是一份结构化的定位报告,包含可疑根因排序、每个根因的支撑证据、以及建议的验证步骤。

3.4 调度层与反馈闭环的设计

三个 Skill 不是孤立运行的,它们通过一个轻量级的调度层串联。调度层的职责是:接收测试任务、按顺序调用 Skill、处理 Skill 之间的数据传递、以及收集人工反馈。我们用的是基于消息队列的异步架构,每个 Skill 作为一个独立的消费者,这样某个 Skill 出问题不会阻塞整个流程。

反馈闭环的设计我重点说一下。每次 Agent 给出缺陷定位结果后,测试同学在确认根因时,需要选择一个选项:“完全正确”“部分正确”“完全错误”。如果选“部分正确”或“完全错误”,还要填写实际的根因是什么。这些反馈数据会定期回流到 Agent 的推理模型中,用于调整特征权重。我们跑了三个月之后,缺陷定位的 Top1 准确率从最初的 42% 提升到了 67%,Top3 准确率从 71% 提升到了 89%。

4. 完整实操流程与关键环节实现

4.1 环境准备与基础依赖

整套系统跑起来需要几个基础组件。我用一个表格把依赖项和用途列清楚,方便你对照准备。

组件用途备注
消息队列Skill 之间的异步通信选型不限,保证至少一次投递
日志聚合服务收集执行日志和错误日志需要支持按时间范围和关键字检索
接口定义仓库存放 OpenAPI 或类似格式的接口描述用例生成 Skill 的核心输入之一
历史缺陷库存储过往缺陷记录和根因用于相似缺陷检索和模型反馈
对象存储存放失败截图和调用链快照需要支持按用例编号索引

环境准备阶段最容易忽略的是日志格式的统一。如果各个服务的日志格式五花八门,Agent 的日志模式匹配就会很吃力。我们的做法是在接入前先做一轮日志规范化,至少保证时间戳格式、日志级别标识、以及错误码字段是统一的。这个前期投入大概花了三天,但后续节省的调试时间远超这个成本。

4.2 用例生成 Skill 的配置与调参

用例生成 Skill 的核心配置项有三个:生成数量上限、置信度阈值、以及排除规则集。生成数量上限我建议根据需求复杂度动态设置,简单需求 10 到 15 条,复杂需求 30 到 40 条。设得太少覆盖不全,设得太多人工审查成本高。置信度阈值我们设的是 0.75,低于这个分数的用例会被标记为“待确认”,测试同学需要逐条判断是否保留。

排除规则集是一个不断迭代的列表。初期我们只排除了“需要真实支付”和“依赖特定账号状态”两类,后来陆续加入了“涉及第三方服务回调”“需要等待超过 30 秒”“依赖特定时间窗口”等规则。每一条排除规则背后都是一次踩坑经历。比如“依赖特定时间窗口”这条,是因为 Agent 生成了一条“在每月最后一天 23:59 下单享受折扣”的用例,这种用例根本没法在常规回归中执行。

调参过程中我发现一个反直觉的现象:提高置信度阈值并不总能提升最终用例质量。我们试过把阈值从 0.75 提到 0.85,结果 Agent 变得过于保守,很多有价值的边界用例因为“不确定”而被过滤掉了,最终人工补充的用例反而更多。所以阈值的选择要在“自动生成覆盖率”和“人工审查成本”之间找平衡,0.7 到 0.8 之间是比较舒服的区间。

4.3 失败分类 Skill 的规则与模型融合

失败分类 Skill 的配置分为规则层和模型层。规则层处理那些确定性高的场景,比如“如果失败原因是元素未找到,且页面截图显示白屏,则分类为环境问题”。模型层处理模糊场景,比如“接口返回了 500 错误,但错误信息不明确,需要结合日志和变更记录判断”。

规则层的配置我建议从简到繁。初期只配三条最基础的规则:白屏归为环境问题、数据不存在归为数据问题、断言值与实际值差异在预期范围内归为脚本问题。跑一周之后,根据实际分类结果再逐步补充规则。我们最终沉淀了 23 条规则,覆盖了大约 60% 的失败场景,剩下的 40% 交给模型处理。

模型层的训练数据来自人工标注的历史失败记录。我们标注了大约 2000 条失败样本,每条标注了失败类型和根因描述。这个标注工作量不小,但一次投入长期受益。模型训练用的是轻量级的分类器,不需要 GPU 集群,普通服务器就能跑。推理延迟控制在 200 毫秒以内,对整体流程几乎没有影响。

4.4 缺陷定位 Skill 的推理链路配置

缺陷定位 Skill 的配置重点是证据源的接入。我们把代码仓库、日志服务、追踪系统、缺陷库四个数据源都接入了,每个数据源对应一个证据提取器。代码仓库提取器负责拉取最近变更;日志提取器负责按时间窗口和关键字过滤日志;追踪提取器负责拉取调用链;缺陷库提取器负责相似检索。

配置过程中遇到的最大问题是证据冲突。比如代码变更显示某个接口被修改了,但日志里没有任何相关错误,追踪链路也显示该接口调用正常。这种情况下 Agent 需要判断哪个证据更可信。我们的处理方式是给每个证据源设置一个基础权重,代码变更权重 0.3,日志权重 0.35,追踪权重 0.25,历史缺陷权重 0.1。当证据冲突时,权重高的证据优先。这个权重分配不是拍脑袋定的,是根据 500 条历史缺陷的根因分析反推出来的——统计显示,日志中的错误信息与最终根因的关联度最高。

4.5 反馈闭环的落地细节

反馈闭环要真正跑起来,关键在于降低人工反馈的成本。如果每次反馈都要填一个长表单,测试同学用不了几天就会放弃。我们的做法是在缺陷定位报告里直接嵌入反馈按钮,三个选项“正确”“部分正确”“错误”一键可选。选“部分正确”或“错误”时,才弹出一个简短的文本框让填写实际根因,而且支持从历史根因中快速选择。

反馈数据的回流周期是每周一次。每周五下午,系统会自动汇总本周的反馈数据,更新 Agent 的推理模型和特征权重。更新过程是全自动的,不需要人工干预。但我们会保留一个“回滚”按钮,如果某次更新后准确率明显下降,可以一键回退到上一版本。

实操心得:反馈闭环刚上线时,我们犯了一个错误——把反馈入口藏得太深,测试同学要跳转三个页面才能找到。结果第一周只收到 12 条反馈,完全不够用。后来把反馈按钮直接放在报告顶部,并且加了一个“反馈有奖”的小激励,第二周反馈量就涨到了 180 多条。工具再好,没人用就是零。

5. 常见问题与排查技巧实录

5.1 用例生成质量不稳定的排查思路

用例生成质量波动是最常见的问题。表现是:同样的需求描述,有时候生成的用例很精准,有时候却跑偏得厉害。排查这个问题,我一般按以下顺序检查。

先看输入描述的结构化程度。如果需求描述里“角色-操作-对象-条件-结果”五要素有缺失,Agent 就会靠猜,猜的结果自然不稳定。我们的做法是在预处理阶段加一个校验,五要素缺任何一个就拒绝生成,并提示补充。这个校验上线后,生成质量的方差缩小了大约 40%。

再看历史缺陷库的关联条目。如果当前需求关联的历史缺陷太多太杂,Agent 会被带偏。比如一个简单的查询功能,关联了 50 条历史缺陷,其中大部分是性能问题,Agent 就会过度关注性能相关的用例,而忽略了功能正确性。这时候需要人工筛选一下关联条目,只保留与当前需求直接相关的。

最后看置信度阈值的设置。如果阈值设得太低,大量低质量用例会混进来;设得太高,又会导致生成数量不足。我的经验是:先用默认阈值跑 50 条需求,统计人工修正比例,如果修正比例超过 30%,就适当提高阈值;如果生成数量经常不足 10 条,就适当降低阈值。

5.2 假失败过滤的误判与修正

假失败过滤的误判主要有两种:把真失败判成假失败(漏报),把假失败判成真失败(误报)。漏报的危害更大,因为会导致缺陷逃逸。我们设置了一个保护机制:任何被分类为“假失败”的用例,如果它在最近 7 天内曾经真实失败过,就会被强制重新分类为“需人工确认”。这个机制上线后,漏报率从 3.2% 降到了 0.8%。

误报的修正相对简单,就是不断补充规则。比如我们发现“接口返回 401 错误”经常被误判为环境问题,但实际上可能是权限配置变更导致的真实缺陷。于是加了一条规则:401 错误如果伴随权限相关代码的最近变更,则分类为真实缺陷。类似这样的规则我们积累了十几条,误报率从最初的 18% 降到了 6% 左右。

5.3 缺陷定位准确率下降的应对

缺陷定位准确率下降通常发生在项目架构调整或者团队人员变动之后。架构调整会导致日志格式、调用链路、代码结构发生变化,Agent 之前学到的模式可能失效。人员变动则会导致代码提交习惯改变,比如提交信息变得简略,影响变更关联的准确性。

应对措施分两步。短期是手动校准:拉取最近 20 条定位错误的案例,逐条分析错误原因,如果是证据源接入问题就修复接入,如果是权重问题就调整权重。长期是定期重训:每个月用最新的反馈数据重新训练一次模型,让 Agent 跟上项目的变化节奏。

我印象最深的一次是团队从单体架构迁移到微服务架构后,缺陷定位准确率从 65% 掉到了 38%。排查发现是因为调用链的跨度变长了,原来的追踪提取器只能拉取前 5 层调用,迁移后经常需要 8 到 10 层才能定位到根因。把提取深度调到 15 层之后,准确率恢复到了 61%,又经过两周的反馈调优,回到了 70% 左右。

5.4 常见问题速查表

问题现象可能原因排查动作解决方式
用例生成数量骤降置信度阈值被调高或输入描述缺失要素检查阈值配置和输入校验日志恢复阈值或补充需求描述
假失败过滤漏报增加保护机制未生效或规则冲突查看被分类为假失败但实际为真的案例调整保护机制触发条件
缺陷定位耗时超过 30 秒证据源响应慢或调用链过长检查各证据提取器的响应时间优化查询或限制调用链深度
反馈数据回流后准确率反降反馈数据噪声大或权重调整过猛抽查反馈数据的准确性增加反馈校验或减小权重调整幅度
Skill 之间数据传递失败消息队列积压或格式不兼容检查队列深度和消息格式清理队列或统一数据格式

5.5 几个容易被忽略的实操细节

第一个细节是时间同步。Agent 做日志分析和调用链关联时,高度依赖时间戳的准确性。如果各个服务的时钟不同步,哪怕差几秒钟,都可能导致关联失败。我们的做法是在所有节点上启用时间同步服务,并且定期检查偏差。这个工作很基础,但一旦出问题就很难排查。

第二个细节是敏感信息的脱敏。Agent 在分析日志和接口响应时,可能会接触到用户手机号、身份证号等敏感信息。我们在证据提取器里加了一层脱敏处理,所有敏感字段在进入 Agent 之前就被替换成占位符。这既是合规要求,也避免了敏感信息在多个系统间流转带来的风险。

第三个细节是冷启动阶段的人工兜底。Agent Skills 刚上线时,准确率肯定不如人工。我们的策略是前两周所有 Agent 的输出都只作为“建议”,最终判断仍然由人工做出。两周之后,对于置信度高于 0.9 的输出,才允许自动采纳。这个渐进式的信任建立过程很重要,既给了 Agent 学习的时间,也给了团队适应的空间。

6. 落地效果与后续扩展方向

6.1 实测数据与团队反馈

整套流程跑了三个月之后,我拉了一组对比数据。用例编写环节,原来一个中等复杂度的需求平均需要 4 小时编写用例,现在 Agent 生成加人工修正大约 1.5 小时,效率提升约 62%。回归执行环节,假失败自动过滤节省了每天约 40 分钟的人工筛查时间。缺陷定位环节,平均定位时间从 25 分钟降到了 6 分钟,按每周 15 个缺陷计算,每周节省约 4.75 小时。

团队反馈方面,测试同学普遍觉得“终于不用把时间花在机械劳动上了”,但也有同学提出“Agent 生成的用例有时候太套路化,缺少那种灵光一现的异常场景”。这个反馈很中肯,也提醒我们 Agent 目前擅长的是覆盖已知模式,对于完全未知的异常路径,仍然需要人的创造力和直觉。

6.2 后续可以尝试的扩展

第一个扩展方向是把 Agent Skills 往前延伸到需求评审阶段。在需求评审时就让 Agent 介入,自动识别需求描述中的模糊点和矛盾点,提前暴露问题。这个方向我们已经在试点,初步效果是需求返工率下降了约 15%。

第二个扩展方向是接入生产环境的监控数据。目前 Agent 主要处理测试环境的失败,如果能把生产环境的告警和异常也纳入进来,就可以实现“测试环境发现的问题”和“生产环境实际发生的问题”之间的关联分析,进一步提升缺陷定位的准确性。

第三个扩展方向是多项目间的知识迁移。同一个团队的不同项目往往有相似的技术栈和业务模式,如果能把一个项目上积累的 Agent 经验迁移到另一个项目,冷启动成本会大幅降低。这个方向的技术难点在于如何抽象出项目无关的通用模式,我们还在探索阶段。

6.3 我个人在实际操作中的体会

这套东西搞下来,我最大的体会是:Agent Skills 的价值不在于替代人,而在于把人从低价值的重复劳动中解放出来,让人去做真正需要判断力和创造力的事情。测试这个岗位的核心竞争力从来不是“能跑多少用例”,而是“能发现别人发现不了的问题”。Agent 把用例生成和初步定位做了,测试同学就有更多时间去思考“这个功能在极端场景下会怎样”“用户可能会怎么误用”这类真正体现专业价值的问题。

另一个体会是不要追求一步到位。我们最开始想做一个大而全的智能测试平台,结果发现每个环节都有大量细节要打磨,贪多嚼不烂。后来改成小步快跑,一个 Skill 一个 Skill 地上线、验证、调优,反而推进得更快。如果你也在考虑类似的事情,我的建议是从用例生成这个最成熟的环节开始,跑通了再往下游延伸。

最后分享一个小技巧:定期让 Agent 和人工做“背靠背”对比。就是同一个需求,让 Agent 生成一套用例,让人工也写一套,然后对比两套用例的差异。差异点往往就是 Agent 的盲区,也是人工的价值所在。我们每两周做一次这样的对比,每次都能发现一些值得优化的地方。这个习惯坚持了三个月,Agent 的盲区越来越小,人工写用例的水平也在提升,算是意外收获。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询