简介:这是一套面向中高级测试工程师与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: test@demo.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(“登录”, exact=True)就能找到文本精确为“登录”的元素。 - 视觉辅助定位(实验性):对于没有清晰文本或标签的元素,我们尝试结合截图和视觉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_page=True, 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管理浏览器实例。 - 任务队列与状态管理:使用Celery+Redis。用户提交一个测试任务(如“测试购物流程”)后,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中,测试环境尽量与生产环境保持一致。
- 定义清晰的“失败”:区分“环境失败”(如网络超时)和“业务失败”(如密码错误)。对于环境失败,系统自动重试;对于业务失败,则记录为真正的缺陷。
- 充分利用Playwright特性:使用
5.3 成本与性能瓶颈
频繁调用GPT-4 API,费用惊人。同时,串行执行步骤,测试耗时较长。
- 我们的策略:
- 模型分级调用:如前述,规划用强模型,简单的动作转换和验证用弱模型(如GPT-3.5-Turbo)或本地小模型。
- 结果缓存:对于相同的页面状态和验证目标,AI判断结果可以缓存一段时间,避免重复调用。
- 并行化探索:对于独立的测试模块(如测试登录、测试搜索),可以启动多个浏览器实例并行执行。但这需要AI调度器具备更强的协调能力,避免资源冲突(如共用账号)。
- 离线模式与自建模型:长期来看,对于动作执行等确定性较高的任务,可以训练专有的小型模型,或完全用规则引擎替代,彻底摆脱对云端大模型的依赖。开源模型(如Qwen、Llama)在本地部署后的调优也是一个方向。
5.4 测试覆盖度的评估
如何衡量这个AI测试平台的效果?它发现的缺陷多吗?它能替代多少手工测试?
- 我们的度量指标:
- 任务成功率:AI独立完成一个端到端测试任务的百分比。
- 缺陷发现率:与手工测试或其他自动化测试对比,发现的有效缺陷数量。
- 回归测试效率提升:执行相同范围的回归测试用例,所需时间对比。
- 维护成本:与传统自动化脚本相比,适应UI变更所需的调整工作量。 目前来看,AI测试在探索性测试、新功能快速验证、复杂业务流程遍历上优势明显,能发现一些脚本未覆盖的边界情况。但在需要极度精确断言(如计算数值、验证复杂业务规则)的场景,仍需与传统自动化或手工测试结合。
构建“AI+自动化测试平台”是一条充满挑战但极具前景的路。它不是一个一蹴而就的替代方案,而是一个强大的辅助和增强工具。我们的实践表明,它已经能够处理许多标准化的Web流程测试,并将测试人员从重复的脚本编写和维护中解放出来,去从事更有价值的测试设计、复杂逻辑验证和用户体验评估工作。这个系统还在持续迭代中,最大的感受是,与其教AI写代码,不如教它理解目标,然后让它自己去操控浏览器。这中间的工程化挑战,正是我们作为测试开发工程师的价值所在。如果你也对这个方向感兴趣,不妨从一个小场景开始,比如用Playwright+OpenAI API先做一个能自动登录你公司系统的脚本,感受一下AI驱动测试的魔力与阵痛,这绝对是未来几年测试领域最值得投入精力的方向之一。
本文还有配套的精品资源,点击获取