资讯详情

资讯详情

基于Agent Skills重构测试流程:用例生成与缺陷定位实战

1. 测试流程的老大难问题与重构思路测试这行干久了你会发现一个很尴尬的现实需求评审时大家聊得热火朝天等真正落到用例编写、执行、缺陷定位这些环节时间永远不够用。版本节奏越来越快回归范围越来越大可人力就那么多。我所在的团队前两年也卡在这个瓶颈上每次发版前两周基本靠加班硬扛用例覆盖率靠经验拍脑袋缺陷定位靠日志里一行行翻。后来我们尝试把 Agent Skills 这套思路引入测试流程从用例生成到缺陷定位做了一次系统性重构效果比预期好不少今天就把这套东西完整拆开讲讲。先明确一下这里说的 Agent Skills 是什么。它不是某个具体工具的名字而是一种能力组织方式把测试过程中那些重复性高、规则性强、但又需要一定判断力的环节拆解成一个个可被智能体调用的技能单元。每个技能负责一件事比如“根据需求描述生成等价类用例”“根据堆栈信息定位可疑代码行”“根据历史缺陷库推荐回归范围”。这些技能可以单独用也可以串成流水线。核心价值在于把测试人员从机械劳动里解放出来让他们专注在探索性测试和风险判断上。为什么选择这个方向而不是直接买一套商用测试平台我们评估过几类方案。纯手工维护用例库成本随版本线性增长迟早崩盘。传统自动化脚本维护成本高需求一变脚本大面积失效。商用平台功能全但定制性差很多团队特有的判断逻辑塞不进去。Agent Skills 的好处是粒度可控你可以先从最痛的一个点切入比如先做用例生成跑通了再往缺陷定位延伸不用一次性推翻现有流程。而且技能单元是独立演进的今天用规则引擎实现明天换成模型驱动上层调用方式不变。这套重构适合谁来参考我觉得三类人最受益。一是测试团队的技术负责人正在找流程提效的抓手二是测试开发工程师想了解怎么把智能体能力落到具体测试场景三是有一定编码基础的测试同学想从纯手工测试往工程化方向转。如果你团队目前还停留在 Excel 管理用例的阶段也不用慌这套思路可以分阶段落地后面我会讲怎么从最小可行版本起步。整个重构我们分了四个阶段推进每个阶段都有明确的输入输出和验收标准。第一阶段是技能拆解把现有测试流程里的环节逐一列出来标注哪些适合技能化。第二阶段是单点验证挑一个环节做原型跑通闭环。第三阶段是流水线串联把多个技能按执行顺序编排。第四阶段是反馈优化根据实际使用数据调整技能参数和触发条件。下面按这个顺序展开中间会穿插我们踩过的坑和实测有效的配置。2. 核心技能拆解与关键细节解析2.1 用例生成技能的输入输出设计用例生成是整个流程的起点也是最容易做出效果的一环。我们最初的想法很简单把需求文档丢进去让模型吐用例。实测下来问题很多生成的用例要么太泛要么重复要么漏掉边界条件。后来调整了输入结构效果才稳定下来。核心改动是把输入从“一段需求描述”变成“结构化需求要素”。具体来说每个需求点拆成四个字段功能描述、输入域、预期行为、约束条件。功能描述用一句话说清楚这个功能干什么。输入域列出所有可能的输入类型和取值范围。预期行为描述正常和异常情况下的系统反应。约束条件包括性能要求、兼容性要求、安全要求等。这四个字段填好之后再交给技能去生成用例覆盖率和准确率明显提升。输出侧我们定义了统一的用例模板包含用例编号、所属需求点、前置条件、操作步骤、测试数据、预期结果、优先级、用例类型。用例类型分正向、边界、异常、性能、兼容五类。优先级按 P0 到 P3 划分P0 是阻塞级P3 是锦上添花。这个模板看起来普通但它是后续所有技能协作的基础。缺陷定位技能需要根据用例编号回溯到需求点回归推荐技能需要根据优先级筛选范围没有统一模板这些都做不了。注意输入结构化这一步不能省。我们试过直接拿原始需求文档喂给模型生成用例的重复率超过百分之四十边界用例覆盖率不到百分之三十。结构化之后重复率降到百分之八边界覆盖率提到百分之七十五以上。2.2 缺陷定位技能的推理链路缺陷定位比用例生成难得多因为它的输入是非结构化的输出又要求精确。我们设计的推理链路分四步走。第一步是信息聚合把缺陷报告、错误日志、堆栈信息、相关代码变更记录、最近一次通过的用例执行结果全部收集起来。第二步是特征提取从堆栈里提取异常类型、出错文件、出错行号、调用链深度从日志里提取错误码、关键参数值从代码变更记录里提取最近修改的文件和函数。第三步是候选排序根据特征匹配度给可疑代码位置打分。第四步是验证建议针对每个候选位置给出具体的验证方法比如“在该函数入口加日志打印参数值”“检查该分支的空值判断”。打分逻辑我们用的是加权规则不是纯模型推理。异常类型匹配权重最高占四十分文件路径匹配占二十五分调用链深度匹配占二十分最近变更记录占十五分。这个权重分配是经过多轮调参定下来的。一开始我们让模型直接输出可疑位置结果经常给出一些看起来合理但实际无关的建议。改成规则打分加模型辅助解释之后准确率从百分之五十二提到百分之八十一。提示缺陷定位技能不要追求一步到位给出根因。它的定位是缩小排查范围把可能的位置从几十个文件缩小到三五个剩下的交给人工判断。指望它直接告诉你哪一行代码写错了目前还不现实。2.3 技能之间的协作协议多个技能串起来用的时候接口定义很关键。我们定了一套轻量的协作协议每个技能接收一个 JSON 对象作为输入输出也是一个 JSON 对象。输入对象里必须包含 task_id、skill_name、payload 三个字段。task_id 用于追踪整条流水线的执行链路。skill_name 标识当前调用的技能。payload 是技能特有的参数集合。输出对象里必须包含 task_id、status、result、confidence 四个字段。status 表示执行成功或失败。result 是技能产出的内容。confidence 是置信度零到一之间低于零点六的结果会被标记为待人工复核。这套协议的好处是技能可以独立开发和测试。用例生成技能不需要知道缺陷定位技能怎么实现只要按协议输出就行。我们后来换过一次缺陷定位的底层实现从规则引擎换成混合模型上层调用方完全无感知。另外 confidence 字段很实用它让流水线可以自动分流高置信度的结果直接进入下一环节低置信度的结果转人工处理避免错误累积。2.4 数据回流与技能迭代机制技能上线不是终点持续迭代才是。我们建了一个数据回流通道每次人工复核的结果都会记录下来包括技能给出的原始建议、人工修正后的结果、修正原因。这些数据每周汇总一次用来调整技能参数。比如用例生成技能如果连续多次在某个需求点上漏掉边界用例我们就把这个需求点的输入域描述补充得更详细或者调整生成规则里边界条件的触发阈值。回流数据还用来做技能效果评估。我们定义了三个核心指标准确率、召回率、人工修正率。准确率是技能输出中被人工采纳的比例。召回率是人工实际需要的输出中被技能覆盖的比例。人工修正率是技能输出后被人工修改的比例。这三个指标每周出一次报表低于阈值的技能会触发告警。实测下来用例生成技能的准确率稳定在百分之八十五左右缺陷定位技能的召回率在百分之七十八上下都还有优化空间。3. 实操过程与核心环节实现3.1 环境准备与基础依赖动手之前先把环境搭好。我们用的技术栈比较轻量核心依赖就三样一个支持函数调用的模型服务、一个向量数据库用于相似度检索、一个任务队列用于异步执行。模型服务选的是支持结构化输出的接口因为技能之间的 JSON 协议需要严格保证格式。向量数据库用来存历史用例和历史缺陷做相似度匹配。任务队列用轻量级的方案就行主要是为了把耗时的生成任务异步化避免阻塞主流程。目录结构按技能划分每个技能一个独立目录包含技能描述文件、输入输出 schema、核心逻辑代码、测试用例。技能描述文件用 YAML 格式写明技能名称、版本、输入参数说明、输出字段说明、依赖的外部服务。这个文件很重要它是技能注册和发现的依据。我们后来技能多了之后靠这个文件自动生成技能目录和调用文档省了不少事。# skill_manifest.yaml 示例 name: test_case_generator version: 1.2.0 description: 根据结构化需求要素生成测试用例 input_schema: requirement_id: string feature_desc: string input_domain: array expected_behavior: string constraints: array output_schema: cases: array confidence: float dependencies: - vector_db - model_service3.2 用例生成技能的完整实现步骤第一步是需求要素的录入和校验。我们做了一个简单的 Web 表单测试人员按字段填写。提交时校验必填项和格式比如输入域必须是数组约束条件必须是非空字符串。校验通过后生成一个 requirement_id写入需求库。第二步是相似需求检索。用 requirement_id 去向量数据库里查历史需求找出相似度最高的五条。这一步的目的是复用历史用例。如果新需求和历史需求相似度超过零点九直接把历史用例拉过来做微调不用从零生成。实测下来这一步能减少百分之三十左右的生成工作量。第三步是调用模型生成用例。提示词里带上需求要素、相似历史用例、用例模板格式说明。提示词的关键是明确输出格式和分类要求。我们要求模型按正向、边界、异常三类分别生成每类至少两条。边界类必须覆盖输入域的上下界和空值。异常类必须覆盖非法输入和依赖服务不可用两种情况。第四步是后处理和质量检查。生成的用例先做去重用文本相似度算法找出重复项。然后检查覆盖率对照输入域列表看每个取值是否都有对应用例。最后计算 confidence综合相似度、覆盖完整度、格式合规度三个因子。confidence 低于零点六的用例标记为待复核。# 用例生成核心逻辑伪代码 def generate_cases(requirement): similar vector_db.search(requirement.embedding, top_k5) prompt build_prompt(requirement, similar, template) raw_cases model_service.generate(prompt) cases post_process(raw_cases) cases deduplicate(cases) coverage check_coverage(cases, requirement.input_domain) confidence calc_confidence(similar, coverage, cases) return {cases: cases, confidence: confidence}3.3 缺陷定位技能的实操流程缺陷定位的触发时机是自动化用例执行失败之后。流水线捕获到失败事件提取失败用例的编号和错误信息然后调用缺陷定位技能。第一步是信息聚合。从失败用例编号回溯到需求点从需求点找到关联的代码模块。从错误信息里提取异常类型和堆栈。从代码仓库拉取最近三天的变更记录。把这些信息拼成一个上下文对象。第二步是特征提取和打分。异常类型映射到可疑模块列表比如空指针异常优先查对象初始化相关代码超时异常优先查网络调用和数据库查询。文件路径匹配用编辑距离算法堆栈里的文件路径和代码库里的文件路径做相似度计算。调用链深度用来判断是表层问题还是深层问题深度超过五层的调用链优先查底层公共模块。第三步是候选排序和验证建议生成。按加权得分排序取前五个候选位置。每个位置生成一条验证建议建议内容根据异常类型和代码上下文动态生成。比如候选位置是一个函数入口建议就是“在该函数入口打印入参值确认参数是否符合预期”。第四步是结果输出和人工复核。输出包含候选位置列表、每个位置的得分和验证建议、整体 confidence。人工复核后把实际根因和技能建议做对比差异记录到回流数据里。3.4 流水线串联与执行编排单个技能跑通之后用任务队列把它们串起来。我们定义了一条主流水线需求录入 - 用例生成 - 用例评审 - 自动化执行 - 失败捕获 - 缺陷定位 - 结果通知。每个环节是一个任务节点节点之间通过 task_id 关联。编排逻辑用配置文件描述不写死在代码里。配置文件里定义节点顺序、每个节点的技能名称、输入输出映射关系、失败重试策略。这样调整流程不用改代码改配置就行。我们后来加了一个“回归范围推荐”节点就是在配置里插了一行半小时搞定。# pipeline_config.yaml 示例 pipeline: - node: requirement_input skill: requirement_parser next: case_generation - node: case_generation skill: test_case_generator next: case_review retry: 2 - node: case_review skill: manual_review next: auto_execution - node: auto_execution skill: test_runner next: defect_localization on_failure: defect_localization - node: defect_localization skill: defect_locator next: notify3.5 效果验证与数据对比重构前后我们做了一次对比。用例编写环节原来一个中等规模需求点平均耗时四十分钟现在结构化录入加生成加复核平均十八分钟效率提升约百分之五十五。用例边界覆盖率从百分之四十二提到百分之七十八。缺陷定位环节原来平均需要排查十二个文件现在技能给出五个候选位置实际根因在候选列表里的比例是百分之八十一平均排查文件数降到四个。回归测试范围推荐准确率百分之八十六漏测率从百分之三点二降到百分之一点一。这些数据是跑了三个版本迭代统计出来的不是单次实验。当然也有代价前期技能开发和调参投入了大约六人周数据回流和人工复核也需要持续投入。但摊到每个版本上净收益还是正的。4. 常见问题与排查技巧实录4.1 用例生成质量不稳定的排查思路最常见的问题是生成用例时好时坏同一个需求点今天生成得不错明天就漏东漏西。排查下来主要有三个原因。一是输入结构化程度不够需求描述里混入了模糊词汇比如“快速响应”“友好提示”模型没法判断具体标准。解决办法是把模糊词汇替换成可量化的描述比如“响应时间小于五百毫秒”“错误提示包含错误码和修复建议”。二是相似历史用例的干扰如果检索到的历史用例和当前需求只是表面相似但业务逻辑不同模型会被带偏。解决办法是提高相似度阈值从零点八提到零点九宁可少复用也不要错误复用。三是模型服务的随机性同样的输入多次调用结果有波动。解决办法是固定随机种子或者在提示词里增加输出格式的强约束。提示每次调整输入结构或提示词之后用同一批需求做回归测试对比生成结果的重复率、边界覆盖率、人工修正率三个指标。不要凭感觉判断好坏。4.2 缺陷定位误报率高的处理方式缺陷定位技能上线初期误报率偏高经常给出一些明显无关的候选位置。我们逐条分析误报案例发现主要问题出在特征权重上。异常类型匹配的权重给得太高导致只要异常类型对得上不管文件路径差多远都排进候选。后来把文件路径匹配的权重从二十五分提到三十五分异常类型从四十分降到三十分误报率明显下降。另一个问题是调用链深度特征深度超过十层的调用链其实参考价值不大因为太底层了修改风险高实际根因往往在中间层。我们把深度超过八层的调用链权重降了一半。还有一个容易被忽略的点是代码变更记录的时效性。最近三天的变更记录参考价值最高超过一周的基本可以忽略。我们一开始把变更记录的时间窗口设成两周结果很多候选位置指向的是已经稳定运行很久的代码。改成三天之后候选位置的准确率提升了约十二个百分点。4.3 技能协作中的接口兼容问题技能多了之后接口兼容是个麻烦事。我们遇到过几次技能升级导致上游调用失败的情况。比如用例生成技能的输出字段从 cases 改成 test_cases缺陷定位技能没同步更新直接报错。后来定了两条规矩。一是接口字段只增不减要废弃某个字段先标记 deprecated保留两个版本之后再移除。二是每次技能升级必须跑一遍集成测试确保上下游技能能正常协作。集成测试用例覆盖所有技能组合虽然跑一次要十几分钟但比线上出问题强。另外 confidence 字段的阈值也需要统一。不同技能对 confidence 的计算方式不一样有的偏保守有的偏激进。我们后来定了一个全局标准confidence 低于零点六一律转人工零点六到零点八之间进入下一环节但标记待观察零点八以上直接流转。这个标准写在协作协议里所有技能遵守。4.4 人工复核环节的效率优化人工复核是整套流程里最容易被忽视但最影响体验的环节。技能生成一堆结果人工一条条看看不过来就随便点通过质量就失控了。我们做了三件事来优化。一是按 confidence 排序高置信度的排前面复核人员从高往低看看到阈值以下就可以批量处理。二是提供快捷操作常用的修正原因做成下拉选项不用手打。三是设置复核上限每个需求点的待复核用例不超过三十条超过的部分自动打回重新生成。这三招下来单次复核时间从二十五分钟降到九分钟。4.5 常见问题速查表问题现象可能原因排查方法解决措施用例重复率高相似历史用例干扰检查检索到的历史用例相似度提高相似度阈值至零点九边界用例遗漏输入域描述不完整对照输入域列表逐项检查补充输入域上下界和空值缺陷定位误报多特征权重不合理分析误报案例的特征分布调整权重降低深层调用链权重技能调用失败接口字段不兼容查看上下游 schema 差异字段只增不减跑集成测试复核效率低结果未排序检查 confidence 排序逻辑按置信度排序设复核上限生成结果波动大模型随机性多次调用对比输出固定随机种子加强格式约束4.6 几个实测有效的避坑技巧第一个技巧是需求要素录入时加一个“反例描述”字段。让需求提出方写清楚什么情况下系统应该报错或拒绝服务。这个字段对生成异常用例特别有用实测能让异常用例覆盖率提升约二十个百分点。第二个技巧是缺陷定位技能的输出里加一个“排除建议”。不光告诉排查人员去哪里看还告诉他们哪里不用看。比如“该问题与数据库连接池无关无需检查连接配置”。排除建议能进一步缩小排查范围实测平均减少两个无关文件的排查。第三个技巧是每周做一次技能效果复盘只看三个数准确率、召回率、人工修正率。三个数里任何一个连续两周下降就停下来排查原因不要等到问题积累多了再处理。我们有一次连续三周没看报表结果用例生成技能的准确率从八十五掉到六十二排查发现是模型服务升级后输出格式变了后处理逻辑没适配。第四个技巧是保留人工兜底通道。技能再智能也有覆盖不到的场景尤其是探索性测试和复杂业务逻辑验证。我们的做法是流水线里始终保留一个“转人工”节点任何环节 confidence 低于阈值都可以直接转人工不强行往下走。这个通道平时用得不多但关键时刻能避免错误结果流入下游造成更大麻烦。这套东西我们跑了大半年中间迭代了十几个版本技能从最初的两个扩展到现在的七个。回头看最大的体会是不要追求一步到位。先把一个点做透跑通闭环拿到数据再往外扩。一开始就想做全流程智能测试平台大概率会烂尾。另外数据回流机制一定要早建没有数据反馈技能调优就是盲人摸象。最后人工复核不是负担它是质量保障的最后一道防线也是技能迭代的数据来源值得花心思设计好。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →