☰
自动化测试人机协作危机:AI Agent如何重塑脚本生成与维护
2026/9/30 4:01:20 网站建设 项目流程

最近团队里有个年轻测试工程师,往工作群里发了一张截图:CI服务器上三百多条Selenium用例跑了一整夜,最后通过的不到六成,剩下的失败里有一半连失败原因都看不明白。他配了一句挺丧的话:“每天早上醒来第一件事不是看需求文档,而是看成堆的失败报告;我不是在找Bug,是在猜测试机器人为什么又把用例跑挂了。”

这话干过自动化测试的人都懂。我们花大量精力搭建测试机器人,初衷是把人从重复劳动里解放出来,可现实往往是它反而成了新的劳动来源,而且这个劳动比手工点鼠标更让人心累。借用一下《资本论》这个有点反差的书名当个引子,我声明在先,咱们不聊政治经济学,纯粹借“劳动”与“资本”两个词说事:自动化测试里,我们到底在积累什么?机器到底在替人做什么?人和机器之间的边界,是不是正在走向一个畸形循环?这篇文章想认真聊一聊的,就是自动化测试中的人机协作危机,以及它可能的进化方向。

1. 测试资产是怎么堆成山的:自动化测试里的“原始积累”

1.1 从几十条脚本到上万条用例,资产在膨胀

任何一条测试线,几乎都逃不过这样的发展轨迹:刚开始只是想把手头最重复的回归用例自动化跑起来,用了Pytest加上Selenium,几条脚本跑通,团队很开心。接着领导觉得这条路走得通,下了指标——“覆盖率要上去”,于是脚本数量从几十涨到几百,再涨到上千,再遇到平台化建设,用例数直接破万。

我们通常把这件事叫“积累测试资产”,听起来确实很正面,只是很少有人在积累的过程中停下来盘点:这些资产里,有多少是真正能生钱的生产资料,有多少是躺在仓库里的库存,又有多少其实是负资产?

以我见过的一个真实项目为例,一个中大型Web应用,自动化用例两千多条,每天定时在CI上全量跑一遍,耗时三小时左右。表面上看资源占用不小,更扎心的是失败率长期徘徊在四成。失败里有环境连不上、测试数据被脏掉、元素选择器失配、接口返回结构变了,真正发现产品缺陷的失败平均一周不超过十条。两千多条用例,每天真正产生决策价值的可能只有那十条,其余全是在制造噪音。

这就是典型的“资产膨胀期”:数量上去了,质量下来了,价值密度稀释得厉害。测试机器人看起来很忙,但忙并不等于有效。

1.2 用例资产的三种类型与真实的“资产负债”

我在多个团队做过一次简单的资产盘点,把自动化用例按可维护性和实际产出来分类,大致是这三类:

资产类型特点维护态度
可复用资产稳定、有明确业务断言、失败时能直接定位真Bug值得投入持续维护
一次性资产为了某个版本临时写的回归用例,版本过了就没价值定期归档或清理
负资产常年失败、无人修复、报告里没人敢删的用例必须尽快处理,否则拖垮整体信任

负资产是最可怕的。大家可能都有这种经验:某个用例连续一个月天天失败,一开始还有人去看,后来所有人默认跳过它,更糟的是报告里那一堆红叉已经没人当回事了。红叉不再代表产品有问题,而是代表“机器人又在闹脾气”。当自动化测试的结果失去信号意义时,整个测试线和测试机器人就失去了存在的价值。

所以,如果真要套“原始积累”的说法,我想说的是:自动化测试的资产积累不是脚本数量的堆叠,而是可复用用例、稳定的执行环境、可解释的失败报告这三者形成的正向循环。缺了任何一环,资产就会变成库存甚至负资产。

2. 危机真正的名字:不是工具不行,是人机边界错了

2.1 脆弱脚本最常见的六个导火索

自动化测试跑不稳,团队第一反应往往是换框架:Selenium不行换Playwright,Appium慢换新工具,接口测试不好写换平台。但框架解决不了所有问题,因为大部分失败根本不是框架本身的锅。根据我多年排查的经验,脆弱脚本的原因基本集中在下面这六类:

  • 页面结构变化:前端改版,某个按钮的class从btn-primary改成了btn-confirm,元素定位直接失效。
  • 异步时序不稳定:页面还没渲染完脚本就开始找元素,于是要靠各种sleep和显式等待“蒙”时序。
  • 测试数据互相污染:用例依赖的账号、订单、商品数据被另一条用例改了,串数据导致断言失败。
  • 环境差异:本地能过、CI上挂,开发环境能过、预发环境挂,浏览器版本和驱动版本不匹配。
  • 接口契约漂移:后端字段名变了,类型从string改成long,接口自动化测试没跟上。
  • 框架和依赖升级:一个无关依赖的升版,导致整个执行链路崩掉。

