这周接口自动化用例执行失败率突然飙升,我花了一个下午排查,最后发现是一个新上线的返回字段悄悄改了枚举值。这种问题不算难,但特别费时间。放在以前,我要把全链路日志翻一遍,再对着接口文档逐字对。现在我用AI辅助测试的思路,把这类场景拆成了“找差异、查链路、给建议”三步,配合大模型和脚本工具,几分钟就能定位到根因。
我理解的AI辅助测试,并不是让AI接管整个测试工作,而是补齐测试工程里最容易消耗人的三块短板:测试设计与生成的效率、测试执行与维护的自动化程度、异常结果的分析与诊断速度。三者对应的是“怎么测”“怎么跑”“怎么查”,这是测试工作中最日常、也最容易被重复劳动淹没的部分。下面我会结合pytest、Appium、安全测试、汽车电子测试等实际场景,分享这套思路到底是怎么落地的。
1. AI辅助测试不是取代人,而是补齐三块短板
先聊一个不少人容易误解的点。很多人一听说AI辅助测试,就觉得是不是以后测试不用人了。我的观点是,至少现阶段不是这样。AI更像是一个超级实习生,你给它一个足够清晰的上下文和验收标准,它能快速产出一版还不错的初稿,帮你把脏活累活扛掉大半。但如果你不给上下文,它就会一本正经地胡说八道,而且说错的概率还不低。所以我把AI辅助测试的核心价值定成三个方向:提高用例生成效率、降低脚本维护成本、压缩故障分析时间。
1.1 设计测试用例时的“AI预生成+人工筛选”流程
“怎么测”最典型的痛点是测试用例太多、场景分支太杂。每次需求评审会开完,测试同学都要花半天去整理接口参数组合、边界值、异常流。用AI辅助测试之后,我习惯把接口定义和需求描述丢给大模型,让它先输出一版候选用例列表,我再人工做筛选和去重。这比从零开始写要快很多,而且AI往往能覆盖到一些容易遗漏的异常流,比如空字符串、超大数值、重复提交、参数类型错乱这类场景。
我的提示词通常长这样:
请根据以下接口文档生成pytest测试场景清单,不需要写完整代码: 接口:POST /api/user/login 字段:username(string,必填),password(string,必填),remember_me(boolean,可选) 需求:用户输入正确凭证可登录成功;错误密码提示10001;空用户名提示10002。 请列出至少10个测试场景,包含正常流、异常流、边界流,并标注每个场景的断言重点。AI给我输出一版场景清单后,我一般会做两步操作:第一步删掉和现有用例重复的内容,第二步把遗漏的业务规则补进去。这个流程看起来好像还是人在干活,但效率差异主要在底稿的产出速度上。以前我列10个场景可能要40分钟,现在AI出底稿只要3分钟,我只需要花10分钟做修正和增补。
1.2 执行和维护脚本时的“AI辅助修复”机制
“怎么跑”这块,本质是让测试脚本更聪明。传统自动化测试最烦的就是脚本维护,尤其是UI自动化,一个页面结构微调,几十条用例就挂了。AI辅助测试在这里的作用是自动分析页面元素变化,辅助修复定位器,而不是简单地让脚本遇错就重跑。
我参与过一个移动端项目,版本更新频繁,Appium脚本经常因为resource-id变更而大面积失败。后来我们写了一个POC流程:定位失败时,自动抓取当前页面的page_source,连同旧的定位器一起发给大模型,让它尝试生成新的定位器。过程跑通之后,我把这个逻辑挂在Appium的异常处理里,一旦定位失败就自动进入“AI修复模式”。修复成功后,脚本会继续执行,同时把修改记录写到日志里供复盘。这个机制把UI脚本的维护成本降了不少,后面我会详细展开。
1.3 故障分析时的“AI聚类+异常定位”思路
“怎么查”是我认为最有价值的部分。测试执行完之后,日志、截图、网络请求、数据库状态会堆成一大片。以前靠人眼一屏一屏翻,现在可以让AI在几秒内把失败任务的共性抽出来,给出可疑原因和验证建议。虽然AI给的结论不总是对,但它把排查范围从“大海捞针”缩到了“两三个怀疑对象”,效率提升非常明显。
举个例子,上周那个接口字段枚举值变更的问题,就是让AI比对了历史成功日志和当前失败日志,先发现失败请求集中在某几个参数组合,再对比接口返回,提示我检查枚举定义。虽然AI没有直接说出“枚举值从active变成了enabled”,但它把这个方向指了出来,我再去代码仓库里一搜就定位了。这一步省下的时间非常可观。
这里我补充一句:AI辅助测试的落地,不在于你用了多新的模型,而在于你身边有没有一套可以让AI快速接入的测试工程。换句话说,大模型只负责动嘴,工程脚本负责动手,两者配合才算完整的场景。
2. 从pytest开始:让AI生成可落地的接口测试脚本
接口测试是所有测试类型里最适合先引入AI辅助的。原因很简单:接口测试的数据结构清晰、断言逻辑相对固定、环境依赖可控,大模型生成的代码通常八九不离十。我所在的团队自动化框架以pytest为主,下面分享一套已经跑通的AI辅助接口测试方法。
2.1 把需求转成测试清单的提示词技巧
直接问大模型“帮我写几个接口测试用例”,得到的答案会很泛。我现在的做法是给AI三样东西:接口文档的关键字段、业务场景的一句话描述、以及被测系统的测试环境配置。提示词类似这样:
我在用pytest+requests做接口测试,被测接口是用户登录接口。 - 请求方式:POST - 请求头:Content-Type: application/json - 请求体字段:username, password, remember_me - 登录成功后返回:token, user_info - 登录失败时返回统一错误码:10001 请生成一组pytest测试用例,覆盖正常登录、错误密码、空用户名、超长用户名、remember_me传非布尔值这几种场景。 每个用例要有清晰的断言,断言部分请单独提取成辅助函数。这样生成出来的代码比开放式的“帮我写个接口测试”要落地的多。关键点在于:你给的信息越结构化,AI给代码的可用率越高。如果接口文档有JSON Schema,一并贴进去效果更佳。我试过只给一句“测登录接口”,生成的东西虽然看起来完整,但很多字段名都是AI自己猜的,根本无法直接跑。加上字段列表和返回示例后,可用率立刻提高一大截。
2.2 用pytest+requests跑通AI生成的用例
大模型生成完代码后,我一般会先保存到tests目录,然后执行pytest --collect-only并查看用例收集情况,确认没有语法错误和导入错误。第一次运行大概率不会全过,可能遇到两种情况:
- 一是AI生成的断言里用了不存在的响应字段,比如它以为token在data.token里,实际接口返回是data.access_token;
- 二是它默认当前工作目录就是项目根目录,导致配置文件路径加载失败。
遇到这类问题,我通常会把错误信息原样复制回对话框,让AI自己解释并修正,而不是手工去改。实测下来,这种“运行后反馈-修正-再运行”的循环,比人来改还要快,因为错误信息本身已经很明确。等用例能跑通之后,我再统一把环境相关的内容抽到conftest.py,用环境变量控制测试环境和预发布环境的切换。
# conftest.py 中的环境配置示例 import os import pytest BASE_URL = os.getenv("TEST_BASE_URL", "http://127.0.0.1:8080") USERNAME = os.getenv("TEST_USERNAME", "tester") PASSWORD = os.getenv("TEST_PASSWORD", "123456") @pytest.fixture() def api_context(): return { "base_url": BASE_URL, "username": USERNAME, "password": PASSWORD, }这样AI生成的用例只需要依赖api_context,就能自动适配不同环境,不用每套环境都改一遍代码。
2.3 AI生成代码的三个常见翻车点:断言、数据驱动、环境变量
这里列的三个坑,是我多次使用AI辅助接口测试后总结出来的,希望对你有用:
- 断言写得太死。AI容易把返回值直接和某个常量比较,比如断言status_code == 200,但真正合理的做法是同时校验业务码、关键字段类型、以及敏感信息是否脱敏。比如登录接口成功时,token不应该出现在日志里,这个规则我会专门写进提示词。
- 忽视数据驱动。它生成几组用例时会写好几个几乎一样的函数,而不是用@pytest.mark.parametrize。这种情况下用例维护成本高,我会主动让AI重构为参数化。下面这个结构是我最习惯的写法:
import pytest import requests from utils.assertions import assert_login_success, assert_error_code @pytest.mark.parametrize("payload, expected_error", [ ({"username": "tester", "password": "123456", "remember_me": True}, None), ({"username": "tester", "password": "wrong", "remember_me": False}, 10001), ({"username": "", "password": "", "remember_me": False}, 10002), ]) def test_login_cases(api_context, payload, expected_error): resp = requests.post(api_context["base_url"] + "/login", json=payload) assert resp.status_code == 200 if expected_error: assert_error_code(resp, expected_error) else: assert_login_success(resp)- 环境变量硬编码。AI经常会把base_url写死在文件里。我们现在的做法是在conftest.py里读取环境变量,这样测试环境、预发布环境切换时不用改代码。我会额外提醒AI:“base_url请从环境变量读取,不要写死。”
这三个问题,基本覆盖了AI生成接口测试脚本的80%返工原因。建议大家在团队里把这套反馈整理成固定的检查清单,每次AI生成代码后先自查一遍,再上CI。
3. 移动端UI自动化里的AI:元素定位与用例维护
Appium是移动端UI自动化里绕不开的框架。传统上最让人头疼的是元素定位,各种resource-id、xpath、content-desc组合在一起,换个系统版本就可能失效。AI辅助测试在这个场景里能帮上忙,但不是靠大模型硬猜,而是要让AI理解页面结构。
3.1 Appium中AI辅助定位元素的总体思路
我做过一个实际项目:被测APP的版本更新很频繁,页面控件经常改样式,原来的xpath脚本隔三差五就红一片。后来我把页面dump出来的XML结构交给大模型,让它和上一版本的XML做diff,然后自动生成新的定位表达式。一开始我担心它不理解源码,实际使用后发现,只要XML结构完整,AI根据语义推断元素位置的能力是够用的。
具体操作上,我会先写一个脚本,在元素定位失败时自动抓取当前页面的page_source,保存为XML,然后调用大模型接口,把旧的定位表达式和新的XML一起传过去,让它输出一个修正后的定位方式。这个逻辑可以挂到Appium的异常处理里,实现半自动修复。这里的核心不是让AI每次都生成绝对正确的定位器,而是让它提供一个可疑候选列表,再由脚本按优先级尝试,减少人工介入次数。
3.2 页面变更后AI如何辅助修复选择器
举个例子,旧版本登录按钮的resource-id是“login_btn_old”,新版本改成了“login_btn_new”。AI收到的XML里有“登录”这个文本节点,它就能推断出这两个id对应的都是登录操作。于是它会建议改用文本匹配或者新的id。这里有个关键点:指令描述必须包含业务语义,不要只说“修复这个xpath”,而要说明该元素在页面上的功能,比如“这个元素是登录按钮,负责提交用户名和密码”。
如果只说“修复”,AI会尝试匹配最相似的字段,结果可能选错。给足上下文之后,AI输出的定位器准确率会高很多。我通常会在提示词里附带这个页面的操作目标,甚至会把前后的操作步骤一起贴进去。比如:
当前Appium脚本在登录页面点击“下一步”按钮时定位失败。 旧定位器://android.widget.Button[@resource-id="next_step_btn"] 新的页面XML如下,请结合页面业务语义给出新的定位器。AI看到“下一步”这个业务词,再结合XML里的相邻控件信息,就能推断出该找哪个节点。这个做法比直接让它比较XML字符串要可靠得多,因为UI框架经常会调整节点层级,但业务语义往往能保留下来。
3.3 真实踩坑:OCR识别和AI模型的结合
有一个场景我踩过坑:APP里某个页面是WebView渲染的,部分元素无法直接通过Appium拿到。最初的方案是用截图+OCR识别文本,再做坐标点击。OCR本身是AI能力,但它只能认字,不能理解页面的交互逻辑。后来我加了一层“语义规则”:把OCR识别到的文本和当前操作意图一起告诉AI,让AI决定该点哪个坐标,或者需不需要先滑动页面。这样做之后,成功率从60%提升到了90%左右。
这个案例也说明,AI辅助测试不是某一个AI模型就能包办,而是要把OCR、大模型、规则引擎和原有自动化框架组合成一个流水线。另外要提个醒:OCR识别出的坐标通常有偏移,尤其是不同分辨率的设备上。所以最终点击之前,最好用Appium的get_window_size拿一次当前屏幕尺寸,再对坐标做归一化处理,否则换台设备就会偏。
4. 安全测试与AI:从漏洞平台到报告解读
安全测试是一个信息密度极高的测试领域。AI辅助的价值不在于“自动挖洞”,而在于帮助测试人员更快理解攻击链路和整理报告。我用Pikachu漏洞测试平台做过一组实验,专门验证AI在安全测试中的边界。
4.1 用AI辅助梳理Pikachu靶场的攻击链路
Pikachu是一个Web漏洞测试靶场,里面有SQL注入、XSS、CSRF、越权、文件上传等常见漏洞。我的做法是:让AI先根据漏洞描述生成一份“攻击流程草案”,比如SQL注入可以怎么构造payload、XSS可以怎么弹窗验证。AI生成的内容对于熟悉漏洞原理的老手来说不算新奇,但对我这种偶尔做安全测试的人,确实可以快速启动思路。
更实用的是,AI还能帮我根据响应结果判断漏洞是否被触发。比如我构造了一个payload,响应里出现了数据库报错信息,我会把报错文本粘贴给AI,让它判断这是不是SQL注入的直接证据。这种“取证辅助”的场景,我觉得比生成payload更有价值。因为很多测试人员不是安全专家,看到一个报错就懵了,AI能帮忙解释报错含义,并提示下一步确认方向。
4.2 AI生成安全用例的边界:不能完全信任
AI生成的安全测试用例有一个很大的问题:它容易停留在理论层面,实战中会因为WAF、过滤规则、上下文限制导致失败。比如AI生成了一段XSS payload,但目标程序对尖括号做了HTML实体编码,payload根本不会执行。这时候不能直接判定AI无用,而是要把过滤后的页面响应反馈给它,让它再生成绕过方案。
我最后形成的判断是:AI在安全测试里是“参谋”,不是“主攻手”。真正的漏洞确认、利用链构造和风险评估,依旧需要人来把关。这一点一定要在团队内说清楚,避免大家拿到AI输出的报告就直接提工单,那会闹出乌龙。我之前就见过有人把AI生成的POC直接发到安全工单里,结果开发一复测,发现那个漏洞根本不存在,浪费了大家的时间。
4.3 漏洞报告自动归类与复测提示
安全测试还有一个典型的重复劳动:漏洞报告整理。每个漏洞要写现象、复现步骤、影响范围、修复建议,写到后面很容易内容雷同。我用AI辅助测试整理报告之后,会先把原始Burp Suite请求和响应贴进去,让AI生成复现步骤和修复建议初稿,然后再人工校对。AI生成的速度很快,虽然偶尔会冒出一句不严谨的表述,但总体框架是能用的。
另外,我还会在报告里让AI附上复测提示:修复完成后应该在哪个页面、用什么请求体重新验证。这样开发修复完漏洞后,不需要再回头问测试“怎么复测”,整个闭环顺畅很多。比如AI生成的一句话可能是:
复测方法:重新登录系统,进入个人资料页,在昵称字段输入<script>alert(1)</script>,提交后观察是否弹窗。这句话看着简单,却是开发同学最想要的信息。以前人工写这部分很费劲,现在AI能按固定格式生成,我们只需确认准确性。
5. 汽车电子测试中的AI辅助:HIL、PIL、ADAS、TBOX
汽车电子测试和纯软件测试有很大区别,它涉及硬件在环(HIL)、产品在环(PIL)、ADAS感知测试、TBOX通信测试等。这些场景的特点是数据量大、环境复杂、失败日志难定位。AI辅助测试在这里同样有用,但切入点和互联网测试完全不同。
5.1 为什么汽车电子测试需要AI辅助
汽车电子测试的环境搭建成本极高,跑一次HIL测试要准备多种硬件板卡、总线仿真工具、故障注入设备。所以一旦出现失败,团队希望能快速定位是软件问题、硬件问题还是测试环境问题。AI辅助测试在此处的核心价值,就是对海量日志和时序数据做初步筛分,把疑似根因的范围缩小,减少人工逐行分析CAN总线报文和诊断码的时间。
我见过一个实际场景:TBOX设备的通信模块在低温环境下偶发断连,传统排查方式需要复现环境和抓取几个月的数据。后来我们让AI对历史老化测试日志做聚类分析,它很快发现断连都集中在某几个温度区间,并且和某个网关会话超时参数强相关。虽然AI没有直接给出底层C代码的根因,但这个聚类结果直接指引了后续调试方向。
5.2 设备老化测试全自动执行脚本的AI优化
设备老化测试通常需要长时间运行,脚本要反复执行同一个操作序列,并记录性能衰减曲线。以前的老化脚本一旦遇到某个步骤卡住,整夜执行就废了。我参与优化过一个脚本,做法是在脚本里加入基于AI的异常判断规则:
- 当某个步骤的执行时间超过历史均值的3倍时,自动截图并采集当时的CPU、内存、通信状态;
- 让AI根据这些数据生成“是继续执行、跳过步骤、还是停止”的建议;
- 脚本按照建议自动处理,避免整夜测试白跑。
这个方案并不复杂,但很实用。关键点是不能让AI直接接管执行决策,而要把决策逻辑收敛成有限的选择项,AI只做分类和推荐。比如我给AI的提示词是:
设备老化测试脚本中,步骤“心跳请求”执行耗时超过历史平均值的3倍。 当前温度:-20℃,CPU占用:45%,内存占用:60%。 历史日志显示此温度区间偶发断连。 请从“继续、跳过、停止”三个选项中推荐一个动作,并说明理由。AI输出推荐后,脚本里用一个白名单机制决定是否采纳。比如“跳过”和“停止”都需要额外人工确认一次,只有“继续”可以自动执行。这样既利用了AI的判断能力,又不会因为AI误判导致整夜测试空跑。
5.3 测试数据分析和失败日志的智能诊断
ADAS测试产生的数据更是海量,测试车辆一个上午就能生成几十GB的传感器数据。以前分析一次测试失败要几个人对半天的时间轴。现在我们会把关键时间窗口的日志切片、传感器状态、控制指令一起整合后发给AI,让它列出异常时间点的前后状态关联。AI在这里的优势是能同时处理文本日志和结构化数据之间的关系,比如它可能发现“毫米波雷达误检率升高”和“AEB刹车指令延迟”在时间轴上高度重叠。
这里有一点要注意:汽车电子测试涉及安全相关功能,AI的分析结果只能作为辅助参考,最终判定必须由具备资质的工程师完成。这个边界在汽车行业尤其重要,写报告的时候也要注明AI参与分析的环节。我们不能因为AI给了一个强相关结论,就直接修改测试报告或者规避风险,该走评审的流程必须走完。
6. 搭建自己的AI辅助测试助手:工具链与提示词沉淀
前面分享了很多场景,最后再聊聊落地层面的经验。AI辅助测试能不能长期发挥作用,取决于团队有没有把AI能力沉淀成可复用的工具链和提示词库。
6.1 我的常用工具组合
我把日常使用AI辅助测试的工具分成四层:
| 层级 | 工具/方案 | 作用 |
|---|---|---|
| 交互层 | 大模型对话平台、IDE插件 | 生成用例、问答、代码审查 |
| 框架层 | pytest、Appium、Selenium | 跑用例、采集执行结果 |
| 数据层 | 日志收集、数据库快照、页面XML | 给AI提供上下文 |
| 集成层 | CI流水线脚本、自定义Python脚本 | 串起AI接口和测试工程 |
这里没有推荐某个具体的商业化平台,因为工具迭代太快,但只要分层思路清楚,换掉任何一层都不影响整体方案。我的原则是:AI能力尽量通过API接入,不要存在某个对话网页里,只有API才能被脚本调用,才能形成闭环。否则你今天在网页上问出来的答案,明天想复现就得重新复制粘贴,完全没法自动化。
6.2 沉淀团队级提示词库
团队里每个人和AI对话的方式都不一样,如果不沉淀,效率就是散装的。我把提示词分成了几类:
- 用例生成类:输入接口文档或需求描述,输出pytest用例。
- 失败分析类:输入失败日志和上下文,输出可疑原因列表。
- 脚本修复类:输入旧定位器和页面结构,输出修正建议。
- 报告生成类:输入原始数据和漏洞信息,输出报告初稿。
每一类提示词都放在项目仓库的docs/ai_prompts目录里,用Markdown记录版本和适用场景。新同学入职后,先看这些提示词再上手,比我口头讲十遍都管用。我还习惯在每个提示词文件里写清楚输入格式和输出格式,比如输入是“接口字段列表+返回示例”,输出是“pytest代码+断言说明”。格式定死了,以后自动化调用才好写。
6.3 最后一条经验:让AI做初稿,人做终审
我还是要强调,AI辅助测试最大的误区是“AI输出即答案”。不管哪个场景,我都保留一个人工审核的环节:AI生成用例,人和需求文档对照;AI分析日志,人抽查关键指标;AI修复脚本,人在测试环境回归一遍。这个习惯看起来很保守,但它能避免很多线上事故。
以我个人经验,AI辅助测试的收益曲线不是线性的。最开始把AI用在低价值、高重复的场景,比如生成参数化用例、整理失败日志、生成报告初稿,收益会很快体现。等到流程跑顺了,再往更复杂的场景扩展,比如安全测试分析、汽车电子日志诊断。一步一个脚印地做,AI辅助测试才能真正落地,而不是变成一个炫技的Demo。