搞接口测试这行干久了,最磨人的不是接口本身有多复杂,而是那些“明明天天在重复、却还得从头手写”的脚本代码。我前前后后折腾过 Postman、JMeter、Java 的 TestNG 加 RestAssured、Python 的 pytest 加 requests,工具换了一圈,最后发现真正能把我从“造模板轮子”里解放出来的,反而是 AI。最近半个多月我刻意把所有能交给 AI 的接口脚本都交给 AI 去生成,把“AI 1 分钟生成接口自动化脚本”从一句口号变成了日常工作流,这篇文章就把我踩过的坑、试出来的套路和能直接复用的提示词框架完整写出来。内容不挑框架,你用的是 Java、Python 还是 Apifox、JMeter,思路都能直接搬。
1. 为什么我坚决不手写接口脚本了
1.1 手写脚本的真正成本到底在哪
很多人觉得接口自动化脚本嘛,无非就是发个 HTTP 请求,断言一下状态码和返回值,有什么难的。这话对了一半:单个脚本确实不难,难的是持续维护和批量生产。拿我手头一个典型的业务系统来说,光注册、登录这两个基础模块就能牵扯出十几个用例——正常注册、重复用户名、密码强度不足、参数缺失、Token 过期、验证码错误、账号锁定、并发注册,每个用例至少 30 到 50 行代码,再加上不同环境的 BaseURL 切换、测试数据准备、响应结果回写,一个模块全写完少说三四百行。
三四百行听起来也不多,问题是这套系统还有订单、支付、退款、活动、公告五个类似模块。等于我要把同样的骨架逻辑复制五六遍,每次复制还得小心处理模块特有的参数校验和异常场景。这种工作本质上不是脑力劳动,是体力劳动,偏偏它还特别容易出错——字段名打错一个字母、漏了必填参数、断言类型没转对,任何一个低级错误都要用一次完整的调试去换。
1.2 AI 生成脚本的真实定位:它不是替你思考,是替你做体力活
我见过不少同行对 AI 生成代码有两个极端态度:要么觉得 AI 是神,什么都能写;要么觉得 AI 生成的东西都是垃圾,还得自己改半天。实际用下来,我自己的体会是:AI 干体力活非常靠谱,干脑力活需要你先把思路喂给它。这句话怎么理解?你把“对 /api/register 发 POST 请求,参数是手机号和密码,断言 code 是 0”这样的需求丢给 AI,它 30 秒内能生成像模像样的代码,你在手写的时候要花 10 分钟去敲的模板、导包、异常处理、参数定义,它全给你省了。可你要让它“帮我测一下注册接口有没有漏洞”,它就抓瞎了,因为“漏洞”这个词太抽象,它在没有足够边界条件提示的情况下只能给你生成一堆看似正确但没有攻击性的用例。
所以我现在的工作方式很简单:思路我做,体力活交给 AI。我描述清楚接口长什么样、参数有什么、重点是哪个场景、断言写什么,剩下那些复制粘贴级别的代码,AI 一分钟内搞定。这篇文章要讲的,就是怎么把“思路”这个东西翻译成 AI 听得懂的提示词。
2. 搭一套好用的 AI 生成脚本环境
2.1 工具选型:从 Apifox 到大模型,怎么组合最省心
先说测试工具这层。我日常主力还是 Apifox,主要原因不是它功能最多,而是它在“接口定义”和“脚本调试”之间衔接得特别顺。你在界面上调试通一个接口,它能直接导出 OpenAPI 文档,也能自动生成不同语言的请求代码。Postman 也干得了这活,但 Apifox 对国内团队协作和文档分享更友好一点,看个人习惯。JMeter 那套则更适合压力测试场景,做功能级的接口自动化反而有点重。
再说 AI 这层。我用得最多的是对话式大模型,比如 ChatGPT、Claude、文心、Kimi 这类,它们理解自然语言的能力足够强,生成代码的格式也规范。更重要的一个点是:我测试的项目代码通常不能外发,所以我首选支持本地部署的开源模型,比如 Qwen 系列,或者用国产大模型的 API 接口做内网转发。这里给一个选型建议:如果只是生成通用 HTTP 请求代码,任何主流大模型都能胜任,不需要纠结参数规模;如果你要让 AI 理解项目内部的封装类、自定义注解、业务工具函数,那就必须把相关代码片段塞进上下文,或者用支持代码库检索的 AI 编程插件。市面上不少 AI 编程助手就是干这个的,能让你在 IDE 里直接选中代码片段让 AI 改写,效率比复制粘贴到网页再贴回来高一截。
2.2 环境准备:让 AI 生成的代码“拿起来就能跑”
AI 生成的代码,默认是假设你有一套标准的运行环境。如果环境不齐,脚本生成得再好也白搭。我给自己规定了一套“最小化环境清单”:
- Python 自动化:Python 3.10+,装 requests、pytest、pytest-html,再配一个 jsonpath 库用于灵活的响应提取和校验。
- Java 自动化:JDK 17、Maven,依赖 RestAssured、TestNG、Allure。
- 接口调试工具:Apifox 或 Postman,用于前期手工调通和记录请求样例。
- 版本管理:Git 必须有,AI 生成的脚本我要能随时回滚。
这里多说一句,我遇到过很多人卡在环境安装上,明明 AI 已经把脚本生成好了,跑起来却报“ModuleNotFoundError”或者“No such dependency”。这不是 AI 的问题,是你环境没准备到位。比如热词里有人搜“npm 无法将 npm 项识别为 cmdlet、函数、脚本文件”,这多半就是 Node 没装对或者环境变量没配上。虽然接口自动化不一定要用 Node,但一旦 AI 给你生成了一段 Node 脚本,环境就是第一道门槛。所以在你决定让 AI 帮你写代码之前,先花半小时把语言环境、包管理工具、依赖库装好,比什么提示词技巧都管用。
3. 核心方法论:三段式提示词让 AI 输出稳定产物
3.1 为什么你让 AI 写脚本,写出来的总是一坨废代码
“帮我写一个登录接口的自动化脚本”——这是我见过最普遍的 AI 用法,也是生成质量最差的用法。原因很简单:大模型不是读心术,你的需求描述得越模糊,它就越倾向于生成一个“看起来正确但啥也不是”的万能模板。你以为它知道你登录接口的参数名是 account 还是 username?知道你的加密方式是 MD5 还是 RSA?知道成功返回码是 0 还是 200?不知道,它只能猜,猜的代价就是生成一段需要你大改特改的代码。
这不是 AI 蠢,是信息熵太高。换个角度想,如果你带一个实习生,你也不可能上来就让他“写个登录脚本”就完事,你得告诉他:接口地址在哪、参数有哪些、用什么鉴权方式、断言看哪个字段。AI 需要的信息密度和实习生差不多,你把信息给足,它给你的产出才可用。这个信息差,就是我提炼出“三段式提示词”的原因。
3.2 提示词三段式:背景、需求、细节要求
我把一套完整的 AI 生成脚本提示词拆成三个固定段落,不管生成什么接口脚本都套这个框架:
第一段:交代背景和接口信息。包括接口名称、请求方法、完整路径、请求头、请求体参数、正常响应示例。这段信息越接近真实的接口文档越好,最好直接粘贴 Apifox 导出的参数结构。AI 看到真实结构之后,就不会再瞎猜字段名和类型了。
第二段:交代测试需求和目标场景。你想覆盖哪些用例?是正常的成功路径、参数校验失败、认证异常,还是并发的边界情况?把场景列出来,AI 生成的脚本才不会只有孤零零一个正向用例。
第三段:交代代码风格和断言要求。你说“用 pytest 组织用例,统一用 pytest-html 出报告,成功断言 code=0 且 message 为 success”,AI 生成的代码就自带一整套工程规范,而不是随手在 requests.get 外层套个 print。
举一个我常用的完整模板:
背景:我要测试一个用户注册接口。 接口信息:POST http://api.example.com/register 请求头:Content-Type: application/json 请求体:{"phone": "13800000001", "password": "abc123", "code": "1234"} 正常响应:{"code": 0, "message": "success", "data": {"userId": 12}} 需求:用 pytest 写一个自动化脚本,覆盖3个用例: 1. 手机号未注册时成功返回 2. 手机号已注册时返回 code=1001 3. 验证码错误时返回 code=1002 断言响应里的 code 字段和 message 字段。 细节要求: - 用 requests 库 - BaseURL 单独配置 - 每个用例要能独立运行 - 用 pytest-html 做报告这个模板我给过不少同事,他们用下来反馈基本一致:不管生成什么语言、什么框架的脚本,AI 的输出质量都从“磨了半天还得改”提升到了“改一两个地方就能跑”的水平。
3.3 给足上下文比用什么模型更重要
这里插一个经验:网上很多人喜欢对比“哪个 AI 写代码强”,我自己的实测结论是,在生成接口测试脚本这件事上,上下文完整度比模型强弱更关键。我用能力稍弱一点的国产模型,只要把接口参数表、请求样例、断言要求写清楚,生成结果的可用率能达到八成;反而用能力很强的国际模型,如果你只丢一句话“帮我测注册接口”,它也会给你生成一套架构宏大的无用代码。这个现象在 AI 编程圈其实很普遍:强模型擅长的是知识的广度与复杂推理,而接口脚本生成的需求是典型的结构化信息处理,你喂的信息决定了下限。
4. 实战:让 AI 完成注册登录全流程自动化
4.1 从网页接口文档到第一版可用脚本
下面我用一个注册接口的真实案例走一遍完整的“AI 生成脚本”流程。这个接口是我手上一个活动系统里的基础接口,结构不算复杂:用户通过手机号加短信验证码完成注册,注册成功后响应体里直接带一个 Token,后续所有业务接口都要带这个 Token 才能访问。接口测试圈子公认的一个老规矩是:先过注册登录,再测业务接口,鉴权串不起来后头全是白搭。
我先在 Apifox 里把注册接口调通,确认请求体和响应体的真实结构。然后打开 AI 对话窗口,把下面这段提示词发过去:
请基于如下接口信息生成 pytest 自动化脚本: POST /api/register Header: {"Content-Type": "application/json"} Body: {"phone": "13800000001", "password": "abc123", "verifyCode": "1234"} Response: {"code": 0, "message": "success", "data": {"token": "xxx", "userId": 12}} 要求: 1. 使用 requests 和 pytest 2. 生成两个用例,一个是正常注册成功返回,一个是验证码错误返回 code=4002 3. 每个用例打印请求体和响应体,方便排查 4. 把 base_url 单独定义在模块开头不到半分钟,AI 就给出了一段结构清晰的 pytest 脚本,差不多是这个样子:
import requests import pytest import json base_url = "http://api.example.com" def register(phone, password, verify_code): url = f"{base_url}/api/register" payload = { "phone": phone, "password": password, "verifyCode": verify_code } headers = {"Content-Type": "application/json"} resp = requests.post(url, json=payload, headers=headers) print("Request:", json.dumps(payload, ensure_ascii=False)) print("Response:", resp.text) return resp def test_register_success(): resp = register("13800000002", "abc123", "1234") result = resp.json() assert result["code"] == 0 assert result["message"] == "success" assert "token" in result["data"] def test_register_wrong_code(): resp = register("13800000003", "abc123", "9999") result = resp.json() assert result["code"] == 4002 assert result["message"] == "verify code error"这段代码放在工程里几乎不用改,唯一需要调整的是我为了演示把手机号硬编码写了,实际工程里应该参数化。我让 AI 继续把手机号改成从外部参数文件读取,它又快速生成了一段config.yaml的读取逻辑。到这里,基本就验证了一个事实:AI 的强项正是这些重复度极高的机械编码动作。
4.2 处理登录鉴权:Token 如何自动关联到后续接口
注册只是热身,真正让脚本从“玩具”变成“工具”的是登录鉴权的自动关联。很多接口测试新手最头疼的就是:登录之后返回的 Token 怎么保存,又怎么带着它去访问业务接口?手动操作的时候你可以复制 Token 到下一个请求的 Header 里,但自动化脚本不行,脚本必须自动从登录响应里取出 Token,存进会话,再用到请求头里。
我给 AI 的描述是:
生成一个带登录态关联的 pytest 脚本: 1. 先调用 POST /api/login 获取 token 2. 将 token 自动存入 session headers 3. 然后调用 GET /api/user/info 获取用户信息 4. 断言用户信息中的手机号字段等于登录使用的手机号AI 给出的做法是将登录封装成一个login_session()方法,先登录再返回带 token 的 requests.Session 对象,后续用例直接调用这个 session 去发请求。这套代码其实就是业界一直推荐的做法,区别在于以前我要自己回忆 Session 对象的用法,现在 AI 直接一步到位把代码给我,省掉的不仅是敲键盘的时间,还有翻文档和回忆 API 用法的思维成本。
import requests import pytest base_url = "http://api.example.com" def login_session(phone, password): session = requests.Session() login_url = f"{base_url}/api/login" payload = { "phone": phone, "password": password } resp = session.post(login_url, json=payload) result = resp.json() assert result["code"] == 0 token = result["data"]["token"] session.headers.update({"Authorization": f"Bearer {token}"}) return session def test_get_user_info(): session = login_session("13800000001", "abc123") info_url = f"{base_url}/api/user/info" resp = session.get(info_url) result = resp.json() assert result["data"]["phone"] == "13800000001"这段代码让我想起以前手写的时候反复被坑的一个细节:requests.Session的 headers 要一次性 update 进去,如果每次请求临时加headers={"Authorization": ...},很容易发生某些用例忘了带 Header 导致到处是 401。用 Session 自动关联,等于给所有后续请求穿了一件统一的“认证外套”,这正是自动化脚本能稳定跑起来的前提。在这一点上,AI 生成的代码反而比很多新人手写的更规范,因为它在训练语料里见过了太多官方推荐写法。
4.3 把 AI 生成的脚本扩展成一套可复用用例集
单个脚本跑通不算完,自动化测试的价值在“批量”和“回归”。我接着让 AI 生成一批基于登录态的用例:获取个人信息、修改昵称、绑定邮箱,每个接口都带着 Token,每个用例独立断言。这段时间我的工作效率明显提升,以前从写代码到调试跑通一个模块至少一下午,现在给 AI 描述清楚两三个接口,半天时间能铺完整条主链路的用例。
具体操作上我会让 AI 按同一个模板生成多个文件,文件内部统一import公共方法。比如把login_session()单独放一个conftest.py里,让所有测试模块共享。要是用 Java 项目,把公共逻辑抽成一个BaseTest基类,AI 生成的每个接口脚本都继承它。你可以把这步理解成:AI 生成的是零件,组装成流水线依然要靠你的工程意识。你之前怎么写公共类、怎么设计代码结构,现在把这些结构要求同样写进提示词里,AI 才可能在输出时符合你的项目规范。
5. 实战中踩过的坑和排查套路
5.1 最经典的 401 未登录问题,AI 代码遇到也会懵
翻热搜词的时候看到有个人在找“注册接口测试提示 {"code":401,"message":"未登录,请登录!"}”,这个报错我太熟了。很多刚入行的人第一时间会怀疑接口测试工具是不是有问题,实际上 90% 的情况是:你调用的是需要鉴权的接口,但请求没有携带有效的 Token,或者 Token 已经过期。特别是在 AI 生成脚本的场景下,这种情况更常见——AI 给你按“无鉴权”的状态生成了脚本,一旦遇到需要登录态的接口就会集体 401。
排查逻辑我建议按下面这个顺序来:
- 确认目标接口到底需不需要鉴权,看接口文档或者问开发,别猜。
- 如果接口需要 Token,确认脚本里有先登录再取 Token 的步骤。
- 确认 Token 放的位置对不对,是 Header 里的 Authorization 还是自定义 Header。
- 确认 Token 有没有过期,尤其是手动复制 Token 进脚本的做法,迟早被过期时间坑一把。
- 最后再看是不是 BaseURL 配错了,环境配置错误导致请求根本没打到目标服务上。
AI 代码出 401,本质不是 AI 的锅,是它的判断前提和你的接口实际要求不匹配。只要你把“登录后获取 Token 并存进 Session”这段逻辑作为背景信息明确写在提示词里,AI 生成的脚本就会自带鉴权关联,不会出现裸奔式请求。
5.2 生成代码跑不起来的几类高频原因
AI 生成的代码不是次次都能直接运行。我把最近遇到的高频原因总结一下,你在落地的过程中大概率也会撞上:
第一,依赖缺失。Python 代码里用了pytest、requests,但虚拟环境没装,跑起来直接 ModuleNotFoundError。我的习惯是让 AI 在生成代码的同时输出一份requirements.txt内容,然后建好虚拟环境一次性装齐。
第二,响应结构判断错误。AI 默认假设 JSON 响应里一定有某个字段,但接口实际返回值可能叫别的名字。比如提示词里没给响应体示例,AI 可能断言data.token,真实响应却是data.access_token。这种情况只能靠你把真实响应贴进提示词,或者让脚本先打印完整响应再做断言。
第三,用例之间相互污染。比如两个用例注册同一个手机号,第一个跑完把数据写进了数据库,第二个再跑就报“用户已存在”。我的解法是让 AI 生成测试数据时用随机手机号,或者单独设计清理数据的 fixture。
第四,编码问题。Windows 命令行跑 Python 脚本时,如果请求体里有中文或者响应里有中文,控制台打印经常报 UnicodeEncodeError。让 AI 在脚本开头加上sys.stdout.reconfigure(encoding='utf-8')基本能解决。
5.3 排查工具和日志到底要打到什么程度
我发现不少人有个坏习惯:脚本跑挂了,第一反应是去改代码,而不是先看日志。AI 生成的脚本默认不会帮你想日志这回事,所以我在提示词里经常附加一条:“打印每个请求的 URL、请求头和响应体。”这招看着笨,排查问题时却比什么花哨工具都好用。
你自己看一遍 AI 代码时会发现,它生成的请求日志往往只有一行 print,你根本分不清哪次请求是登录的、哪次是获取用户信息的。所以我一般会让 AI 给每次请求加一个场景标记,比如“【登录请求】”或“【获取用户信息请求】”。实际跑挂的时候,看一眼日志就知道挂在哪一步,根本不用猜。排查接口问题的最高效路径永远是:先确认请求发对了没有,再谈代码逻辑。
6. 从 1 分钟脚本到能落地的自动化体系
6.1 让 AI 生成的代码穿上工程外衣:数据、报告、CI
脚本能跑了,只是起点。要让接口自动化真正产生价值,必须把它放进工程体系和持续集成体系里。AI 可以帮助你完成大部分机械改造,但设计思路仍然得你自己来定。
以我目前一个项目为例,整体结构是:
conftest.py放登录 Session 和全局配置。config.yaml放环境地址和账号密码。cases/目录按模块拆分测试文件。reports/目录输出 pytest-html 报告。- 每次跑完测试,自动把报告上传到内部协作平台,方便团队其他人看。
这个结构我可以让 AI 先“理解”一遍,然后每次生成新模块脚本时都带上同一个结构要求:“生成 pytest 脚本,放在 cases 目录下,复用 conftest.py 里的 login_session fixture。”AI 生成的代码放到工程里,结构一致、命名一致、运行方式一致,维护成本瞬间就下来了。
CI 集成这块,我用的是 GitLab CI 的流水线,把接口自动化脚本挂到每次提测分支上自动执行。大概长这样:
stages: - test api-test: stage: test script: - pip install -r requirements.txt - pytest -s cases/ --html=reports/report.html artifacts: paths: - reports/这个配置 AI 也能帮你生成,你只要把自己的执行目录和依赖装法描述清楚。整个过程里 AI 省掉的是写 YAML 标签、写命令格式这种重复劳动,而判断哪些分支该跑、哪些环境该用、报告给谁看这些决策,还是得依赖你对团队流程的理解。
6.2 沉淀内部提示词模板:把“用 AI”变成团队资产
我最后想重点分享的一个习惯是:把提示词本身变成团队的公共资产。接口测试团队的成员如果每个人各自去琢磨怎么给 AI 下指令,效率差距会很大;但如果团队沉淀一套标准的“接口信息录入模板”,所有人都照着填新接口,那 AI 生成的代码风格就会高度统一,后续互相 review、互相维护都会省心很多。
我们团队现在维护着一个共享文档,里面分好了几个提示词段落:
- 接口基本信息模板
- 登录鉴权模板
- 分环境配置模板
- 断言编写模板
每个模板都是现成的填空式文本。例如生成一个新接口脚本时,只需要把 Apifox 里的接口定义复制到模板的“接口信息”位置,再列出要覆盖的用例场景和断言要求,发给 AI,1 分钟后产出的脚本基本就是项目里能直接用的风格。这就相当于把每个人“调教 AI”的经验沉淀到了组织层,而不是靠个人封印在各自对话窗口里。
7. 写在最后的一点实在话
这一路用 AI 生成接口自动化脚本,我最深的感受是:工具确实解放了生产力,但真正让脚本工程化、可维护的,依然是那些不 sexy 的功夫——接口文档整理得清不清楚、用例场景考虑得全不全、日志和报告设计得好不好用。AI 在中间解决的是“从需求到代码”这一段重复劳动,而一个测试工程师的不可替代性,在于你能不能把“需求”这件事本身定义得足够清晰。
对我个人来说,现在每天从 Apifox 调通接口到生成一套可跑、可看报告、可进 CI 的自动化用例,时间从过去的三四个小时压缩到了半小时左右。省下来的时间我没有拿去摸鱼,而是花在了设计更复杂的接口场景、排查线上偶发问题、梳理更完善的测试数据上。说白了,AI 确实做到了让我 1 分钟拿到脚本,但拿到脚本之后怎么用出价值,那才是咱们真正的手艺。如果你也想往这个方向走,我的建议很朴素:先拿自己最熟的一个接口,把文章里的三段式提示词套上去试试,跑通了再逐步扩大范围。不用怕 AI 写得不够好,你要怕的是自己连让它写得更好的一分钟都不愿意花。