你仔细看这一串,会发现一个共同特征:测试机器学习的是“剧本”,但业务系统每天都在“即兴演出”。测试机器人不认业务,只认选择器和响应结构,任何超出剧本的变化对它来说都是灾难。人必须不停地修改剧本,去适配业务的变化,这不是人机协作,而是人在给机器当保姆。

2.2 失败分类:把“机器出错”和“产品出错”切开

解决危机第一步,是先让失败报告说人话。我强烈建议所有做自动化测试的团队,从第一天就建立失败原因标签体系,每条失败的用例必须打上原因分类,而且分类要落到能直接定位问题的粒度。

这里给出我常用的失败分类表:

失败类型典型表现责任归属响应动作
环境类失败依赖服务重启、容器资源不足、网络超时测试基础设施团队自动重试或环境巡检
数据类失败断言值不对、数据被篡改、脏数据残留测试数据团队数据工厂重建或用例隔离
框架类失败选择器失效、等待超时、驱动版本不匹配自动化开发团队框架修复或登录态维护
真实产品缺陷页面报错、接口返回错误、业务流程中断产品研发团队提交缺陷单,阻塞发版

没有这个分类体系,失败报告就是一个大杂烩,每个人看到红叉都要从头开始查,人力消耗巨大。有了分类体系之后,很多失败可以用规则和脚本自动归因,人的精力能集中到真正需要判断力的“真实产品缺陷”上。这一步表面上是数据治理,本质上是在给人和机器画清晰的分工边界。

2.3 信任崩塌的恶性循环

自动化测试还有一个特别隐蔽的危机,叫作“信任崩塌”。它的循环路径大概是这样的:

  1. 用例失败太多,工程师看不过来,于是开始选择性忽略。
  2. 失败的用例没人修,失败率继续升高。
  3. 重要版本发布前,自动化测试报告因为噪音太大,无法作为质量门禁的参考依据。
  4. 管理层发现自动化投入了大量资源却没挡住线上事故,开始质疑价值。
  5. 测试团队为了自证价值,又加更多用例,进一步加剧噪音。

这个循环走到第三步就已经很危险了。我在不少团队见过,自动化测试报告沦为“演示工具”:周报里截一张覆盖率图,但真正发版决策根本不敢依赖它。这不是机器人的错,是人机协作的闭环断了——机器不会自我判断失败是否重要,人又没有持续反馈校准,最后当然是一起摆烂。

所以我说,自动化测试危机的根源不是工具不够先进,而是我们从来没认真设计“人教机器、机器反馈人”的闭环。要建立这个闭环,先得有资产治理,紧接着得有让机器理解业务意图的新方式,这就是下面要聊的进化方向。

3. 让测试机器人学会“读需求”:AI Agent生成测试脚本的落地路径

3.1 人工写脚本的成本上限,决定了必须换一种交互方式

很多人力写脚本维护脚本的团队,最终都会撞到一堵墙:自动化用例的编写速度根本赶不上业务迭代的速度。一个复杂流程的UI自动化用例,从分析、写脚本到调试通过,至少需要半天。而业务一天可能改三处,脚本维护的债务越滚越大。

解决这个问题的方向不是写更快的脚本,而是让机器直接理解人的意图。我用“读需求”三个字来概括,对应的技术路线就是最近很热门的“LLM + LangChain + 自动化测试框架”组合。可以把它理解成一个能读懂自然语言测试用例、自动生成UI自动化脚本的Agent。

这个思路的热搜词就是“基于LangChain开发一个能读取测试用例自动生成UI自动化测试脚本的Agent”,我觉得它不是噱头,是目前最值得投入产出比最高的一条路。

3.2 Agent的核心架构:动作原语库是关键

很多人在做Agent生成测试脚本时,犯的第一个错误是直接让大模型生成完整的Selenium代码。后果可想而知:大模型很容易把类名、方法名、元素定位写错,生成的脚本能不能跑通全看运气。

我实践下来的正确做法是:先用人的经验把业务操作抽象成动作原语,再让大模型去组合这些原语,而不是从零写代码。

动作原语库的样子大致如下:

# 领域动作原语示例:业务操作的最小可执行单位 def open_url(driver, url: str) -> bool: driver.get(url) return True def input_text(driver, selector: str, text: str) -> bool: element = wait_until_visible(driver, selector) element.clear() element.send_keys(text) return True def click_button(driver, selector: str) -> bool: element = wait_until_clickable(driver, selector) element.click() return True def assert_text(driver, selector: str, expected: str) -> bool: element = wait_until_visible(driver, selector) assert element.text.strip() == expected, f"期望文本: {expected}, 实际文本: {element.text}" return True

