测试用例去重率90%:这个用AI“瘦身”的脚本,测试经理求着我要源码
关注 霍格沃兹软件测试开发 公众号回复「资料」, 领取人工智能测试开发技术合集从5000条用例到500条回归时间从6小时降到40分钟我们到底怎么做到的大家好我是某互联网公司质量效能团队的测试架构师负责测试资产治理和效能优化。今天想分享一个让测试经理追着我跑的项目——用AI给测试用例库“瘦身” 。先上结果5000条回归用例AI识别并建议删除/合并了4500条去重率90% 。全量回归执行时间从6个多小时压缩到40分钟线上漏测率反而下降了18% 。测试经理看到数据后第一句话是“源码给我看看。”一、用例库是怎么“胖”起来的先说说我们的用例库是怎么从“精干”变成“臃肿”的。我们的回归用例库跑了五年多积累到5000条。每次全量回归要跑六个多小时。没有人敢删用例。每个人都怕删掉的那一条恰好是某次事故复盘后加进去的“保命用例”。结果就是只增不减——新功能上线加用例没有人会同步审查旧用例是否还有存在的必要。直到一次容量评估我们才认真算了一笔账跑一次全量回归的机器成本和人力成本已经高到影响了发布节奏。但“找冗余”这件事人工做几乎不可行。5000条用例两两比较判断是否覆盖同一逻辑组合数是天文数字。测试团队哪怕全员上阵一个月也看不完。这正是适合交给AI处理的场景规则可以显式化工作量巨大但单步判断不复杂。二、先定义清楚什么样的用例算“冗余”动手之前必须先把“冗余”定义清楚——这是整个项目最容易出错的一步定义错了AI再精准也是错的方向。我们最终确定了三类冗余而不是笼统的“重复”第一类完全重复型两条用例的输入、操作步骤、预期结果完全一致只是用例标题或编号不同。这种最容易识别。成因也很简单——不同人不知道已有用例重复创建。我们这次发现的完全重复用例有380条占总量的7.6%主要集中在团队人员流动较多的几个模块。第二类等价覆盖型占比最高、最难识别两条用例验证的是同一个等价类。比如“输入合法手机号13800138000”和“输入合法手机号13900139000”验证的是同一条业务规则——合法手机号格式校验。这是占比最高的一类也是人工最难批量识别的一类——因为用例的标题、编写人、创建时间都不一样字面上看完全是两条独立的用例只有深入理解它验证的业务规则才能判断它们本质上在测同一件事。我们最终发现的等价覆盖型冗余用例占了总量的60%以上。第三类被包含型A用例的验证路径完全覆盖B用例的验证路径且多验证了额外的步骤。比如“用户登录”和“用户登录后修改密码”——后者的执行路径包含了前者的全部步骤和断言。这种情况下前者可以被后者替代。明确不算冗余的情况同一等价类但覆盖不同环境不同浏览器、不同设备、同一逻辑但验证不同的异常分支、看起来相似但实际命中不同代码路径的用例。我们专门写了一 份“保留清单”规则在AI分析阶段就主动排除这些场景防止误判为冗余。三类冗余定义清楚之后AI要做什么也就明确了——找出这三种类型的冗余而不是简单地去重。三、技术方案四步走第一步结构化提取——让AI“读懂”用例5000条用例原始格式是Excel和Markdown混杂字段不统一。第一步是把每条用例标准化提取成统一字段{“id”: “TC-1024”,“module”: “用户注册”,“preconditions”: “未注册账号”,“input_params”: {“手机号”: “合法格式”, “验证码”: “正确”},“steps”: [“输入手机号”, “获取验证码”, “输入验证码”, “提交”],“expected”: “注册成功跳转首页”,“equivalence_class”: “合法手机号正确验证码”}关键字段是equivalence_class——这是AI根据用例的输入条件和业务规则推断出的等价类标签。这一步本质上是让AI读懂每条用例在测试什么“业务规则”而不只是字面上的“操作了什么”。第二步向量化 聚类——把用例“投影”到语义空间结构化之后我们做了两件事向量化用Embedding模型我们用的是nomic-embed-text-v2-moe和structbert的组合方案把每条用例转换成语义向量。相似语义的用例在向量空间里距离更近。聚类用聚类算法K-means 层次聚类把向量空间里“挨得近”的用例聚成一簇。同一簇里的用例大概率测试的是同一个业务场景。这一步解决了“等价覆盖型”冗余的识别问题——不管用例标题怎么起、步骤怎么写只要语义向量接近就会被聚到一起。效果5000条用例被聚成了430个簇。平均每个簇11.6条用例——意味着大量用例在测同一件事。第三步AI智能分析——从“相似”到“冗余”聚类只是告诉你“这些用例很像”但“像”不等于“冗余”。还需要AI做更精细的判断。我们给大模型喂了每个簇里的所有用例让它按照三类冗余的定义逐一分析完全重复直接标记删除等价覆盖推荐保留哪一条保留最全面、最清晰的被包含推荐删除被包含的那一条同时AI还会做跨簇分析——有些用例虽然不在同一个簇里但存在“被包含”关系。比如“登录”用例在一个簇“登录后修改密码”在另一个簇但后者包含了前者。我们用的是内部部署的Qwen模型配合Few-shot示例教会它“什么算冗余、什么不算”。经过三轮迭代AI的判断准确率从最初的72%提升到了91% 。第四步人工裁决——AI提建议人做决定AI的输出结果不是一个“删除列表”而是一个“待决策候选集”——机器提出疑问人来做最终裁决。我们建了一个简单的审核面板簇ID用例数AI判定推荐保留风险等级C-02318条等价覆盖TC-1024低C-08912条等价覆盖TC-3401中C-1568条完全重复TC-5602低……………测试经理花了一天时间审核确认了AI的95%建议——只有不到5%需要调整主要是业务敏感模块AI不了解最新业务背景。最终结果5000条 → 500条。去重率90%。四、踩过的坑说三个最痛的坑一相似度阈值设错了刚开始我们把阈值设在了0.95——两条用例的语义相似度超过95%才算冗余。结果只找出了完全重复的那380条等价覆盖型的基本没发现。后来把阈值逐步降到0.85等价覆盖型的召回率才上来。但降到0.8以下又开始误报——把“边界测试”和“正常流程测试”也判成了重复。教训相似度阈值的设定不是一个技术问题而是一个业务决策。每个团队的用例风格不同阈值要自己调。我们最终稳定在0.87。坑二上下文信息缺失导致误判同样 是“用户无法登录”的测试场景在安全模块和在兼容性模块其测试意图截然不同但向量距离可能很 近。AI把安全模块的“登录失败-账户锁定测试”和兼容性模块的“登录失败-不同浏览器测试”判成了重复——但这两条用例的价值完全不同。解法在向量化时加入了模块标签作为额外特征。同一个模块内的相似才算冗余跨模块的不算。这个改动让误报率从23%降到了8% 。坑三AI的“幻觉”问题AI有时候会“脑补”一些不存在的覆盖关系。比如两条用例明明测的是不同场景AI愣是说“A覆盖了B”。解法引入交叉验证——不光靠大模型分析文本同时用代码调用图做二次验证。如果两条用例在代码层面调用了不同的函数路径即使文本相似也不判冗余。五、效果数据说几个硬数据指标优化前优化后用例总数5000条500条全量回归耗时6小时40分钟去重率90%AI判断准确率91%人工审核工作量不可行1人天线上漏测率基线↓18%最意外的是这次梳理顺带发现了40多条“僵尸用例” ——验证的功能在历史版本里已经下线了但用例还留在库里。这些用例跑了几年从来没人质疑过它们存在的意义。六、给同行的一些建议先定义“冗余”再动AI定义错了AI再精准也是错的方向。花一周时间跟团队达成共识——“什么样的用例算冗余”——比直接写代码重要得多。从小范围开始别一上来就全量跑。先选一个模块比如“用户登录”完整跑通“AI识别→人工决策→执行验证”的闭环。积累信任和经验之后再扩展。我们第一个月只跑了“用户注册”这一个模块。相似度阈值要自己调不要照搬别人的阈值。每个团队的用例风格、粒度、命名习惯都不一样。我们从0.95一路试到0.87花了三周才找到最佳值。AI提建议人做决定AI的输出不应该是“删除列表”而应该是“待决策候选集”。机器提出疑问人来做最终裁决。把边界划清楚是避免AI误操作的核心前提。别忘了“僵尸用例”AI去重主要解决“冗余”但“僵尸用例”验证已下线功能的用例是另一类问题。建议在AI分析之前先用代码覆盖率工具扫一遍——那些覆盖率长期为零的用例基本可以标记为“待确认”。最后AI做测试用例去重本质上是把“人工判断冗余”这件不可能完成的任务变成了可能。5000条用例两两比较人工永远做不完。但AI可以在几小时内完成语义分析、聚类、智能判断——然后让人来做最后的裁决。测试经理后来跟我说了一句话让我印象很深“以前不敢删用例是因为不知道删了会怎样。现在AI告诉我删了没问题我就敢了。 ”信任不是凭空来的——是靠91%的准确率、95%的建议被采纳、以及上线后漏测率反而下降换来的。如果你团队的用例库也在“只增不减”地膨胀我建议你试试这个方向。技术门槛真不高——一个Embedding模型 一个聚类算法 一个大模型就能搭起来。关键是你愿不愿意让AI动你的用例库本文部分内容参考了霍格沃兹测试开发学社整理的相关技术资料主要涉及软件测试、自动化测试、测试开发及 AI 测试等内容侧重测试实践、工具应用与工程经验整理。

