ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI Agent驱动自动化测试:构建智能感知-决策-执行闭环平台

AI Agent驱动自动化测试:构建智能感知-决策-执行闭环平台 简介这是一套面向中高级测试工程师与AI工程实践者的AI驱动型自动化测试平台系统聚焦解决传统测试中用例设计低效、执行覆盖率不足、缺陷定位滞后等核心痛点适用于Web、移动、API及桌面应用的智能化质量保障场景。压缩包共133个文件含25个Python脚本实现AI模型训练、测试调度与结果分析、26个JavaScript文件前端交互与可视化看板、23个CSS与14个HTML文件响应式管理界面以及Redis配置、启动批处理.bat、数据库SQL与日志等支撑文件整体16.58MB结构清晰模块边界明确。目前已有40人学习下载。读者可直接部署运行三类核心服务基于历史数据智能生成高覆盖测试用例的Py模块、支持24小时自动执行的Worker服务、以及集成NLP缺陷归因与改进建议的分析看板配套完整配置说明与启动脚本开箱即用。1. 项目概述当AI遇见自动化测试最近几年AI的风吹遍了各个角落从写代码到画图再到现在的自动化测试。作为一个在测试领域摸爬滚打了十多年的老鸟我亲眼见证了从纯手工“点点点”到脚本录制回放再到如今基于数据驱动、关键字驱动的自动化测试框架的演进。但说实话很多所谓的“自动化”依然笨重脚本维护成本高对UI变化异常敏感一个按钮ID变了可能整个用例集就挂了。直到我开始深入接触大语言模型和AI Agent一个念头越来越清晰能不能让AI来“理解”我们的应用并自主地、智能地执行测试这就是“AI自动化测试平台系统”这个项目标题背后我和团队在过去一年里一直在折腾的核心。简单来说这不是一个简单的“用AI生成测试脚本”的工具。那太初级了。我们想做的是一个平台系统一个能够将AI的认知、决策、学习能力与自动化测试的执行、断言、报告能力深度融合的智能体AI Agent。它应该能理解自然语言描述的需求比如“测试用户从登录到成功下单的完整流程”自动规划测试路径在真实的浏览器或移动端环境中执行操作并能像资深测试工程师一样观察页面反馈判断测试结果甚至在遇到异常时尝试自我修复或给出精准的排查建议。这听起来有点像天方夜谭但结合现有的开源模型、成熟的自动化测试框架如Playwright、Selenium以及一些工程化的设计我们已经能让它跑起来并解决不少实际痛点了。这个平台适合谁呢首先肯定是测试开发工程师和追求测试效能提升的团队它提供了一种全新的自动化范式。其次对于产品经理或业务分析师他们可以用更自然的方式参与测试用例的设计。甚至对于开发人员在提交代码后可以快速触发一个AI测试Agent让它对新功能进行一轮探索性测试提前发现一些明显的交互问题。接下来我就把这个还在不断迭代中的项目核心设计、实现细节以及我们踩过的那些“坑”毫无保留地分享出来。2. 核心设计思路构建一个测试领域的“数字员工”构建这样一个系统首要问题是定义它的工作模式。我们放弃了“脚本生成-执行”的传统两步走模式而是采用了“感知-决策-执行-学习”的智能循环。你可以把它想象成招聘一个测试实习生但它的学习速度和执行力是人类的千百倍。2.1 架构总览从指令到测试报告的全链路整个平台的核心是一个调度中枢它连接着四大模块自然语言理解与任务规划模块大脑皮层接收用户的自然语言指令例如“测试一下新上线的购物车优惠券叠加功能”。这里我们并没有简单地将指令翻译成Selenium代码而是利用大语言模型LLM将其分解为结构化的测试任务序列。例如模型会输出[登录 - 浏览商品A加入购物车 - 浏览商品B加入购物车 - 进入购物车页面 - 应用优惠券X - 应用优惠券Y - 验证总价是否正确 - 尝试结算]。这一步的关键是让LLM理解业务的领域知识因此我们需要通过高质量的Prompt工程和少量示例Few-shot Learning来“调教”它。环境感知与动作执行模块眼和手这是与传统自动化测试框架对接的部分。我们选择了Playwright作为核心执行引擎因为它对现代Web应用的兼容性更好支持多浏览器且自带强大的自动等待和网络拦截能力。这个模块的职责是接收规划好的原子任务如“点击登录按钮”将其转化为Playwright能执行的代码并驱动真实的浏览器。同时它还要充当AI的“眼睛”在执行前后捕获页面状态如截图、DOM快照、控制台日志、网络请求这些信息将反馈给决策模块。状态验证与异常决策模块判断力这是AI智能的核心体现。执行一个动作后系统需要判断是否成功。传统的断言是硬编码的如检查某个元素是否存在。而我们的系统会让LLM根据当前页面截图、关键HTML片段以及任务目标进行综合判断。例如任务目标是“登录成功”那么AI会分析页面是否跳转到了用户中心或者是否出现了“欢迎[用户名]”的文本。如果发现异常比如弹出了错误提示框AI模块会被再次调用分析异常原因并决定下一步动作是重试、跳过、记录缺陷还是触发一个预设的修复流程如清空缓存后重试。知识积累与用例进化模块记忆力系统不应每次测试都从零开始。所有成功的测试路径、遇到的异常及解决方案都会被结构化地存储到知识库中。当下次遇到类似任务时系统可以优先从知识库中召回相似的解决方案提高效率和准确性。这相当于这个“数字员工”在不断积累自己的测试经验。注意这里我们没有选择Appium作为移动端首选是因为初期我们更聚焦于Web和桌面WebView场景。Playwright对移动端浏览器模拟的支持已经相当不错且代码统一。如果未来需要深度原生App测试可以考虑集成Appium但那样会引入更高的复杂度和环境维护成本。2.2 技术选型背后的“为什么”为什么用Playwright而非Selenium除了前面提到的优势Playwright的page.screenshot()和page.content()能非常方便地获取高质量的视觉和结构信息供LLM分析。其强大的expect断言库虽然我们不完全依赖但可以作为AI判断的辅助验证基准。Selenium在超大规模并发和生态成熟度上仍有优势但对于一个需要频繁与AI交互、注重执行稳定性和现代API的项目Playwright目前是更优解。LLM的选择与成本考量我们尝试过GPT-4、Claude 3以及一些开源模型如Qwen。GPT-4在理解复杂指令和逻辑推理上表现最佳但成本高。对于动作执行这类相对格式化的任务我们使用较小的、经过微调的模型如GPT-3.5-Turbo或开源模型以降低成本。关键的设计是分层调用复杂的规划和分析用强模型简单的动作转换用弱模型或规则引擎。平台化与集成系统被设计为微服务架构核心的“AI测试引擎”是一个独立服务通过REST API或消息队列接收任务。这样可以轻松集成到现有的CI/CD流水线中比如在Jenkins或GitLab CI的一个Pipeline里一个阶段是构建部署下一个阶段就可以调用我们的AI测试服务进行智能验证。我们也提供了Web管理界面用于管理测试场景、查看AI执行报告、维护知识库。3. 核心模块拆解与实操要点3.1 让AI理解测试意图Prompt工程是关键这是整个系统最难也是最有挑战性的部分。你不能简单地对LLM说“测试登录功能”。你需要定义一套清晰的指令规则。我们设计的核心Prompt结构如下你是一个专业的Web应用测试AI助手。请将下面的用户需求分解为一系列可顺序执行的、原子级的测试步骤。 每个步骤必须严格遵循以下JSON格式 { “step_id”: 序号, “action_type”: “导航|点击|输入|验证|等待”, “target_description”: “对目标元素的自然语言描述如‘带有‘登录’文本的按钮’、‘用户名输入框’”, “value”: “需要输入的文字或验证的预期值如‘testuser’、‘页面标题应为‘首页’’”, “rationale”: “执行此步骤的原因或目标” } 当前应用信息 - 应用名称[你的应用名] - 主要页面登录页、首页、商品列表页、购物车页、个人中心 - 通用测试账号username: testdemo.com, password: demo123 用户需求“{用户输入的需求}” 请开始分解实际操作中我们会把应用的真实URL、一些关键的CSS选择器示例作为Few-shot也放入Prompt上下文能显著提高分解的准确性。例如在Few-shot里展示一个例子“点击登录按钮” -{“action_type”: “点击”, “target_description”: “文本内容为‘登录’的按钮”, …}。实操心得LLM对于模糊的描述容易产生歧义。比如“保存设置”它可能不知道要点哪个按钮。因此在知识库构建初期我们需要人工干预对AI分解出的步骤进行校正和丰富把这些校正后的“标准操作”存入知识库。后续遇到类似描述时系统会优先匹配知识库中的记录匹配不上再调用LLM。这形成了一个“人工标注-模型学习-自动匹配”的增强循环。3.2 从自然语言到浏览器动作精准的“元素定位”策略AI给出了“点击‘登录’按钮”的指令Playwright如何找到这个按钮传统自动化靠的是稳定的ID或XPath但AI的描述是动态的。我们的策略是多模态定位融合语义匹配优先利用Playwright的get_by_text()、get_by_label()、get_by_role()等语义化定位器。这是最接近人类描述的方式。page.get_by_text(“登录”, exactTrue)就能找到文本精确为“登录”的元素。视觉辅助定位实验性对于没有清晰文本或标签的元素我们尝试结合截图和视觉AI模型。例如当AI描述“点击页面右上角的用户头像图标”时系统会截取页面截图用小型的视觉模型识别出头像区域再映射回DOM的大致位置辅助Playwright进行定位。这一步目前精度有待提高是未来的优化方向。回退与重试机制如果通过描述找不到元素系统会触发一个“元素查找失败”的异常处理流程。这个流程会再次调用LLM提供当前的页面HTML摘要和截图询问“根据当前页面如何定位‘登录按钮’请提供可能的CSS选择器或XPath”。LLM有时能根据页面结构给出一个可用的选择器。同时系统会记录这次失败后续由人工补充该元素的稳定定位方式到知识库。一个典型的执行代码片段Python如下async def execute_ai_step(step, page): action step[“action_type”] target_desc step[“target_description”] value step.get(“value”) # 1. 尝试语义化定位 element None if “文本” in target_desc: # 简单提取文本内容实际中会用更复杂的NLP解析 text_match re.search(r“文本[为是]‘(.?)’“, target_desc) if text_match: element page.get_by_text(text_match.group(1)) elif “输入框” in target_desc and “用户名” in target_desc: element page.get_by_label(“用户名”) # 假设有label # 2. 如果找到元素执行动作 if element: await element.wait_for(state“visible”) if action “点击”: await element.click() elif action “输入”: await element.fill(value) # … 其他动作类型 # 3. 执行后捕获状态供验证模块使用 screenshot await page.screenshot(full_pageTrue, type“jpeg”) html_snippet await page.content() return {“status”: “success”, “screenshot”: screenshot, “html”: html_snippet} else: # 3. 定位失败触发异常处理流程 return {“status”: “element_not_found”, “description”: target_desc}3.3 智能验证超越硬编码断言执行了“登录”操作如何判定成功传统方法是assert “欢迎” in page.title()。我们的AI验证模块工作流更复杂收集证据动作执行后收集页面标题、URL、关键区域截图、特定元素的文本内容如欢迎语、是否有错误提示元素出现等。提交LLM裁决将任务目标“验证登录成功”、收集到的证据以及页面HTML摘要一起提交给LLM。Prompt类似于“根据以下页面信息判断‘用户登录成功’这一目标是否达成。页面标题是‘…’主区域存在文本‘…’是否存在class包含‘error’的元素请只回答‘是’或‘否’并附上简要理由。”结果处理如果LLM判断为“是”则步骤通过。如果为“否”则进入异常处理流程LLM提供的“理由”会成为后续排查和报告的重要信息。踩坑实录直接让LLM看整个HTML是不现实且低效的Token消耗大且噪音多。我们必须要做信息过滤。我们的做法是预先定义每个“页面类型”如登录页、首页需要关注的关键区域选择器。例如对于登录页我们只提取#login-form这个容器内的HTML和截图。这需要前期对应用进行一些简单的“配置”但一旦配置好就能大幅提升AI判断的效率和准确率。4. 平台系统搭建与核心环节实现4.1 系统架构与技术栈实现我们采用前后端分离的微服务架构具体技术栈如下后端AI测试引擎Python FastAPI。Python在AI生态和Playwright支持上优势明显。FastAPI用于提供任务提交、状态查询等API。核心的AI任务规划、验证模块调用LLM的API如OpenAI或本地部署的Ollama服务。执行器部分使用异步的Playwright通过playwright.async_api管理浏览器实例。任务队列与状态管理使用CeleryRedis。用户提交一个测试任务如“测试购物流程”后API将其封装为一个Celery任务放入队列。Celery Worker从队列中取出任务调用AI引擎执行。Redis用于存储任务状态、中间结果和缓存。前端管理平台Vue 3 Element Plus。用于创建测试场景其实就是输入自然语言描述、查看任务执行队列、浏览详细的测试报告包括AI执行的每一步截图、LLM的判断理由、管理知识库。数据存储PostgreSQL。存储用户信息、测试场景定义、历史任务记录、知识库条目。对于大量的执行截图和日志我们存储在对象存储如MinIO中数据库中只存路径。部署使用Docker Compose将所有服务Web前端、FastAPI后端、Celery Worker、Redis、PostgreSQL容器化便于部署和扩展。4.2 一个完整测试任务的执行流水线让我们跟踪一个任务“测试新用户注册流程”的生命周期任务提交用户在前端输入描述点击执行。前端调用POST /api/tasks。任务规划FastAPI后端收到请求首先调用规划服务。该服务将用户描述和系统Prompt发送给LLM获得结构化的步骤列表[步骤1: 导航到注册页 步骤2: 输入邮箱 …]。将此规划存入数据库状态为“已规划”。任务入队后端创建一个Celery任务execute_test_plan参数为任务ID和规划步骤发送到Redis队列。任务执行空闲的Celery Worker接收到任务。Worker启动一个新的Playwright浏览器实例或从池中获取。循环执行每个步骤 a.动作转换与执行根据步骤描述调用动作执行模块定位元素并操作浏览器。 b.状态捕获执行后截图获取页面信息。 c.智能验证将步骤目标、捕获的状态提交给验证模块调用LLM进行判断。 d.结果记录将每一步的结果成功/失败、截图路径、LLM判断理由实时写回数据库。 e.异常处理如果某步失败根据预设策略如重试、终止任务或调用LLM进行决策然后继续。任务完成所有步骤执行完毕Worker更新任务状态为“完成”或“失败”并生成一份整合报告。结果反馈用户在前端可以实时查看任务执行进度流最终查看详细的报告。报告会高亮显示AI认为有问题的步骤并附上LLM的分析非常直观。4.3 知识库的设计与应用知识库是这个系统能否越用越聪明的关键。我们设计了两张核心表元素定位知识表存储应用名、页面URL、元素描述、推荐定位方式Playwright Locator语法、置信度。当AI需要定位一个元素时会先在知识库中模糊匹配“元素描述”如果找到置信度高的记录就直接使用“推荐定位方式”不再调用复杂的定位逻辑。测试模式表存储场景描述、成功步骤序列、常见异常及处理方案。当用户输入一个新需求时系统会先在知识库中搜索相似的“场景描述”如果匹配度高可以直接推荐或复用已有的测试步骤序列极大提升效率。知识库的积累初期靠人工录入将成功的测试任务固化下来后期可以设计自学习机制当一个任务被人工审核确认为成功且路径高效时系统可以自动将其模式化存入知识库。5. 常见问题、挑战与我们的应对策略在实际开发和试运行中我们遇到了无数问题。以下是几个最具代表性的5.1 AI的“幻觉”与不可控输出这是使用LLM最大的风险。AI可能分解出根本不存在的步骤或者给出荒谬的验证逻辑。我们的策略设置严格的输出格式强制要求LLM以指定JSON格式输出不符合格式的直接视为错误。增加验证层对于规划出的步骤在执行前可以加一个“可行性预检”环节。用一个更简单的模型或规则快速检查步骤序列是否符合常识比如“提交订单”步骤不可能出现在“登录”步骤之前。人工审核回路对于核心业务流程的测试规划首次执行时可以设置为“模拟执行”模式只输出规划步骤而不真实操作浏览器由人工确认后再正式执行。使用更可控的中间语言我们正在探索让LLM输出一种更结构化的中间指令语言比如一种自定义的DSL再由一个稳定的解释器转换成Playwright命令。这样可以把LLM的创造力限制在一个更安全的框架内。5.2 执行稳定性与环境依赖自动化测试的老大难问题。浏览器版本变化、网络延迟、动态加载的元素都会导致失败。我们的策略充分利用Playwright特性使用auto-waiting所有操作点击、填充都会自动等待元素可操作。设置合理的timeout和retry策略。强化状态检测在执行关键步骤前AI验证模块会先检查“前置状态”是否就绪。例如在“输入支付密码”前会先验证是否确实进入了支付页面。环境隔离与一致性使用Docker固定浏览器和依赖的版本。在CI/CD中测试环境尽量与生产环境保持一致。定义清晰的“失败”区分“环境失败”如网络超时和“业务失败”如密码错误。对于环境失败系统自动重试对于业务失败则记录为真正的缺陷。5.3 成本与性能瓶颈频繁调用GPT-4 API费用惊人。同时串行执行步骤测试耗时较长。我们的策略模型分级调用如前述规划用强模型简单的动作转换和验证用弱模型如GPT-3.5-Turbo或本地小模型。结果缓存对于相同的页面状态和验证目标AI判断结果可以缓存一段时间避免重复调用。并行化探索对于独立的测试模块如测试登录、测试搜索可以启动多个浏览器实例并行执行。但这需要AI调度器具备更强的协调能力避免资源冲突如共用账号。离线模式与自建模型长期来看对于动作执行等确定性较高的任务可以训练专有的小型模型或完全用规则引擎替代彻底摆脱对云端大模型的依赖。开源模型如Qwen、Llama在本地部署后的调优也是一个方向。5.4 测试覆盖度的评估如何衡量这个AI测试平台的效果它发现的缺陷多吗它能替代多少手工测试我们的度量指标任务成功率AI独立完成一个端到端测试任务的百分比。缺陷发现率与手工测试或其他自动化测试对比发现的有效缺陷数量。回归测试效率提升执行相同范围的回归测试用例所需时间对比。维护成本与传统自动化脚本相比适应UI变更所需的调整工作量。 目前来看AI测试在探索性测试、新功能快速验证、复杂业务流程遍历上优势明显能发现一些脚本未覆盖的边界情况。但在需要极度精确断言如计算数值、验证复杂业务规则的场景仍需与传统自动化或手工测试结合。构建“AI自动化测试平台”是一条充满挑战但极具前景的路。它不是一个一蹴而就的替代方案而是一个强大的辅助和增强工具。我们的实践表明它已经能够处理许多标准化的Web流程测试并将测试人员从重复的脚本编写和维护中解放出来去从事更有价值的测试设计、复杂逻辑验证和用户体验评估工作。这个系统还在持续迭代中最大的感受是与其教AI写代码不如教它理解目标然后让它自己去操控浏览器。这中间的工程化挑战正是我们作为测试开发工程师的价值所在。如果你也对这个方向感兴趣不妨从一个小场景开始比如用PlaywrightOpenAI API先做一个能自动登录你公司系统的脚本感受一下AI驱动测试的魔力与阵痛这绝对是未来几年测试领域最值得投入精力的方向之一。本文还有配套的精品资源点击获取
返回列表