AI接口自动化
playwright是跑回归的,功能自动化回归比较合适,录完脚本会有擦除的动作,要不然再跑就会报错。
在cursor里点击Open project,选择文件夹新蜂商城第四版 2,如下图:

新蜂商城项目部署文档:
项目概述:
新蜂商城是一个前后端分离的电商系统,由三个独立服务组成:
| 服务名称 | 技术栈 | 端口 | 说明 |
|---------|--------|------|------|
| **newbee-mall-api** | Spring Boot 2.7.5 + MyBatis | 28019 | 后端 API 服务,提供所有业务接口 |
| **newbee-mall-vue3-app** | Vue 3 + Vite 4 + Element Plus | 4173 | 前台商城,面向普通用户 |
| **vue3-admin** | Vue 3 + Vite 2 + Element Plus | 4174 | 管理后台,面向管理员 |
服务依赖关系:

## 🔧 环境依赖
### 后端 API(newbee-mall-api)
| 依赖 | 版本要求 | 说明 |
|------|---------|------|
| **JDK** | 1.8+ | Java 运行环境 |
| **Maven** | 3.6+ | 项目构建工具 |
| **MySQL** | 5.7+ / 8.0+ | 数据库(推荐 8.0) |
| **Spring Boot** | 2.7.5 | 已在 pom.xml 中定义 |
### 前端项目(newbee-mall-vue3-app & vue3-admin)
| 依赖 | 版本要求 | 说明 |
|------|---------|------|
| **Node.js** | 16+ | JavaScript 运行环境(推荐 16.x 或 18.x) |
| **npm** | 8+ | 包管理器(随 Node.js 安装) |
## 📦 部署步骤
### 1️⃣ 数据库准备
首先在cursor里输入创建一个MySQL5.7版本的数据库,一路按照提示装好MySQL

#### 1.1 创建数据库并导入数据
# 登录MySQL:
新开一个cmd窗口,进入D:\mysql-5.7.44-winx64\bin>路径下,输入mysql -h 127.0.0.1 -uroot -p123456,点击回车,如下图:

# 执行 SQL 脚本(在 MySQL 命令行中)
source /path/to/newbee-mall-api/src/main/resources/newbee_mall_db_v2_schema.sql;(如果报错,证明cursor已经帮我执行完了,跳到下一步)
# 验证数据库创建成功
SHOW DATABASES LIKE 'newbee_mall_db_v2';

USE newbee_mall_db_v2;

SHOW TABLES;

**数据库信息**:
- 数据库名:`newbee_mall_db_v2`
- 字符集:`utf8mb4`
- 排序规则:`utf8mb4_general_ci`
### 2️⃣ 后端 API 部署
#### 2.1 修改配置文件
**文件路径**:`newbee-mall-api/src/main/resources/application.properties`
```properties
# 数据库连接地址(修改为服务器 IP)
spring.datasource.url=jdbc:mysql://服务器IP:3306/newbee_mall_db_v2?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
# 数据库用户名(修改为实际用户名)
spring.datasource.username=root
# 数据库密码(修改为实际密码)
spring.datasource.password=your_password
# 服务端口(可选,默认 28019)
server.port=28019
```
**配置说明**:
- `spring.datasource.url`:数据库连接地址,将 `localhost` 改为服务器 IP
- `spring.datasource.username`:数据库用户名
- `spring.datasource.password`:数据库密码
- `server.port`:后端服务监听端口,前端会调用此端口
#### 2.2 构建项目
```bash
cd newbee-mall-api

# 清理并打包(跳过测试)
mvn clean package -DskipTests
如报错,如下图:

把报错截图发给cursor,让其帮解决,原因很明确:本机没有安装 Maven,或 mvn 不在 PATH 里。在cursor里输入帮我安装Maven并配好PATH,如下图:

如下图:

在执行mvn clean package -DskipTests,如下图:

#### 2.3 启动服务
```bash
# 前台启动(测试用)
java -jar target/newbee-mall-api-3.0.0-SNAPSHOT.jar

出现该页面就可以打开swagger网页了
# 后台启动(生产环境)
nohup java -jar target/newbee-mall-api-3.0.0-SNAPSHOT.jar > api.log 2>&1 &
# 查看日志 tail -f api.log(Windows系统,运行这个命令会报错)
```
前台服务启动后,浏览器里输入http://localhost:28019/swagger-ui/index.html,点击回车,出现如下页面即可:

在新蜂商城第四版 2同级目录新建目录.cursor,再新建文件夹rules,在.cursor/rules而文件夹下新建一个文件api-testing.mdc,结构如下图:

文件内容如下:
不需要参考任何以前api自动化项目实现方式和逻辑,创建一个 Python 接口自动化测试项目api-test,使用 pytest + requests。
项目要求:
1. 创建完整的项目结构
2. 封装 API 客户端,支持登录认证
3. 使用 pytest fixtures 管理测试数据
4. 支持生成 HTML 测试报告
5. 支持参数化测试
6. 包含日志记录
生成api-test项目后,在config目录下的settings.yaml文件里输入如下:
tests下面的用例不好,都删除,cursor里输入跑一下登录测试用例,并打印日志,运行完成后生成一个test_auth.py文件,并显示全部失败了,在测试报告里也能看到。在cursor里输入只运行正常登录用例,并在控制台打印出请求和返回结果,显示1 failed,如下图:

在cursor里输入用户名用13800000000,密码直接用明文123456进行请求,在控制台打印日志,打印日志如下:

在cursor里输入用户名用13800000000,密码直接用e10adc3949ba59abbe56e057f20f883e进行请求,在控制台打印日志,打印日志如下:

从数据库里查只有两个用户,如下图:

反例都是ok,和接口文档上的错误码保持一致,现在跑一下正例,在cursor里输入{"loginName": "13700002703", "passwordMd5": "25f9e794323b453885f5181f1b624d0b"} 用这个数据请求一下登录用例,如下图:

在cursor里输入如下:
生成的用例包含
1. 正常场景:正确参数返回正确结果
2. 参数验证:缺失参数、错误类型、边界值
3. 权限验证:未登录、无权限、Token 过期
4. 业务逻辑:各种业务状态
自动化测试case必须包含业务断言
打印内容如下图:

case比较别扭,大模型写的case采纳率还是很高的。
登录的话用户名、密码从哪来?
大模型从业务上可以跑注册接口;大模型也可以从数据库里拿到用户名和加密的密码,但是不建议这么干,因为这个项目比较简单;
数据来源:1、内置数据 2、调接口
可以把数据放到配置文件settings.yaml里(内置);
在settings.yaml文件里把数据提前放进去,哪个接口取哪个数据内置好,做一下说明,给谁去用的(调接口);
这两类方法都可以,最简单的方式还是内置数据。
在cursor里输入http://localhost:28019/swagger-ui/index.html#/,读取所有接口信息,并把全部接口信息放到config路径下,生成的文档如下图:

这个文件就是对应视频里的openapi.json,生成的数据有点多,在cursor里输入生成新蜂商城前台接口正向用例,每个正向用例只生成一条case,不要生成任何负向case,正常应该把接口文档导出成一个.json文件,打印如下图:

在cursor里输入每个用例加上用例标题,比如登录用例标题为 用正确用户名密码登录,test_mall_address.py、test_mall_cart.py、test_mall_category.py、test_mall_goods.py、test_mall_index.py、test_mall_order.py、test_mall_user.py,运行完每个用例都加了标题;
在cursor里输入在每个用例里,再加上每个接口的请求参数值以及断言内容是什么,可以看到右侧控制台和用例里都加上了请求和断言,如下图:

在test_mall_user.py文件里,有6个正例,对应的接口文档里也有6个接口,能对应上,如下图:

接口开发的时候遵循幂等原则,不是把请求打过去就给我返回ok或success,查数据库如果落库,一系列操作都完成了,才能返回正确的状态码,否则不会返回正确的状态码,业务里返回2000即可。
在cursor里输入只运行test_get_index_infos这个测试用例,在控制台里打印请求和返回结果,返回如下图:

不确定对不对,因为请求的时候要传个token,在cursor里继续输入打印完整的response,显示1 passed,但是没有看到token,在cursor里输入这个接口请求里要求在header里传token,你这次请求的token是从哪来的,没有token是不会成功的,打印如下图:

请求里没带token,不确定是不是接口文档有问题,换个接口,输入只运行test_logout用例,打印如下图:

这个流程是对的,先登录一次拿着token再去登出,先去跑前置依赖的用例再去跑别的用例,接口采纳比较高,接口文档的质量比较高,依赖关系都有说明,提示词丰富大模型生成接口自动化用例质量高。
高质量的接口文档:
1、接口文档每个接口的 url 路径、参数、方法、必须包含
2、请求参数和返回参数 带上解释,每个参数的参数类型、长度 都需要明确(生成异常用例)
3、带上请求示例和返回示例(大模型知道怎么拼请求,返回怎么校验)
4、每个接口带上业务状态码,正确的业务状态码,错误的各种业务状态码(方便断言)
5、header里传什么也需要明确
6、带上接口参数之间的依赖或者解释(生成依赖的时候知道调用顺序是什么)
7、接口名称建议跟实际业务保持一致
8、如果是Swagger、Apifox之类生成接口文档的,要求研发不要魔改接口或者重写接口
在cursor里输入{}openapi.json 基于该接口,先生成接口业务链路场景,只先生成场景,不要生成测试case,链路需要我确认,生成如下图:

正常会生成一个flows文件夹,下面包含两个文件夹,一个是admin,另一个是mall,mall下面有8个yaml文件,如果没有生成,在cursor里输入如下:
在config同级目录下生成一个flows目录,下面生成两个目录,一个是admin目录,一个是mall目录,把上面生成的8个场景写到mall目录下,每个的链路生成一个.yaml文件,把链路写到对应的文件里,每个.yaml文件里包含链路的步骤,如
- id: s1
name: 获取首页数据
description: 轮播图、新品、推荐等
request:
method: GET
path: /api/v1/index-infos
expect:
status_code: 200
result_code: 2000
extract: {}
这种,如果有s2、s3都生成步骤出来,包含上面的字段,expect和extract等
感觉每条链路都挺清晰,也可以合并链路,生成一个长点儿的链路,长的链路如果中间某个接口出问题了,调试比较麻烦,短的链路调试容易些,短和长链路各有好处。
接口文档上没有业务逻辑描述,大模型为什么给我生成了链路,而且还是对的?
因为大模型对常见的业务有比较强的推理能力,因为以前训练的时候有商城的历史数据,知道每个场景,对通用的逻辑有比较强的泛化能力。
链路合并一下,在cursor里输入调整用户类接口场景,register-login-info-改资料-改密码-增/列表/详情/改/默认/删地址-logout,打印出用户的链路,如下图:

因为合并链路,有的链路就被删掉了,整理成一个新的链路,对应的路径如下:
1、POST /user/register(用户注册)
2、POST /user/login(用户登录)
3、GET /user/info(获取用户信息)
4、PUT /user/info(修改资料)
5、PUT /user/password(修改密码)
6、POST /address(新增地址,defaultFlag=0)
7、GET /address(列表里能找到刚加的地址,取出 addressId)
8、GET /address/{addressId}(新增地址详情,详情与新增内容一致)
9、PUT /address(改详细地址,并把 defaultFlag 改为 1)
10、GET /address/default(返回的就是刚改成默认的那条)
11、DELETE /address/{addressId}(删除地址,列表里不再有该 addressId)
12、POST /user/logout(退出,清除 token)
大模型不知道业务逻辑/链路 就给大模型输入
1、人工整理,基于接口去整理,不建议基于前台页面功能去整理(前台页面的功能可能跟接口对应不上) ,业务背景的补充 ----提示词/文件/知识库,不仅仅是提示词,还有可能是文件,写一个文件(config里写个文件)/知识库召回也行,业务场景链路在里面,好处是:
a、不用每次动态注入了;
b、提示词不用上下文,上下文窗口超了,也不影响,一直在文件里;
c、以文件/知识库描述业务链路为依据,大模型不会自由发挥,写了提示词可能会被压缩掉,被干扰,写到文件里就会参考生成业务链路。
2、代码生成,大模型扒代码,生成接口业务逻辑;
在cursor里输入如下:新蜂商城第四版 2 完整、仔细阅读项目代码,分析并整理出项目前台商城的接口业务逻辑调用链路,具体参考下图:

生成如下图:

也可以用@codebase ,cursor自带的,可以@codebase 整理出项目前台商城的接口业务逻辑调用链路,和上面的提示词一样的效果。
在cursor里输入最终分析出来的业务链路有几条,都用中文描述出来,打印如下图

在cursor里输入@codebase 整理出项目前台商城的接口业务逻辑调用链路,生成的链路如下图:

人工整理和代码生成的大同小异
3、要求研发在提供接口文档时候 给出接口业务链路调用逻辑/时序图。有了接口文档+接口业务调用逻辑场景化用例生成还缺少入参值的传递。
steps:
- id: s1
name: 获取首页数据
description: 轮播图、新品、推荐等
request:
method: GET
path: /api/v1/index-infos
expect:
status_code: 200
result_code: 2000
extract: {}
每条链路的yaml文件里,有这个步骤,expect就是断言的内容,如果缺失根据业务逻辑还可以再加;extract是从返回结果里提取什么变量出来,下面这步提取出来变量了,如下图:

这个goodsId,在后面的步骤被引用,用${goodsId},登录提取出token,供后面步骤使用,如下图:

取出goodsId和token后,下面的步骤就引用它们,如下图:

先生成业务flow
1、flow里定义了用例生成的全部依赖信息、路径、参数、断言、返回结果提取规则以及变量依赖传递
2、方便修改,直接先修改flow文件,效率高很多
3、经验或者规则/记忆的沉淀
生成flow后要生成用例,在cursor里输入基于 C:\api-auto\api-autotest\flows\mall\MALL-01_register_to_logout.yaml 文件生成用户相关业务链路测试case,如果脚本里没有出现各个场景的描述,在cursor里继续输入test_mall_user_flow.py 基于这个文件,把12个节点的名称分别展示在脚本里,运行后在脚本里可以看到所有的节点名称,接下来运行一下该用例,在cursor里输入运行一下该用例,打印出每一个接口的请求以及返回结果,打印在控制台上,如下图:




浙公网安备 33010602011771号