1. AITS到底解决什么问题:从传统自动化的痛点说起
先交代一下背景。我所在的团队负责多条业务线的回归测试,自动化脚本攒了快三千条。表面上跑得热火朝天,实际上每个迭代光修脚本就要花掉三四个人日,脚本写得越多,维护欠账越多,CI的绿灯越来越难等。后来我们开始调研AI自动化测试平台AITS,从POC到线上小规模接入,前前后后折腾了几个月,有些心得体会值得记录下来。
AITS本质上不是"录脚本换了个工具",而是把AI能力嵌到自动化测试的每个关键环节里:用例生成、元素定位、断言判断、失败分析、回归范围推荐。它解决的问题说穿了只有三类:脚本维护成本、断言可信度、回归策略的精准度。这三件事恰恰是传统自动化长期解决不好的老问题。
传统UI自动化的痛点,我总结为三座大山。第一座是定位稳定性,页面一改版,xpath、id、CSS选择器全部失效,脚本比需求文档还容易过期。第二座是断言质量,大部分团队写着写着就退化成"只要页面没崩、元素存在就算通过",断言形同虚设。第三座是维护人力,自动化用例越多,维护成本越接近线性增长,最后直接把团队拖垮。而AITS这类AI平台,核心价值就是在这三座大山上换了一种打法:用模型推理替代硬编码规则,用多模态信息替代单一属性匹配,用历史数据训练替代人工经验判断。
要泼一盆冷水的是,AITS不是银弹。它改变的是自动化的成本结构,而不是消灭成本。你依然需要写场景设计、维护测试数据、分析失败原因,但平台能把那些重复性最高、最枯燥的部分接走。对中小团队来说,介入路径可以从单一模块开始,而不是全量上线,后续我会专门讲这个渐进式接入的思路。
2. 模块设计与架构选型:AI平台该怎么搭
2.1 分层架构:为什么AI能力必须独立成服务
看过几个商业化测试平台的架构文档,也参考过开源方案,我比较认可AITS的分层思路:执行层、智能层、管理层三层分离。执行层负责跑用例,兼容Selenium、Appium、Playwright这类驱动;智能层是AI能力的中枢,负责定位、生成、分析、预测;管理层是Web控制台加API,管项目、用例、报告、模型。
这里最关键的设计决策是:AI能力一定要拆成独立服务,哪怕初期规模很小。原因有二。其一,执行节点是高频伸缩的,跑回归要扩容10个agent,跑冒烟只要2个,如果AI能力嵌在agent里,扩容成本很高,模型加载和推理也会占用执行资源。其二,AI模型迭代频率远高于执行引擎,今天要升级一个定位模型,总不能让所有执行节点跟着重启。拆成独立服务后,执行层通过gRPC或HTTP调用智能层,两边各自部署、各自伸缩,这个取舍在踩过几次扩容的坑后体会更深。
我建议的拓扑是:一个控制面服务,三到五个执行节点,一个模型推理服务(GPU可选,纯CPU也能跑但延迟高),再加ES、Redis、对象存储做数据底座。执行节点建议用Docker容器跑,模型服务独立部署,两者之间加一层超时和降级策略。AI服务挂了,执行层自动降级为传统定位方式,业务不会被完全阻断。
2.2 测试资产模型:四类资产的沉淀方式
AITS对测试资产的抽象值得学习,它把资产分成四类:脚本资产(用例代码/流程定义)、对象资产(页面元素的多模态描述)、数据资产(测试数据与Mock)、模型资产(训练好的定位、分类、生成模型)。这四类资产全部纳入版本管理,跟着项目走。
对象资产这块变化最大。传统对象库存的是"id=submit_btn"或"xpath=//div[2]/button",脆弱且脱离上下文。AITS的对象资产管理的是元素的多模态指纹:DOM结构特征、位置特征、视觉特征、文本特征、相邻元素关系。每个对象不是一条记录,而是一个特征向量集合。页面改版后,旧定位失效,平台用这个指纹集合去新页面里做相似度检索,找到最可能的替代元素,这就是自愈的基础。
脚本资产建议直接用Git管理,用平台的项目ID做namespace。我们刚开始没做脚本资产隔离,所有用例堆在一个仓库里,分支冲突频繁,后来按业务线拆成多个仓库,用AITS的项目级CI触发,清爽很多。数据资产单独管理有个好处:AI生成的用例需要数据,传统录制的用例也要数据,如果不做统一的数据工厂,用例生成得再多也会被数据卡住。
2.3 调度引擎与资源分配
调度这块,AITS用的是任务队列加优先级抢占的模式,每个执行节点从队列里拉任务,而不是由调度器硬分发。这个设计的好处是节点上下线对调度无感,扩容就是加节点,缩容就是掉节点,任务自然重新分配。
资源分配要关注两个参数:并行度和单用例超时。并行度不是越大越好,我见过一个团队把并行度拉到20,结果被测服务被压垮,全是超时假失败,最后误报率比串行还高。我们实测下来,同一套被测环境,并行度控制在5到8,失败率最低。单用例超时建议设为常规耗时的3倍,太短会误杀慢接口,太长会拖垮整体回归耗时。还有一类是资源组隔离,把高优先级发布验证和低优先级 nightly 回归放在不同资源组,避免互相抢占。
2.4 报告与数据闭环:模型优化要从数据里来
平台的报告系统不只是展示pass和fail,更重要的是积累数据。每个失败用例都要有快照:截图、DOM、日志、执行轨迹、AI分析结论、人工处理结果。这些数据是后续训练判断模型的原料。没有这个闭环,AI能力就是一次性玩具,只有把每一次失败的人工判断结果回流给平台,模型才会越用越准。
这也是选型时候的一个关键评估点:看平台能不能导出结构化的失败数据,能不能把人工标注的结论再导入训练集。有不少平台AI效果演示得很漂亮,但数据封闭,用久了价值会衰减。AITS的开放API在这里帮了大忙,我们后续把失败数据导入了内部的数据仓库做二次分析。
3. AI能力拆解:平台里的几个核心模型怎么工作
3.1 智能用例生成:从接口定义到场景补全
AITS的用例生成不是只靠大模型吐一堆自然语言步骤,而是有输入源和生成约束的。常见输入源有三类:接口文档(OpenAPI/Swagger)、录制轨迹的页面上下文、历史缺陷记录。
拿接口文档生成举例。我们有个订单服务,导入了OpenAPI之后,AI自动生成了约两百条接口用例,内容覆盖正常入参、边界值、必填缺失、字段类型错误、鉴权失败这些场景。它输出的不是一段"建议",而是可以直接执行的用例脚本,包括请求体、期望状态码、断言表达式。这个过程的原理是模型学习过大量接口测试的规律,输入schema后能推演出测试意图。
生成UI用例的方式不太一样。录制过程中,平台会记录每个操作的前后页面状态,包括DOM树、页面截图、操作坐标,这些上下文信息喂给生成模型后,AI能理解"这一步是在填充表单,下一步应该是提交",然后把流程总结成可复用场景。这样生成的用例要比纯录制回放健壮得多,因为脚本绑定的是业务语义而不是坐标点。
生成用例的覆盖率有没有提升,要量化才可信。我们在一套老系统上做了对比:原来人工维护的用例覆盖核心接口60%左右,AI补充后覆盖率达到87%,但有一个副作用是冗余用例变多,特别是两两组合类用例重复度很高。后来我们用了一个去重策略,按请求参数哈希合并相似用例,才把用例数量压了下来,执行时间回到可接受范围。
3.2 元素定位与脚本自愈:相似度阈值怎么定
自愈机制是AI自动化测试平台里最容易出效果、也最容易被吐槽的模块。原理简单说:元素定位失败后,AI不再直接报错,而是用目标元素的历史特征去当前页面做匹配,找到最相似的候选,按相似度决定是自动替换、人工确认,还是放弃。
这里有一个核心概念叫相似度阈值。阈值设置太高,比如0.95,自愈能接住的场景很少,大部分还是会报错;阈值太低,比如0.6,AI会把不相关的元素替换进来,导致用例在不该通过的地方通过,造成"假绿",比失败更危险。我们实践下来的经验是:默认阈值0.85,操作类元素(按钮、链接)可以降到0.8,但断言类元素必须保持在0.9以上,因为断言错了等于整个用例白跑。
自愈用的匹配维度,实际看下来主要有三个:视觉特征、DOM结构、页面文本。视觉特征用图像Embedding比对页面截图中的元素局部图;DOM结构比对的是路径相似度、标签类型、属性集合;页面文本比对的是按钮名、标签文字或是OCR识别的结果。这三个维度会加权汇总成一个综合相似度。我们遇到最多的情况是:按钮文案从"提交订单"改成"确认下单",文本相似度不够但视觉和位置相似度很高,综合分能到0.87左右,刚好能被自愈接住。
自愈不建议一开始就全量开启。稳妥的做法是:先跑一段时间"影子模式",即AI正常执行自愈逻辑但不真正替换,只把候选元素和责任原因写到报告里。人工观察一周,确认候选质量可以了,再开启自动替换,同时配置告警,每次自愈发生都通知相关人。这样既能享受自愈的收益,又不会被它的错误反噬。
3.3 智能断言与失败聚类:减少"狼来了"效应
传统断言写死了期望值,一旦页面样式微调或者返回字段顺序变化就容易误报,测久了团队就麻木了,看到失败先怀疑是脚本问题,这就是"狼来了"效应。AITS的智能断言不是简单地把断言交给大模型,而是区分了两种能力:断言生成和失败分析。
断言生成是指AI根据操作上下文自动建议断言点。比如你提交了一个表单,AI会建议你断言三个方向:接口的响应码和关键字段、页面上出现的成功提示、以及列表页里是否出现了新数据。这些断言的权重还会根据历史稳定性自动调整。那种历史上一百次都稳定的断言,权重会上升;那种每次都受影响波动的断言,权重会被调低。
失败聚类的实际价值很大。一次回归跑下来,几百个失败用例,绝大部分是同一个根因导致的,比如某个服务挂了指路、环境数据被污染、某个公共组件样式翻车。AI会把失败用例根据失败截图特征、日志关键词、堆栈信息、断言差异做聚类,把同根因的失败归并为一个"问题组"。我们之前周五下午跑回归,两百多个失败用例,平台聚类后只生成12个问题组,排查成本直线下降。这个功能在传统自动化里完全不存在,却是日常最省时间的模块。
3.4 风险预测与回归范围推荐:从全量回归走向精准回归
全量回归是保险做法,但当用例达到几千条,全量回归一次下来要四五个小时,节奏根本跑不动。AITS的回归范围推荐利用了两个信号:代码改动影响面和历史缺陷密度。改动影响面通过分析本次提交涉及的服务、接口、页面模块,在知识图谱里找到关联用例;历史缺陷密度则是找出哪些功能模块容易引入回归,提高这些模块相关用例的权重,即使代码改动波及不大,也会被优先纳入。
我用模拟项目X的实践来说明这个流程的可操作性:我们每次代码提交后,平台自动生成推荐回归用例集,包含必选用例和推荐用例。必选用例是受变更直接影响的高优先级用例,推荐用例是历史缺陷高发区的例行巡检用例。刚开始团队不放心,跑推荐集的同时还跑全量回归做对照,并行了一个月。统计结果看,推荐集覆盖了全量回归能发现的缺陷的92%,但执行时间只有全量回归的35%。这个数据给了团队信心,后面发布前的回归策略就逐步切换到以推荐集为主了。
这里要提醒一句:风险预测模型不是万能的,代码改动分析依赖提交信息质量和文件到测试用例的映射,映射关系需要持续维护。AI模型给出的推荐集,最终仍要由测试负责人把关,尤其是核心交易链路,再推荐也不能漏。
4. 落地实操:把AITS接入模拟项目X的完整过程
4.1 部署与环境准备:最小可用集开始
我们接入的模拟项目X是一个典型的电商类单体应用,前端Vue,后端Spring Boot,接口有三四十个,核心链路包括登录、浏览商品、加购物车、下单支付、订单查询。这个规模正好适合做AITS的试点,不至于太小没参考性,也不至于太大不好控制。
部署上,AITS推荐用Docker Compose起步。服务包括:
- console:控制台,提供Web界面和API
- executor:执行节点,可以起多个副本
- ai-server:模型推理服务
- redis:缓存和任务队列
- minio:存储截图、日志、模型文件
- elasticsearch:存储用例和报告索引数据
配置上注意几个点。ai-server的模型加载比较吃内存,建议至少8GB以上,执行节点内存建议4GB每副本,磁盘主要被截图和日志占用,单次全量回归下来可能有几个GB,要给够。超时配置我建议分三级:AI推理超时3秒、单步操作超时15秒、单用例超时180秒。首次启动时,ai-server需要加载模型,耗时较长,检查健康检查接口返回后再接入执行任务。
4.2 建立第一条AI自动化流水线
接入的流程建议按下面这个顺序走,能少踩不少坑:
第一步,在控制台创建项目模拟项目X,配置Git仓库和CI触发规则。第二步,导入接口文档,平台自动解析出接口列表和参数schema。第三步,录制关键路径。建议先录制登录到退出的完整流程,再录制加购到提交订单的核心交易链路。第四步,触发一次"AI增强"操作,让平台基于历史数据和接口定义自动补充用例。第五步,执行一次试运行,检查生成的用例是否有明显的断言缺失或错误。第六步,开启自愈影子模式,跑一到两个迭代,观察自愈命中率和准确率。第七步,等影子模式的指标稳定后,打开自愈自动替换和风险预测推荐集。
这个顺序的核心逻辑是:先让平台积累基础资产(接口、对象、用例),再进入AI增强阶段,最后才开启有影响能力的开关。我们当时因为项目排期紧,跳过了影子模式直接开自愈,结果第三周就出现了一次错误自愈导致假绿,花了两天才排查出来。后来老老实实退回到影子模式跑了两轮,再就没有出过类似问题。
4.3 反馈闭环:建立失败样本库
AITS是否越用越准,取决于有没有建立失败样本库。我们为模拟项目X维护了一个失败样本库,每当有失败用例被人工确认为"平台误判"或"环境问题",就把这个案例打标后回流给模型训练集。这个操作一开始挺麻烦,人力成本高,后来我们写了个脚本,把缺陷管理平台的处理结果自动同步回AITS,每周批量回流一次,基本不占用额外人力。
效果在两个月后体现出来。最初平台的失败聚类准确率我们评估大概在70%左右,经过样本回流和阈值调优,提升到接近90%。智能断言的误报也从最初的每周两三次降到了两三周一次。这个提升不是靠版本升级,而是靠数据喂养,这是AI平台和传统工具最大的区别。如果你们团队没有稳定的输入输出闭环,AI效果会一直停留在初期水平,要有这个预期。
5. 常见问题与排查技巧实录
5.1 高频问题速查表
把这段时间遇到的问题整理成一张表,都是可以直接照方抓药的场景。
| 问题现象 | 常见原因 | 解决方法 |
|---|---|---|
| 自愈替换后操作了错误元素 | 相似度阈值过低,视觉特征权重过大 | 提高断言类元素的阈值到0.9以上,调低视觉特征权重 |
| AI生成用例大量重复 | 对同一接口的多schema描述重叠 | 开启按参数哈希去重,按相似度聚类合并 |
| AI推理延迟高,用例超时 | 模型服务负载过高或与执行节点同机部署 | 拆分部署,给模型服务预留CPU/内存,加缓存 |
| 失败聚类把不同根因合并 | 日志关键词太少,聚类特征单一 | 增加截图特征和断言差异特征权重 |
| 自愈命中率低,替换少 | 对象资产特征采集不完整初始录制覆盖不足 | 重新录制关键流程,补充对象库特征 |
| 回归推荐集漏掉重要用例 | 代码影响面映射关系缺失 | 检查提交信息规范,维护文件到用例映射表 |
排查时有个基本思路:先看是执行层问题还是智能层问题。确认AI服务日志有没有报错,如果没有,再看执行节点的资源瓶颈和环境因素。不要一上来就怀疑模型,很多所谓AI问题其实是数据问题,数据不对,模型怎么调都没用。
5.2 三个实践中的深坑
第一个坑是单页应用(SPA)的虚拟DOM导致系统定位误判。传统自动化在SPA上体验就很怪,AITS也有自己的问题。我们遇到过路由切换后,旧元素在虚拟DOM里还残留着,AI误以为还在页面上,结果后续操作全都基于一个不存在的页面状态,导致一连串报错。解法是在关键页面切换后人为加一个"当前路由断言",强制AI确认页面状态已经变了,再继续后续操作,这个额外的状态锚点能省很多排查时间。
第二个坑是智能断言碰上动画和异步渲染。页面加载后总有加载动画、骨架屏、数据异步渲染,AI如果太快做视觉断言,截图里可能还是加载状态,造成误报。我们摸索了一套处理办法:断言前等待网络空闲(network idle),等待关键元素出现后,再额外等待500毫秒的稳定窗口,才执行视觉特征断言。这个"稳定窗口"策略对减少断言抖动非常有效,代价是每个用例多了半秒左右,完全可以接受。
第三个坑是模型版本迭代后回归对比失真。平台升级模型后,同一批用例的通过率会发生变化,这不是被测系统变了,而是模型判断口径变了。建议每次模型升级时,先拿最近一次全量回归的报告做基线对比,观察失败率和聚类结论有没有显著变化。如果有,及时跟平台方确认模型变更明细,该调整阈值就调整,不要等业务方来问"怎么这次的报告和上次对不上"。
5.3 关于AI平台可落地性的复盘建议
最后回归到选型和落地。AITS这类AI自动化测试平台,现阶段最适合的场景是:用例规模大、回归频率高、被测系统变更频繁、团队已经开始被脚本维护拖累。如果你的团队自动化用例只有几十条,那用传统工具加正则断言就够了,上AI平台反而多一层运维负担。
如果决定要落地,我给三个建议。第一个,先跑小规模POC,选一条核心链路,用平台的自愈和失败聚类模块单独跑一段时间,用数据说话,不要全量铺开。第二个,重视数据闭环,没有回流机制,AI能力用一个月和用一年没有区别。第三个,把平台当作基础设施来看,模型服务、执行资源、对象资产要有专人维护,或者至少要有明确的负责人,否则AI平台会迅速退化成一台昂贵的脚本执行器。
我个人在实际操作中的体会是,AI自动化测试平台最有价值的地方不在于某一个AI功能多炫,而在于它把测试团队从"脚本维护"的泥潭里拉出来,把精力重新聚焦到测试设计和质量判断上。如果你也正在被脚本维护、误报排查、回归范围选择这些事消耗,AITS值得你花一两周做个验证,看看它能不能真正接住你的痛点。