有了这套原语,Agent的工作就从“写代码”降级为“做映射”。它只需要把自然语言描述一步步映射到这些原语上,再用LLM做参数补全和边界判断。比如“用户登录后点击订单详情的确认按钮,断言成功文案为‘操作成功’”这一句,Agent会把它拆解成四步:

  1. open_url → 登录页地址
  2. input_text → 用户名输入框,读测试数据里的账号
  3. input_text → 密码输入框
  4. click_button → 登录按钮
  5. open_url → 订单页地址
  6. click_button → 订单详情里确认按钮
  7. assert_text → 断言“操作成功”文案

代码生成这一环反而变得没那么重要了。重要的是拆意图、定参数,以及当某一步失败时怎么从失败堆栈里判断是原语写错了还是业务真的变了。

3.3 一个可跑的示例:LangChain + Playwright的翻译链路

我这里给一个简化版本,用LangChain的create_react_agent做步骤分解,再用Playwright执行动作原语。这个示例不是生产级代码,但能帮大家直观理解Agent的“翻译链路”是怎么走的。

from langchain_openai import ChatOpenAI from langchain.agents import create_react_agent, AgentExecutor from langchain.tools import Tool # 将动作原语封装成LangChain Tool tools = [ Tool(name="open_url", func=open_url, description="打开指定URL"), Tool(name="input_text", func=input_text, description="在selector指定位置输入文本"), Tool(name="click_button", func=click_button, description="点击selector指定的按钮"), Tool(name="assert_text", func=assert_text, description="断言selector位置的文本等于expected"), ] with open("test_case.txt", "r", encoding="utf-8") as f: test_case_content = f.read() # 读取自然语言测试用例 prompt = f"""请阅读以下测试用例,逐步翻译为可执行的测试动作序列: {test_case_content} 注意: 1. 每一步必须且只能调用一个工具 2. 参数必须使用测试数据里的真实值 3. 如果用例描述模糊,输出ACTION_NEEDED并说明缺失信息 """ llm = ChatOpenAI(model="gpt-4o-mini", temperature=0) agent = create_react_agent(llm=llm, tools=tools, prompt=prompt) # 这里省略了Prompts模板细节 agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) result = agent_executor.invoke({"input": prompt}) print(result["output"])

这个链路跑通以后,我最大的体会是:**大模型在语义理解上已经完全够用了,卡点全在工程侧。**比如登录态怎么维护、测试数据从哪里注入、失败截图怎么回传给模型、重试策略怎么设计。这些不比写脚本简单,但它们是一次性投入,边际成本会越来越低。

3.4 Agent落地的三个关键纪律

  • 先做“用例转脚本”,不要一上来做“需求生成用例”。从已有测试用例转脚本,容错率高得多,因为用例里已经有人类的判断了;直接让Agent从需求文档生成用例,很容易生成一堆看起来像那么回事、却根本测不到点上的废用例。
  • 测试数据必须是结构化注入的。不要让LLM自己编一个用户名密码,而是通过数据工厂获取真实环境里可用的测试数据,否则断言永远过不了。
  • 失败信息必须闭环回传。脚本失败后,把异常堆栈、页面截图、当前DOM关键信息一起回传给模型,让模型判断是环境问题、数据问题还是脚本问题,或者直接尝试自愈。否则Agent生成脚本只是把“人修脚本”变成了“模型修脚本”,效率提升有限。

这些都是我在实际项目里踩过的坑。尤其是第三点,我第一次做Agent时没有做失败回传,生成的脚本成功率只有五成,每次都要人去分析失败原因,后来加了失败分类与回传机制,成功率才真正上去了。

4. 从单兵脚本到平台治理:自动化测试平台必须具备的五个能力

4.1 平台化之前,先回答三个问题

很多团队一说建设自动化测试平台,第一反应是买工具、搭系统、把脚本集中管理起来。但真正的平台化,要回答的是三个更底层的问题:

  1. 测试资产是否可以被统一管理,而不是散落在各人电脑上变成“个人资产”?
  2. 执行结果是否具备可追溯性和可解释性,而不是靠截图去群里喊人?
  3. 机器是否能在某种程度上“理解”测试意图,而不只是一个执行棋子?

这三个问题如果没想清楚,平台建设出来也只是把原来的脚本堆到了一个网页后面,没有解决人机协作的实质危机。

4.2 平台的核心能力地图

结合多个团队的实践经验,我认为一个及格的自动化测试平台至少要具备这五项能力:

能力模块核心价值落地的关键点
用例资产中心统一管理用例、脚本、页面对象、测试数据版本化、标签化、支持用例评审
环境与数据工厂按需申请环境、一键造数、隔离账号与CI/CD联动,环境状态可观测
智能执行引擎任务编排、并发分配、自动重试、失败分类失败归因分析,非简单重跑
结果观测与分析趋势报表、失败聚类、缺陷关联以“是否值得发版”为目标输出结论
智能辅助层自然语言转脚本、失败自愈、代码评审辅助基于LLM服务,模型可替换

