1. 破题:我们为什么要做 AI 智能化测试
先讲个背景。我在某中型互联网公司带测试团队的时候,遇到了一个特别头疼的场景:业务迭代速度越来越快,一个移动端应用每个版本要回归上千条用例,手工维护测试脚本的成本已经快压垮团队了。最典型的问题有三个——用例设计靠个人经验,漏测全靠运气;UI 自动化脚本一遇到页面小改动就批量失效,修脚本比写脚本还累;测试数据准备繁琐,环境不稳定,自动化跑起来经常"假失败"。
当时我们团队就下定决心做一个尝试:把 AI 引入到测试流程里,不是小打小闹地拿一两个工具试试水,而是从用例生成到自动执行,串一条完整的工程链路。这个项目我们内部叫"模拟项目X",核心目标很直接——用 AI 辅助测试设计、用 AI 增强自动化稳定性、用 AI 分析失败结果。整个项目做了大概四个月,踩了不少坑,也沉淀了不少能复用方法论。这篇文章就把我们的完整实践过程、关键决策逻辑和避坑经验整理出来,给正在做或准备做 AI 测试落地的同学一个参考。
先说清楚这套东西适合谁看:如果你是测试开发工程师、QA 负责人,或者所在团队已经有一定自动化测试基础、想在 AI 方向做工程化落地,那这篇文章的思路和代码片段可以直接参考。如果你团队连基础的自动化都没有,那我建议先把自动化地基打好,AI 是放大器,不是无中生有的魔法。
2. 整体架构设计与方案选型逻辑
2.1 先想清楚:AI 在这个链路里到底该扮演什么角色
很多团队一开始容易犯的错,是把 AI 当成"什么都干"的工具。我们第一版方案也差点这么干——想让 AI 直接根据需求文档生成完整可执行的自动化代码。结果试了之后发现,需求文档写得稍微模糊一点,生成的代码就跑不通;跑通了,断言逻辑又经常是错的。折腾了两周,我们终于想明白了一个关键问题:AI 的能力边界在哪里。
在我们最终落地的架构里,AI 只承担三个高价值且容错率允许的环节:
- 测试用例生成:把需求描述转成结构化的测试场景和用例步骤,人来做最终审核。
- 元素定位推荐:根据页面截图和 DOM 结构,AI 推荐稳定的定位表达式,替代人工肉眼排查。
- 失败结果分析:自动化跑挂了之后,AI 辅助判断是环境问题、脚本问题还是真实缺陷。
这三个环节有一个共同特点:AI 的输出不直接上生产,中间都有人工确认这一环。这非常重要,因为以目前的模型能力,直接让 AI 全自动生成并执行测试,风险太高。你可以理解为:AI 是实习生,干粗活快活,但每一份产出都需要一个 senior 做 review。
2.2 技术栈选型:不要为了 AI 而 AI
做方案选型的时候,我们也纠结过要不要上重模型平台。后来综合团队实际情况,定了这么一套轻量方案:
- 用例生成:基于大模型 API,使用结构化 Prompt 加少量示例(Few-shot),输出 JSON 格式的用例描述。
- 自动化框架:沿用团队已有的业务回归框架,底层是 Selenium 和 Appium,上层自己做了一层 AI 增强封装。
- 定位推荐:截图走视觉模型识别控件坐标,DOM 文本走规则加模型联合判断,两者交叉验证。
- 失败分析:把测试日志、截图、网络请求信息统一汇总,用模型做多模态诊断。
选这套方案的逻辑很简单:团队的既有资产是 Selenium/Appium 体系,迁移成本最低;AI 部分全部通过 API 接入,不自己训练模型、不部署推理服务。很多团队一上来就想训练私有模型,我强烈建议先别干这事。除非你有专门的数据科学团队和充足的高质量标注数据,否则在测试领域,直接用成熟的通用模型能力比自训模型靠谱得多,也便宜得多。
2.3 数据流与链路设计:让 AI 自然嵌入现有流程
链路设计上,我们坚持一个原则:AI 模块必须是可插拔的,不能绑架现有流程。具体的数据流向是这样的:
- 需求文档进入系统后,先由 AI 解析出核心业务规则和操作路径。
- AI 生成测试用例草稿,包括前置条件、步骤、预期结果,统一输出为 JSON。
- 人工在用例管理平台上 review、编辑、确认,确认后的用例自动同步到自动化工程。
- 自动化执行时,AI 辅助生成/修复元素定位器,跑完自动收集结果。
- 失败任务进入 AI 诊断流程,输出失败分类和初步分析结论。
整个链路里,AI 介入的点都被"人工确认"这个缓冲带夹住了,所以即使模型偶尔给出离谱的结果,也不会直接污染测试资产。这是我们所有设计中最重要的一条经验:AI 测试落地,流程控制比模型选型更重要。
3. 核心实现细节:用例生成、元素定位与失败诊断
3.1 用结构化 Prompt 做测试用例生成:模板与约束
用例生成这个环节,我们迭代了大概四五版 Prompt 才稳定下来。第一版就是简单地把需求文档丢给模型让它"写测试用例",结果输出千奇百怪,有的像操作手册,有的像验收文档,根本没法直接转成自动化脚本。后来我们引入了三层约束:
第一层,输出格式约束。要求模型输出严格的 JSON 结构,包含用例 ID、用例标题、前置条件、测试步骤列表、预期结果、优先级、关联需求编号。这个结构完全对齐我们用例管理平台的数据模型,输出后可以直接解析入库。
第二层,测试设计方法约束。我们要求模型在生成用例时遵循工程上成熟的测试设计方法,比如等价类划分、边界值分析、场景法、错误推测法,并要求模型标注每个用例所采用的方法。这样生成出来的用例不只是"能跑通",而且具备一定的测试覆盖率合理性。
第三层,业务上下文约束。Prompt 里要注入业务规则、用户角色、关键入口信息。这里有个实实在在的坑——很多团队把需求文档原封不动地丢给模型,结果模型把"需求描述里的示例数据"当成"固定断言值"来生成用例,导致生成的用例全是死值。我们后来要求模型区分"业务规则"和"示例数据",预期结果必须描述规则,不能引用具体示例值。
给大家看一个我们调试后的简化版 Prompt 要点:
输入: - 需求标题:用户登录功能 - 功能描述:用户输入注册手机号和密码,点击登录后进入首页;如账号不存在提示"账号不存在";如密码错误提示"密码错误";连续失败5次锁定账号30分钟。 - 业务规则:手机号需为11位大陆手机号;密码长度8-20位,必须包含字母和数字。 约束: 1. 输出 JSON 格式用例列表,字段必须包含:case_id, title, preconditions, steps, expected_results, priority, design_method 2. 必须覆盖以下设计方法:等价类、边界值、异常场景、业务规则冲突 3. expected_results 应描述业务规则约束,不得引用需求描述中的示例值 4. 每个用例的步骤控制在3-8步,前置条件必须包含所需测试数据的准备说明用了这个结构化模板之后,用例生成质量明显提升,人工审核通过率从最初的不到 40% 提升到了 75% 左右。这里说的"通过率"是指 test case 不需要大改、可以直接入库用于后续脚本开发的比例。
3.2 自动化执行与 AI 增强定位:解决"脚本都死在定位器上"的痛点
做过 UI 自动化的同学都懂,脚本最脆弱的就是元素定位。页面一个 class 改了,脚本直接挂一片。我们没有试图让 AI 彻底消灭这个问题,而是让它把修复成本降下来。
具体做法是这样:脚本执行失败后,我们做了一个统一的异常捕获模块,一旦定位失败,立即触发 AI 定位推荐流程:
- 截取当前页面截图。
- 同时抓取当前页面 DOM 结构,裁剪出目标元素附近的片段。
- 把截图和 DOM 片段打包发给多模态模型,Prompt 里带上原始定位表达式和失败原因。
- 模型返回推荐的候选定位表达式,按置信度从高到低排。
- 系统自动用候选定位器重新尝试,成功则记录并提示"已用 AI 推荐定位器修复"。
实测下来,在常见的页面改版场景中,AI 推荐的定位器首次命中率大概在 65% 左右。这个数字看着不算惊艳,但它省掉的工程维护时间非常可观。我们团队原来每周要花大概 8 到 10 个人时去修定位失效的脚本,用了 AI 辅助之后,这个时间压缩到了 2 到 3 个人时。
这里有一个重要的实操细节:不要让 AI 直接改脚本仓库,必须走"候选推荐 + 人工确认"的流程。我们刚开始尝试过让 AI 直接把新定位器写进代码,结果有一次模型推荐了一个非常不稳定的 index-based 定位器,虽然当时能跑通,但牵一发动全身,导致后续其他用例批量失败。所以最终方案是,AI 只生成一个"修复建议列表",真正的代码变更仍然需要测试开发工程师确认。
3.3 失败诊断分类:从"一张截图扔群里"到结构化分析
自动化跑完一堆失败用例,怎么快速判断该找开发还是该修脚本?这也是一个长期痛点。我们的 AI 失败诊断模块,本质上是一个"智能分类器 + 上下文总结器"。
数据采集阶段,失败用例会打包多个维度的信息:
- 测试日志最后 200 行
- 失败截图
- 执行时的请求和响应摘要(通过代理抓取)
- 当前用例对应的需求描述
然后 AI 会把这些信息汇总,输出一个结构化的诊断结论:失败类型(环境问题、脚本问题、真实缺陷、数据问题、超时问题)、推断原因、建议处理方式、涉及的可能模块。
这个模块上线后,最大的收益不在于 AI 的结论 100% 准确,而在于它把"需要人肉打开日志逐行看"变成了"先看 AI 结论,再针对性验证"。我们的失败用例分配效率提升了将近一倍。当然,AI 的结论我们也保留了置信度标记,低于阈值的会自动标为"无法确定,需人工介入"。
3.4 测试数据准备的智能化:被很多人忽略的环节
很多文章讲 AI 测试只讲用例和执行,但我个人认为,测试数据才是自动化执行中真正的隐形杀手。我们的实践中,专门做了一个轻量级的数据准备模块:AI 根据用例前置条件,自动生成 SQL 脚本或 API 调用序列,在测试环境中准备所需的数据。
举个例子,用例前置条件是"用户已登录且有 3 张绑定银行卡",AI 会生成对应的 API 调用串:注册用户、登录、绑卡三次,并在 Teardown 阶段清理数据。这个逻辑本身不复杂,但用 AI 来写这些胶水代码,确实省了很时间。要注意的是,这个模块对数据隔离要求很高,生成的数据必须带唯一前缀标识,防止跑到别人的测试数据。
4. 工程化落地的关键步骤:从 POC 到全量推广
4.1 第一阶段:跑通试点项目而非直接铺开
很多团队上 AI 测试最容易踩的坑,就是试点范围选太大。我们一开始也只选了一个业务线的一个核心模块,大概覆盖 50 条左右的自动化用例。选型的标准有三个:业务逻辑相对独立、数据准备不复杂、团队里有人愿意深度参与。
试点阶段我们只关注三个指标:AI 生成用例的审核通过率、AI 定位推荐的命中率、AI 失败诊断的准确率,以及最重要的——整个流程相比传统方式是否真的节省了时间。注意,前面三个指标再好,如果第四个指标不行,那 AI 落地就是花架子。我们做了一道非常朴素的对比:同样一个版本回归,传统方式从用例设计到脚本执行完成要多少人力时,AI 增强方式要多少人力时。最后测下来,整体节约了大概 30% 到 40% 的人力,这才坚定了我们全量推广的决心。
4.2 第二阶段:搭建 AI 模块与现有 CI 的对接
试点跑通之后,接下来的工作是把 AI 模块嵌入到已有的持续集成流水线里。这里面涉及一个很实际的问题——AI 接口调用是异步的,而且有延迟波动,如果直接在流水线里同步调用,整个构建时间会被拉长很多。
我们的做法是把 AI 服务独立部署,通过消息队列跟 CI 系统解耦。执行任务完成后,CI 只管把结果信息推到队列里,AI 服务消费队列、处理完再把结果写回平台。这样即使 AI 服务出现超时或者模型 API 抖动,也不会阻塞主流水线。这块架构细节是很多文章不会讲的,但实际落地的时候特别重要。
另外,模型 API 的费用也是要提前评估的。我们算过一笔账,一个版本跑下来大概 500 条用例,其中大概 20% 会触发 AI 增强能力,对应的 API 调用成本折合人民币大约几十块到一两百块。这个成本在公司层面是可以接受的,但如果你的自动化执行频率特别高,就要做缓存和降级策略,比如对同一个定位器的修复建议做一周内的缓存。
4.3 第三阶段:评估体系与持续优化
AI 系统上线后,不是就万事大吉了。模型会变、业务会变、页面会变,我们建立了一套轻量级的评估机制。每两周抽一批真实的用例生成结果、定位建议、失败诊断结论,由测试负责人打分,把打分结果反馈到 Prompt 优化和示例(Few-shot)调整上。
这里想强调一个容易被忽视的点:Prompt 和示例需要版本管理。我们最开始是在聊天工具里随手改 Prompt,后果就是经常出现"昨天还好的今天突然不行了"但根本不知道改了什么。后来我们学着代码管理的思路,把 Prompt 模板和示例全放到 Git 仓库里,每次修改走 review 流程,效果立刻就不一样了。AI 测试系统的迭代,本质上还是软件工程,版本管理、构建、发布、监控,一个都不能少。
5. 常见问题与排查技巧实录
5.1 模型输出不稳定怎么办
现象:同一个需求,同一个 Prompt,两次调用生成的用例有时差异很大,甚至某次直接输出格式错误的 JSON。
排查思路:先确认是不是模型版本变了,再看 Prompt 里温度参数是不是设置过高。我们在测试场景里把温度参数调到 0.1 到 0.2,显著降低了随机性。另一个非常有效的办法,是在 Prompt 里增加最少 2 到 3 个高质量示例,让模型仿照输出。我们迭代下来发现,示例质量比 Prompt 措辞的影响更大。
还有一个兜底方案:系统里加一个 JSON Parse 自动修复层。如果模型输出不合法 JSON,就用一个二次修复 Prompt 再做一次清洗。这个兜底不复杂,但能把"格式问题导致任务失败"的概率降到 5% 以下。
5.2 AI 推荐定位器在单页面上反复横跳
我前面提到的 index-based 定位器问题,背后其实是一个共性坑:模型倾向于推荐"当前能唯一匹配"的定位器,而这个定位器的鲁棒性可能很差。比如它会推荐//div[2]/span[3]这种,因为当前页面下确实能定位到元素,但页面一加节点就失效。
我们的对策是双保险:第一,在 Prompt 里明确要求优先推荐基于稳定属性的定位器,顺序是 id > name >>