相关新闻

深度解析DSP/BIOS内核性能开销:从基准测试到实时系统优化

深度解析DSP/BIOS内核性能开销:从基准测试到实时系统优化

1. 项目概述:为什么我们需要关注DSP/BIOS内核的性能开销?在嵌入式实时系统开发,尤其是基于TI DSP平台的项目里,性能预算(Performance Budget)是个绕不开的话题。你手头的DSP芯片主频就那么多,MI…

2026/10/3 9:53:36 阅读更多 →
TikTok广告素材制作工具推荐:AI如何帮助商家批量生成投放素材与复刻热门视频

TikTok广告素材制作工具推荐:AI如何帮助商家批量生成投放素材与复刻热门视频

随着 TikTok 和抖音电商竞争不断加剧,广告素材生产效率已经成为影响商家投放效果的重要因素。 过去,商家制作广告视频主要依靠人工剪辑,但如今,一个商品往往需要测试多个视频版本,包括不同卖点、不同开场、不同市场语…

2026/9/19 6:14:48 阅读更多 →
X-Plane Connect终极入门:从安装到第一个Python控制程序

X-Plane Connect终极入门:从安装到第一个Python控制程序

X-Plane Connect终极入门:从安装到第一个Python控制程序 【免费下载链接】XPlaneConnect The X-Plane Communications Toolbox is a research tool used to interact with the X-Plane flight simulator 项目地址: https://gitcode.com/gh_mirrors/xpl/XPlaneConn…