我特别想强调“智能辅助层”这一层。它是进化的方向,也是平台区别于传统工具的关键:平台不应该只是测试脚本的“保管箱”,它应该能辅助人做更多的判断和生成工作,降低人机协作的摩擦。

4.3 最小闭环怎么搭,以及一个反面教材

平台建设最大的坑是“大而全的空转”。我见过一个团队花三个月时间架构了一个包含几十个模块的测试平台,功能菜单密密麻麻,但连最核心的“失败原因标签”都没有打通,用例跑挂了依然要在群里喊人排查。这就是典型的形式主义中台。

更稳妥的路径是走最小闭环:先选一个高频业务域,把“用例管理→执行编排→结果聚合→失败分类→反馈模型”这条线全部跑端到端,周期控制在三到四周。这条线跑顺了,再逐步加环境工厂和数据工厂这些能力。换句话说,平台的建设应该从“治疗负资产”开始,而不是从“扩大门面”开始。

我自己的做法是先用一个轻量级的开源工具(比如Allure + Pytest + Jenkins)把结果聚合和分类做起来,验证团队是否能真正依赖报告做决策。等确认报告里的红叉有含金量了,再考虑要不要上更重的平台。

5. 测试工程师的进化:从脚本工人到人机协作导演

5.1 危机倒逼下,人的能力结构在变

自动化测试平台越来越智能,测试工程师的传统技能正在快速贬值。当年吃饭的手艺——写Selenium脚本、调Appium环境、搭建接口自动化框架,这些正在变成AI的普通能力。真正贵的能力已经迁移到了另一个层面。

我整理了一张能力迁移的对照表,很直观:

传统测试工程师能力AI时代测试工程师能力具体表现
手写脚本写Prompt和动作原语给Agent下达清晰、可拆解的测试意图
修脚本处理脆弱性审查AI生成脚本的边界判断生成脚本是否覆盖了异常场景
人肉点点点的探索性测试设计测试机器人读业务的策略把业务风险点拆成机器可执行的可验证断言
看报告判断通过与否评审失败归因的智能判断区分真缺陷、假失败和噪声
搭建框架与CI流水线治理测试资产与搭建智能反馈闭环让失败报告从“噪音”变成“信号”

我反复讲一个观点:将来最值钱的测试工程师,不是写代码最厉害的人,而是最能表达测试意图的人。你需要对你负责的业务足够敏感,知道哪个环节最容易出错,然后把这个判断翻译成机器能执行的验证逻辑,不管是脚本还是Prompt。

5.2 以接口自动化测试为例:人机分工怎么做

接口自动化测试是相对容易先跑通AI辅助的领域,因为接口的输入输出比较结构化,LLM生成用例的容错率比UI自动化高得多。

我们目前的协作方式是:人负责定义接口契约、核心场景、Schema约束和关键断言;AI负责补齐边界值、异常参数组合、状态码覆盖;然后人做最终评审,决定哪些AI生成的用例进入资产库。比如这样一个场景:

人工定义:POST /api/order/create 成功时返回订单号,失败时返回错误码 Agent补充:空订单项、金额为0、商品ID不存在、并发创建同一商品、Token过期 人工评审:剔除掉不合理的组合,补充真实环境里才会出现的幂等场景

这套流程跑下来,接口自动化的用例覆盖率明显提升,而人的时间没有按比例增加,因为AI分担了“从方法论生成用例”的机械化工作。这才是人机协作该有的样子——人管方向和判断,机器管生成和执行,最终由人拍板。

5.3 我在项目管理中坚持的几条协作纪律

  • 不能让机器人背锅:自动化用例失败了,第一反应不是“这个脚本谁写的”,而是先归因,确认是环境、数据、脚本还是产品问题。责任边界清楚了,协作才不内耗。
  • 给机器学习的耐心和时间:AI生成脚本不是一次到位,需要反复用失败数据去微调Prompt和原语库。我见过太多团队试了一周觉得效果不好就放弃,这就像让新人刚入职就要求产出——不现实的。
  • 保持对业务的判断力:无论工具多智能,最终的质量门禁必须由人来把关。AI可以帮你发现异常,但“这个异常要不要阻塞发版”这个决策,不能完全交给机器人。

这也是我标题想说的“进化”:测试机器人读不读好书不重要,重要的是使用机器人的人,开始用更高级的思维方式去定义劳动和协作边界。测试机器人读《资本论》是个玩笑,但人如果真的开始思考“哪些重复劳动应该交给机器、哪些核心判断必须留在人手里”,自动化测试的危机才真正有解。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询