首页 / 资讯中心 / 文章详情

从DOOM到自动化测试:AI Agent决策模型如何让测试脚本自己找路

从DOOM到自动化测试:AI Agent决策模型如何让测试脚本自己找路 ★ FEATURED ARTICLE
1. 从一局游戏录像说起为什么会玩和会测是同一件事第一次看到Jev这个代号是在一个自动化测试交流群里。有人丢出一段录屏一个智能体在模拟环境里反复尝试打开某个界面、点击按钮、读取状态失败之后自己换了一条路径重来最后把整个流程跑通了。群里有人开玩笑说这玩意儿打游戏肯定也不差。我当时的第一反应是——这话其实说到了点子上。DOOM 这类第一人称射击游戏本质上是一个部分可观测、状态连续变化、动作有代价的决策环境。你看到的画面只是当前视角敌人可能从背后出现弹药有限走错一步就要重来。而自动化测试面对的是什么一个界面元素可能因为加载慢而暂时不可见一个弹窗可能随机出现打断流程一次点击可能触发异步请求导致后续状态不确定。这两件事在决策模型层面几乎是同构的。所以Jev从 DOOM 到自动化测试的 AI Agent 决策模型这个标题真正想聊的不是用 AI 打游戏这种猎奇话题而是一个更硬核的问题如何把游戏 AI 里那套感知—决策—行动—反馈的闭环迁移到自动化测试这种工程场景里让测试脚本从死板的录制回放进化成会自己找路的智能体。这篇文章适合三类人看。第一类是做自动化测试、被脆弱脚本折磨过的工程师你会看到为什么传统方案在复杂界面下必然失效。第二类是对 AI Agent 决策模型感兴趣、想找个具体落地场景的开发者自动化测试是一个比打游戏更有商业价值的试验场。第三类是刚入门、想理解智能体到底怎么决策的读者我会尽量用生活化的类比把原理讲透。需要先说明一点Jev 在这里我把它当作一个决策模型的设计思路代号来讨论而不是某个具体开源项目的名字。下面的内容是基于游戏 AI 决策 自动化测试这个交叉场景结合常见工程实践做的合理推演和方案设计。你完全可以把这套思路套到自己手头的测试框架上。2. 拆解标题里的三个关键词DOOM、自动化测试、决策模型2.1 DOOM 场景到底特殊在哪很多人以为游戏 AI 难在反应快其实不是。DOOM 这类环境真正难的地方有三个。第一是部分可观测。你的智能体只能看到当前视角的画面地图的其余部分、敌人的位置、道具的分布全都是未知的。它必须一边行动一边更新自己对世界的认知。这跟自动化测试里页面只渲染了可视区域、DOM 树里还有大量懒加载节点的情况一模一样。第二是动作空间连续且带代价。移动、转向、射击每个动作都会改变状态而且有些动作是不可逆的比如开枪消耗弹药、走进死胡同。测试里也一样一次提交表单可能就真的写入了数据点错了删除按钮可能就回不去了。第三是奖励稀疏。一局游戏打几分钟可能只有最后通关才给一个正反馈。中间大部分时间智能体都在瞎逛。测试场景里一个端到端流程可能十几步只有最后断言通过才算成功中间任何一步失败都拿不到有效信号。理解了这三点你就明白为什么简单的如果 A 就 B规则引擎在复杂场景下会崩——它没法处理不确定性也没法从稀疏反馈里学习。2.2 自动化测试的痛点和游戏惊人地相似我做过几年自动化测试踩过的坑基本可以归成几类你会发现它们和 DOOM 的难点一一对应。测试痛点具体表现对应游戏难点元素定位脆弱改个样式、换个 ID脚本全挂部分可观测环境动态变化时序不确定异步加载、动画延迟导致找不到元素状态连续变化动作有延迟流程分支多弹窗、引导、AB 实验打断主流程动作空间大路径不唯一断言难设计只有最终结果可验证中间态难判断奖励稀疏维护成本高用例越写越多改一处动全身策略无法泛化每个场景重写传统方案怎么应对加显式等待、加 try-catch、加各种兜底重试。这些手段本质上是用工程补丁去对抗不确定性能缓解但治不了根。因为它们的决策逻辑是写死的环境一变就得人来改。而 AI Agent 决策模型的思路是不写死路径让智能体自己根据当前观测去选动作失败了就调整策略。这正好是游戏 AI 几十年积累下来的东西。2.3 决策模型不是大模型别搞混这里要澄清一个常见误解。一说到 AI Agent很多人立刻想到大语言模型。但决策模型和语言模型是两回事。语言模型擅长的是理解和生成文本它能读懂点击登录按钮这句话是什么意思。但在当前页面状态下我应该先点登录还是先关弹窗这种序贯决策问题语言模型并不天然擅长因为它没有内置的试错—反馈—更新机制。Jev 这类决策模型的核心通常是一个策略网络或者价值评估模块它输入当前状态页面截图、DOM 特征、历史动作序列输出下一步动作的概率分布或者每个动作的预期收益。语言模型可以作为它的感知前端和动作翻译器但决策本身靠的是强化学习或者搜索算法。打个比方语言模型像一个懂很多知识的顾问能告诉你登录一般要点哪个按钮决策模型像一个老练的操作员能在具体局面下判断现在这个弹窗挡着得先关它。两者配合才是完整的智能体。3. 决策模型的核心骨架感知、策略、记忆、反馈四件套3.1 感知层把界面变成智能体能看懂的状态智能体要决策首先得知道现在是什么情况。这一步叫状态表征。在 DOOM 里状态可以是原始像素也可以是提取后的特征敌人距离、血量、朝向。在自动化测试里状态来源更丰富视觉信息页面截图用卷积网络或者视觉编码器提取特征结构信息DOM 树、可访问性树转成图结构或者序列语义信息把界面元素用文本描述出来交给语言模型编码历史信息过去几步做了什么、结果如何我实测下来纯视觉方案在界面变化大的场景下泛化更好但精度不够纯 DOM 方案精度高但一改结构就失效。比较稳的做法是融合视觉给粗粒度定位DOM 给精确坐标语义给动作意图。三者拼成一个状态向量喂给策略网络。这里有个容易忽略的细节状态要做归一化。不同分辨率、不同缩放比例下同一个按钮的像素坐标完全不同。如果不归一化模型学到的策略换个屏幕就废了。常见做法是把坐标转成相对页面的百分比把尺寸转成相对视口的比例。3.2 策略层从写死的 if-else到学出来的概率分布策略是决策模型的心脏。它要回答一个问题给定当前状态选哪个动作最好传统脚本是确定性的if 元素存在 then 点击。策略网络是概率性的输出点击登录 0.7、关闭弹窗 0.2、等待 0.1这样的分布然后按概率采样或者取最大值。为什么用概率而不是直接取最大因为探索。如果每次都选当前认为最好的动作智能体可能永远发现不了更优路径。就像测试时你总点同一个按钮永远不知道另一条路是不是更快。概率采样让智能体有机会尝试看起来没那么好的动作从而积累更全面的经验。策略的学习方式主要有两种。一种是模仿学习拿人工操作的录屏当示范让模型学着模仿。上手快但天花板受限于示范数据的质量。另一种是强化学习让智能体自己在环境里试根据结果好坏调整策略。上限高但训练慢、样本效率低。我的经验是先用模仿学习冷启动再用强化学习微调。纯强化学习从零开始在测试这种奖励稀疏的场景里可能跑几万步都学不到东西。先用人工示范把基础策略带起来再让它自己探索边界情况效率高得多。3.3 记忆层为什么智能体需要记住刚才发生了什么DOOM 里有个经典问题智能体走进一个房间转了一圈没找到出口出来之后又走进同一个房间。因为它没有记忆每次看到的都是新房间。测试场景里同样的问题智能体点了一个按钮没反应等两秒又点一次还是没反应再点一次……它不知道自己已经点过了。或者它关了一个弹窗刷新页面后弹窗又出现它又去关陷入循环。解决办法是给智能体加记忆模块。最简单的是一张已访问状态表记录去过哪些状态、做过哪些动作。复杂一点的是用循环神经网络或者 Transformer 维护一个隐状态把历史信息压缩进去。实操中我建议至少记录三样东西动作历史做过什么、结果历史每次动作后状态怎么变、失败历史哪些动作在哪些状态下失败过。第三样尤其重要它能帮智能体避开已知的死路而不是反复撞墙。3.4 反馈层奖励怎么设计决定了智能体学成什么样奖励设计是决策模型里最考验功力的部分。设计得好智能体自己就能找到正确路径设计得差它会学会一堆你意想不到的歪招。测试场景的奖励可以分几层终局奖励整个流程跑通给 100中途崩溃给 -100过程奖励每正确识别一个元素 1每触发一次有效状态变化 2惩罚项重复动作 -1超时 -5非法操作 -10这里有个坑我踩过过程奖励给太多智能体会刷分。比如它发现反复识别同一个元素就能一直拿 1于是原地打转。解决办法是给过程奖励加衰减或者只在首次达成某个子目标时给奖励。另一个坑是奖励和真实目标不一致。你希望它跑通业务流程结果它学会了只要不报错就行于是遇到问题就跳过。这时候要在终局奖励里加重惩罚让它明白跳过不等于通过。4. 把 DOOM 的打法搬到测试里一次完整的决策流程推演4.1 场景设定一个带弹窗和异步加载的登录流程假设我们要测一个登录流程理想路径是打开页面 → 输入账号 → 输入密码 → 点击登录 → 等待跳转 → 验证首页元素。但实际环境里有一堆干扰打开页面后可能弹出隐私政策弹窗需要先关闭账号输入框可能是懒加载的需要等它出现点击登录后可能弹出图形验证码跳转后首页可能还在加载需要等关键元素出现传统脚本会写成一条直线任何一步不符合预期就挂。智能体则要在这个环境里自己找路。4.2 状态表征的具体设计我设计的状态向量包含四部分视觉特征页面截图缩放到 224x224过一遍轻量卷积网络得到 128 维向量元素特征当前可交互元素列表每个元素用类型、文本、位置、是否可见四元组表示最多取 20 个不足补零历史特征最近 5 步的动作和结果编码成 64 维向量全局特征当前 URL、页面标题、已耗时编码成 32 维向量四部分拼接成一个约 300 维的状态向量。这个维度不算大普通全连接网络就能处理推理延迟可以控制在几十毫秒满足实时决策需求。4.3 动作空间的定义动作空间要设计得既够用又不冗余。太少了智能体没法完成任务太多了学习难度爆炸。我定义的动作集是这样的click(element_id)点击某个可交互元素input(element_id, text)向输入框填入文本wait(ms)等待一段时间scroll(direction)滚动页面back()返回上一页assert(condition)断言某个条件成立其中element_id是从当前元素列表里选的text是从预置的测试数据里选的。这样动作空间是离散且有限的策略网络输出一个固定长度的概率分布就行。4.4 一次决策的完整链路假设当前状态是页面刚加载完检测到一个隐私政策弹窗登录表单被遮挡。感知层输出状态向量其中视觉特征显示有个半透明遮罩元素特征里关闭弹窗按钮可见度最高。策略层根据状态输出动作概率click(关闭弹窗) 0.65、click(登录按钮) 0.15、wait 0.1、其他 0.1。记忆层检查历史发现关闭弹窗这个动作在当前状态下没做过允许执行。执行点击关闭弹窗页面状态变化弹窗消失登录表单完全可见。反馈层给这次动作 2 分因为触发了一次有效的状态变化遮挡解除。然后进入下一轮决策这次状态里登录表单可见策略层大概率会输出input(账号框)。整个流程就是这样一轮一轮推进的。每一步都不需要人写死先关弹窗再登录智能体自己从状态里读出了这个顺序。4.5 失败之后怎么恢复真正体现决策模型价值的是失败恢复能力。假设智能体点击登录后页面弹出了图形验证码。传统脚本到这里就挂了因为它没预料到这一步。智能体则会感知到状态变化出现了新的图像元素在记忆里搜索类似状态出现过吗发现没有策略网络输出几个候选动作wait、click(刷新验证码)、back尝试wait发现验证码还在尝试click(刷新验证码)验证码变了但还是需要输入最终识别出这是需要人工介入的环节触发告警并保存现场注意最后一步——智能体不是万能的它要知道自己什么时候该求助。这比硬着头皮乱点有价值得多。我在设计时会给触发告警也设一个正奖励鼓励它在确实无法处理时及时上报而不是把环境搞乱。5. 训练这套模型时我踩过的五个坑5.1 坑一奖励稀疏导致智能体摆烂最开始我用纯终局奖励跑通 100失败 -100。结果训练了几万步智能体学会了一个最优策略什么都不做等超时。因为随机乱点的期望收益是负的而不动至少不会扣分。解决办法是引入课程学习。先让它在一个简化环境里学没有弹窗、没有异步加载跑通率上来了再逐步加干扰。同时加过程奖励让它每完成一个子目标都有正反馈。这样它才有动力往前走。5.2 坑二状态表征里混入了噪声有段时间模型表现很不稳定同样的页面有时能跑通有时不能。排查后发现是状态表征里包含了时间戳这个特征。不同时间跑时间戳不同状态就不同模型学到的策略被这个无关变量干扰了。教训是状态表征里只放和决策相关的信息。时间戳、随机 ID、会话 token 这类每次都变的东西要么去掉要么做归一化处理。5.3 坑三动作空间里的隐形陷阱我定义了一个scroll动作本意是让智能体滚动页面找元素。结果它学会了无限滚动——因为滚动这个动作本身不扣分而滚动之后状态会变偶尔还能刷到过程奖励。后来我给滚动加了限制同一方向连续滚动超过 3 次就扣分。同时规定只有滚动后发现了新的可交互元素才给奖励。这样它就不会为了滚动而滚动了。5.4 坑四模仿学习的示范数据质量参差不齐冷启动阶段我收集了一批人工操作录屏。问题是不同人操作习惯不一样有人喜欢先关弹窗有人喜欢直接点登录弹窗会自动消失。模型学的时候被这两种策略拉扯学出来的东西四不像。解决办法是对示范数据做筛选和标注。只保留高效且成功的轨迹把那些绕远路、试错多的剔除掉。同时给不同轨迹打上质量分训练时按质量加权。数据干净了模型收敛快很多。5.5 坑五训练环境和真实环境不一致训练时用的模拟页面是我自己搭的元素 ID、加载速度都可控。部署到真实环境后模型表现断崖式下跌。原因是真实环境的页面结构、网络延迟、渲染时序都和模拟环境有差异。这是仿真到现实的鸿沟问题游戏 AI 里也很常见。缓解办法有两个一是域随机化训练时故意随机化加载延迟、元素位置、页面尺寸让模型见过足够多的变化二是在线微调部署后允许模型在真实环境里继续学习慢慢适应。6. 这套思路适合什么场景不适合什么场景6.1 适合的场景不是所有测试都值得上决策模型。我总结了几条判断标准流程分支多、路径不唯一比如注册流程有邮箱注册、手机注册、第三方登录多条路环境动态性强弹窗、引导、AB 实验频繁打断主流程维护成本已经很高脚本三天两头挂人力都花在修脚本上了有足够的试错空间测试环境可以随便折腾不会造成真实损失满足这些条件的场景决策模型的收益最明显。因为它擅长的就是在不确定环境里自己找路。6.2 不适合的场景反过来这些场景用传统脚本更划算流程固定、环境稳定比如纯接口测试输入输出确定没必要上智能体对确定性要求极高比如金融交易的核心链路不允许任何探索性操作样本极少整个流程就跑几次训练数据都不够模型学不出东西实时性要求苛刻决策模型推理有延迟毫秒级响应的场景扛不住我的建议是混合使用核心稳定流程用传统脚本保证确定性边缘易变流程用决策模型兜底。两者不是替代关系是互补关系。6.3 成本收益的粗略估算上一套决策模型前期投入不小环境搭建、数据收集、模型训练、调参少说也要几周。但一旦跑起来维护成本会显著下降。我做过一个粗略对比某业务流程有 30 个测试用例传统脚本每月因为界面变动平均挂 8 次每次修复平均 0.5 小时一个月 4 小时。上决策模型后模型自己适应了大部分变动每月只需人工介入 1-2 次约 1 小时。省下的时间一年就是几十小时还不算因为脚本挂了导致漏测的风险成本。当然这个账因团队而异。用例越多、变动越频繁决策模型的性价比越高。7. 从决策模型到真正的智能体还差什么7.1 自我反思能力现在的决策模型大多是反应式的看到状态选动作执行。它不会在失败后停下来想我为什么失败。更高级的智能体应该有反思模块一次流程失败后回放整个动作序列定位是哪一步导致了失败然后把这条经验存进记忆下次遇到类似状态时避开。这其实就是把强化学习里的经验回放和语言模型里的思维链结合起来。7.2 工具调用能力测试场景里智能体不只需要点击和输入还可能需要调用外部工具查数据库验证数据、调接口准备测试数据、发消息通知相关人员。这些能力靠纯策略网络实现不了需要给它接一个工具调用接口。这也是当前 AI Agent 研究的热点方向让决策模型不仅能选点击哪个按钮还能选调用哪个工具、传什么参数。7.3 多智能体协作复杂测试场景可能需要多个智能体分工一个负责准备数据一个负责执行主流程一个负责验证结果。它们之间需要通信和协调。这块目前还比较前沿工程落地案例不多。但思路是清晰的每个智能体有自己的专长策略通过一个协调器分配任务、汇总结果。7.4 可解释性这是工程落地最大的障碍之一。传统脚本挂了你看代码就知道哪一步错了。决策模型挂了你面对的是一堆权重和概率很难说清它为什么选了那个动作。解决办法是加决策日志每次决策时记录状态摘要、候选动作、各动作的概率、最终选择、执行结果。出问题时回放日志虽然不能完全解释但至少能定位到是哪一步决策出了问题。再配合可视化把状态和动作画出来排查效率会高很多。8. 给想上手的人的几条实操建议如果你看完想自己试试我给几条实在的建议。第一别一上来就搞强化学习。先用模仿学习跑通闭环验证整个链路是通的。强化学习调参能调到你怀疑人生没有闭环验证之前不要碰。第二状态表征宁简勿繁。我见过有人把整个 DOM 树序列化塞进状态里维度几万训练慢得离谱。先用手工特征够用就行不够再加。第三奖励设计要反复迭代。第一版奖励几乎不可能设计对做好改十版的准备。每次改完观察智能体的行为看它有没有学会奇怪的策略。第四一定要有兜底机制。智能体再聪明也会遇到处理不了的情况。设计好什么时候放弃、什么时候告警、怎么保存现场比追求 100% 成功率更重要。第五从简单场景开始。别一上来就挑战最复杂的业务流程。找一个分支适中、干扰可控的场景先跑通积累经验再扩展。第六记录一切。状态、动作、奖励、结果全都记下来。训练不收敛的时候这些日志是你唯一的线索。最后分享一个我自己的体会决策模型不是要取代测试工程师而是把工程师从修脚本这种重复劳动里解放出来去做更有价值的事——设计测试策略、分析测试结果、探索新的测试场景。工具越智能人的判断力越值钱。这个方向值得投入但别指望它一夜之间解决所有问题。
阅读完成 · 觉得有帮助?
咨询建站