2026/10/10 23:45:23 阅读更多 →

最新新闻

Windows文件共享权限配置:禁止复制与下载的落地方法

Windows文件共享权限配置:禁止复制与下载的落地方法

经常有人带着一句话找我:文件服务器共享文件设置访问权限、禁止复制共享文件、禁止下载共享文件的方法,帮我整理一下。问的人往往刚接手工作不久,要么在改造公司资料室,要么在给项目组搭文档库,要求都是差不多的&#…

2026/10/15 19:28:21 阅读更多 →
Cobra Bash 补全生成指南:掌握 legacy 动态补全方案与 BashCompletionFunction 注入机制

Cobra Bash 补全生成指南:掌握 legacy 动态补全方案与 BashCompletionFunction 注入机制

测试操作系统网络安全 【免费下载链接】syzkaller syzkaller is an unsupervised coverage-guided kernel fuzzer 项目地址: https://gitcode.com/gh_mirrors/syz/syzkaller 点击查看 免费下载 导读 Cobra 是 Go 生态中最流行的 CLI 框架之一,它内置了…

2026/10/15 19:28:21 阅读更多 →
前端开发基础必读:HTML/CSS/JavaScript底层逻辑与调试实战

前端开发基础必读:HTML/CSS/JavaScript底层逻辑与调试实战

“第一章前端开发技术基础”,看到“基础”两个字,不少人的第一反应是直接跳过。说实话,这一章内容看起来确实不比那些花哨的实战项目吸引人,没有动画,没有交互玩法。但我在实际帮转行朋友做入门辅导、也帮网页相关专业…

2026/10/15 19:28:21 阅读更多 →
分数阶累加原理与Python实现:从矩阵构造到时间序列预测

分数阶累加原理与Python实现:从矩阵构造到时间序列预测

1. 分数阶累加到底在算什么分数阶累加这个概念,第一次听到的人多半会愣一下。累加就是累加,1加2加3,怎么还整出分数阶来了?我当初也是这个反应。后来在做一个时间序列预测的小项目时,被一个老哥提醒了一句“你试试分数…

2026/10/15 19:28:21 阅读更多 →
从网站架构到渗透测试:Web安全入门第一课

从网站架构到渗透测试:Web安全入门第一课

1. 为什么讲渗透测试要从“什么是网站”开始我刚开始接触Web安全的时候,也犯过一个典型的错误:拿着扫描器到处跑,看到几个漏洞报告就觉得自己入门了。结果面试官问了一句“一个HTTP请求从输入URL到页面显示,中间经过了哪些节点&am…

2026/10/15 19:28:21 阅读更多 →
RAP2本地部署全攻略:API管理与Mock数据实践

RAP2本地部署全攻略:API管理与Mock数据实践

1. 先搞清楚RAP2解决了什么问题有段时间我手上同时推进三个前后端并行开发的小项目,后端接口还没完全定义好,前端已经进入联调期。每天都有人来问"这个接口到底返回什么结构""字段名是id还是_id""分页参数叫page还是currentPag…

2026/10/15 19:27:21 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →