企业级接口自动化实战:用 Claude Code + GLM-5 + Skills 零代码生成脚本,自动生成 HTML 报告并接入 CI/CD
本文介绍了一套基于AI的接口自动化测试解决方案,通过ClaudeCode+GLM-5+Skills技术组合,实现从接口文档到标准化测试脚本的智能生成。该方案包含七大核心步骤:1. 准备工作与环境配置;2. 建立企业级代码规范;3. 定义接口YAML文档;4. 创建Mock服务;5. 开发Skill模板实现脚本自动生成;6. 集成可视化测试报告;7. 配置CI/CD实现持续测试。系统能自动生成符合规
你是否还在手写重复的接口自动化脚本?是否担心团队代码风格不一致?是否被“测试报告不直观”和“无法融入流水线”困扰?本教程将带你用 AI 驱动的方式,基于企业接口文档(YAML)和代码规范,借助 Claude Code + GLM-5 + Skills,一键生成标准化的 Python + Requests 接口自动化脚本,并完成业务流程用例的串联测试;测试结束后自动输出高颜值 HTML 可视化报告,最后将整套方案接入 CI/CD,实现提交即测。全程无复杂编码,小白也能跟着跑通落地。
1. 这套方案能解决什么?
传统接口自动化落地时,我们常遇到五个痛点:
-
规范落地难:每个人都按自己的习惯写脚本,目录结构、命名、断言方式五花八门。
-
效率低:一个中等规模的微服务系统有上百个接口,逐个编写用例耗时巨大。
-
业务闭环难:单个接口好测,但把多个接口串联成一条业务链路(如“登录→查商品→下单→支付”)时,脚本维护成本极高。
-
报告简陋:没有直观的HTML可视化报告,领导/同事无法快速了解测试结果。
-
持续集成断层:测试脚本无法自动在 CI/CD 中运行,沦为“一次性”资产。
现在有了大模型和智能编程助手,我们可以:
-
把企业代码规范文档和接口定义(YAML) 作为知识注入 AI;
-
通过 Claude Code 的 Skills 定义可复用的生成规则;
-
让 GLM-5 理解业务意图,直接生成符合规范、可直接运行的接口自动化脚本;
-
自动集成 pytest-html 生成可视化报告;
-
编写 CI/CD 配置文件,实现推送即触发测试,结果自动归档。
2. 整体架构
┌───────────────┐
│ 代码规范文档 │ (markdown)
├───────────────┤
│ 接口文档(YAML) │ (OpenAPI 风格)
├───────────────┤
│ 业务流程描述 │ (自然语言)
└──────┬────────┘
│ 输入
▼
┌─────────────────────────────┐
│ Claude Code + GLM-5 │
│ - Skills: 生成/校验规则 │
│ - 规范理解与脚本生成 │
└────────────┬────────────────┘
│ 输出
▼
┌─────────────────────────────┐
│ 标准化 Python 接口自动化项目│
│ - 规范目录与封装 │
│ - 数据驱动用例 │
│ - 业务流用例串联 │
│ - pytest-html 报告 │
│ - CI/CD 配置 │
└─────────────────────────────┘
我们分 7 步走完这个流程。
3. 准备工作
3.1 环境清单
-
Python 3.10+
-
Git(用于版本管理和 CI/CD 演示)
-
Claude Code(VS Code 扩展或 CLI)
-
GLM-5 API 访问权限(智谱开放平台)
-
一个可测试的接口服务(本文提供 Mock Server)
3.2 安装 Claude Code 并配置 GLM-5
# 安装 Claude Code CLI(如果未安装)
npm install -g @anthropic-ai/claude-code
# 验证安装
claude --version
在项目根目录下创建 .claude.yaml,将默认模型切换为 GLM-5:
# .claude.yaml
model: glm-5
api_key_env: GLM_API_KEY
设置环境变量:
export GLM_API_KEY="你的智谱API密钥"
4. 准备企业级资产(规范+文档)
4.1 代码规范文档 specs/coding_standard.md
在项目里创建 specs/coding_standard.md,定义团队的自动化脚本规范(可根据公司实际情况修改):
# 接口自动化脚本规范 v2.1
## 目录结构
- tests/ # 用例目录
- {module}/ # 按模块分,如 user, order
- test_*.py # 用例文件
- common/ # 公共模块
- base_request.py # 请求基类(含重试、日志)
- utils.py # 工具函数
- data/ # 测试数据(yaml/json)
- reports/ # 测试报告
- conftest.py # 全局 fixture
## 命名规则
- 文件名:test_<模块名>.py
- 类名:Test<模块名>
- 方法名:test_<场景描述>,如 test_login_success
## 请求封装
所有请求必须通过 `BaseRequest` 类发送,该类已封装:
- 统一 base_url 和 header
- 自动打印请求/响应日志
- 失败自动重试一次
## 断言要求
- 必须校验 status_code
- 业务字段使用字典取值或 jsonpath,严禁硬编码索引
- 预期数据从 data/ 下读取,不写在用例体内
## 数据驱动
- 使用 pytest.mark.parametrize 结合 yaml/csv 数据文件
- 数据文件放在 data/ 下,命名与用例对应
## 业务流程
- 复杂流程拆分为独立函数,放在对应的 helper.py 中
- 函数命名:<动作>_<对象>,如 login_and_get_token
## 报告
- 使用 pytest-html 生成 HTML 报告,输出至 reports/ 目录
4.2 接口文档 docs/api.yaml(精简版 OpenAPI)
我们模拟一个简易电商系统的三个接口:登录、查看商品列表、创建订单。
openapi: 3.0.0
info:
title: 电商样板服务
version: 1.0.0
servers:
- url: http://localhost:8000/api/v1
paths:
/auth/login:
post:
summary: 用户登录
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
username:
type: string
password:
type: string
required: [username, password]
responses:
200:
description: 登录成功
content:
application/json:
schema:
type: object
properties:
code: {type: integer}
token: {type: string}
/products:
get:
summary: 获取商品列表
parameters:
- name: page
in: query
schema: {type: integer, default: 1}
- name: size
in: query
schema: {type: integer, default: 10}
responses:
200:
description: 成功
/orders:
post:
summary: 创建订单
security:
- bearerAuth: []
requestBody:
content:
application/json:
schema:
type: object
properties:
product_id: {type: integer}
quantity: {type: integer}
required: [product_id, quantity]
responses:
201:
description: 订单创建成功
4.3 准备一个 Mock 服务(方便验证)
为方便跑通,我们使用 Python Flask 写一个简单的 Mock 服务,真实环境替换成你的实际服务即可。
新建 mock_server.py:
from flask import Flask, request, jsonify
app = Flask(__name__)
tokens = {}
@app.route('/api/v1/auth/login', methods=['POST'])
def login():
data = request.json
if data.get('username') == 'admin' and data.get('password') == '123456':
token = 'fake-jwt-token'
tokens[token] = 'admin'
return jsonify({"code": 200, "token": token})
return jsonify({"code": 401, "msg": "unauthorized"}), 401
@app.route('/api/v1/products', methods=['GET'])
def products():
return jsonify({"code": 200, "data": [{"id": 1, "name": "Book"}, {"id": 2, "name": "Pen"}]})
@app.route('/api/v1/orders', methods=['POST'])
def create_order():
auth = request.headers.get('Authorization')
if auth != 'Bearer fake-jwt-token':
return jsonify({"code": 403, "msg": "forbidden"}), 403
data = request.json
return jsonify({"code": 201, "order_id": 1001, "product_id": data['product_id']}), 201
if __name__ == '__main__':
app.run(port=8000)
运行:
pip install flask
python mock_server.py
5. 创建 Skill 并让 Claude Code 生成全套脚本
5.1 什么是 Skill?
Claude Code 的 Skill 是一种可复用的提示词模板,可以定义输入、处理规则和输出格式。我们创建一个 “企业接口自动化生成器” Skill,让 AI 每次都按我们的规范产出一致性极高的代码,并且内置数据驱动、HTML 报告和 CI/CD 支持。
5.2 创建 Skill:enterprise-api-test-gen
在项目根目录执行:
claude mcp add skill enterprise-api-test-gen
编辑生成的 skills/enterprise-api-test-gen.md,写入以下内容:
# 企业接口自动化脚本生成器
## 目标
根据接口 YAML 文档、代码规范文档、以及用户描述的业务流程,生成可直接运行的企业级 Python 接口自动化项目,包含数据驱动、HTML报告和 CI/CD 配置。
## 输入
- `api_yaml`: 接口文档路径
- `coding_standard`: 规范文档路径
- `business_flow`: 业务流描述(自然语言)
## 规则(必须严格遵守)
1. 项目结构、命名、文件内容须符合 `{coding_standard}` 中的全部要求。
2. 请求一律通过 `BaseRequest` 发送,该类需包含 session 管理、统一日志和重试。
3. 断言校验 status_code 和业务字段,预期数据从 data/ 目录读取。
4. 必须生成数据驱动用例:对于每个接口,根据 YAML 中的 schema 或用户要求,生成至少 2 组数据,放在 data/ 下的 yaml 文件中,并用 `@pytest.mark.parametrize` 驱动。
5. 生成完整的业务流函数,可被 pytest 直接调用,且业务流用例应使用独立文件。
6. 配置 `pytest.ini`,包含 `-v`、`--html=reports/report.html` 和 `--self-contained-html` 选项。
7. 生成 CI/CD 配置文件(如 `.github/workflows/api-test.yml`),实现推送触发、安装依赖、启动 Mock 服务(或真实服务)、运行测试、上传 HTML 报告为 artifact。
8. 任何地方都不允许出现 `pass` 语句。
9. 每个接口调用前加上注释说明步骤。
10. 生成的代码应直接可运行,不得包含占位符。
## 输出格式
- 首先输出文件列表和路径
- 然后输出每个文件的完整 Python/YAML/YML 代码块(带文件名)
5.3 让 Claude Code 读取我们的规范资产
在 Claude Code 对话中,先附加相关文件:
# 进入项目根目录后,启动 claude 对话
claude
在交互式终端里输入(或通过聊天界面):
请读取 specs/coding_standard.md 和 docs/api.yaml 作为后续生成的基础规范。
@enterprise-api-test-gen
laude Code 会加载 Skill 和两个文件。
5.4 生成全套脚本:给定业务流与数据驱动要求
继续对话:
业务流:用户登录后获取token,查看商品列表(第一页),然后下单买第一件商品(数量1)。
请生成完整的接口自动化项目,要求:
1. 登录接口采用数据驱动,覆盖正常登录、密码错误、缺少字段三种情况,数据放在 data/login_data.yaml
2. 查看商品列表和创建订单也要有对应的单接口用例
3. 业务流用例放在单独文件中
4. 自动集成 pytest-html 生成报告,报告放在 reports/ 目录
5. 生成 GitHub Actions CI 配置,触发条件为 push,环境使用 ubuntu-latest
Claude 会基于 Skill 规则,生成如下结构(示例):
文件列表:
- common/__init__.py
- common/base_request.py
- common/utils.py
- data/login_data.yaml
- data/product_data.yaml
- data/order_data.yaml
- tests/__init__.py
- tests/user/__init__.py
- tests/user/test_login.py
- tests/product/__init__.py
- tests/product/test_products.py
- tests/order/__init__.py
- tests/order/test_create_order.py
- tests/order/test_shopping_flow.py
- conftest.py
- pytest.ini
- .github/workflows/api-test.yml
- requirements.txt
5.5 典型生成代码预览
common/base_request.py (通用请求基类)
import requests
import logging
class BaseRequest:
def __init__(self, base_url="http://localhost:8000/api/v1"):
self.base_url = base_url
self.session = requests.Session()
self.logger = logging.getLogger(__name__)
self.logger.setLevel(logging.INFO)
if not self.logger.handlers:
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
self.logger.addHandler(handler)
def send(self, method, path, max_retries=1, **kwargs):
url = f"{self.base_url}{path}"
self.logger.info(f"Request: {method} {url} params={kwargs.get('params')} json={kwargs.get('json')}")
for attempt in range(max_retries + 1):
try:
resp = self.session.request(method, url, **kwargs)
self.logger.info(f"Response: {resp.status_code} body={resp.text[:200]}")
return resp
except requests.RequestException as e:
if attempt < max_retries:
self.logger.warning(f"Request failed, retrying {attempt+1}/{max_retries}: {e}")
else:
raise
data/login_data.yaml
# 登录数据驱动用例数据
- test_id: "login_success"
username: "admin"
password: "123456"
expected_code: 200
expect_token: true
- test_id: "login_wrong_pwd"
username: "admin"
password: "wrong"
expected_code: 401
expect_token: false
- test_id: "login_missing_field"
username: ""
password: "123456"
expected_code: 401
expect_token: false
tests/user/test_login.py
import pytest
import yaml
import os
from common.base_request import BaseRequest
def load_login_data():
data_path = os.path.join(os.path.dirname(__file__), '../../data/login_data.yaml')
with open(data_path, encoding='utf-8') as f:
return yaml.safe_load(f)
class TestLogin:
@pytest.mark.parametrize("case", load_login_data())
def test_login(self, case):
api = BaseRequest()
payload = {"username": case["username"], "password": case["password"]}
resp = api.send('post', '/auth/login', json=payload)
assert resp.status_code == case["expected_code"]
if case.get("expect_token"):
assert "token" in resp.json()
tests/order/test_shopping_flow.py
import pytest
from common.base_request import BaseRequest
class TestShoppingFlow:
def test_buy_first_product(self):
"""登录 -> 查看商品 -> 下单第一个商品"""
api = BaseRequest()
# 1. 登录获取token
resp = api.send('post', '/auth/login', json={
"username": "admin",
"password": "123456"
})
assert resp.status_code == 200
token = resp.json()['token']
headers = {"Authorization": f"Bearer {token}"}
# 2. 查看商品列表
resp = api.send('get', '/products', headers=headers)
assert resp.status_code == 200
products = resp.json()['data']
assert len(products) > 0
product_id = products[0]['id']
# 3. 下单
resp = api.send('post', '/orders', json={
"product_id": product_id,
"quantity": 1
}, headers=headers)
assert resp.status_code == 201
assert resp.json()['order_id'] > 0
pytest.ini
[pytest]
addopts = -v --html=reports/report.html --self-contained-html
requirements.txt
requests
pytest
pytest-html
pyyaml
flask
.github/workflows/api-test.yml
name: API Automation Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Start Mock Server
run: |
python mock_server.py &
sleep 3
- name: Run tests
run: pytest
- name: Upload HTML Report
if: always()
uses: actions/upload-artifact@v4
with:
name: api-test-report
path: reports/report.html
6. 运行验证与报告查看
6.1 安装依赖
pip install -r requirements.txt
pip install -r requirements.txt
6.2 启动 Mock 服务并执行用例
# 启动 Mock 服务(如果之前未启动)
python mock_server.py &
# 运行全部测试
pytest
测试结束后,终端会显示所有用例结果,同时在 reports/ 目录下生成了 report.html。
6.3 查看 HTML 可视化报告
用浏览器打开 reports/report.html,你将看到一个交互式的测试报告:
-
总览:通过/失败/跳过数量
-
环境信息
-
每个用例的详细日志与断言信息
-
支持筛选与搜索
因为使用了
--self-contained-html,报告是独立的 HTML 文件,可以直接发送给同事或归档。
7. 接入 CI/CD:提交即测,报告自动存档
7.1 推送至 GitHub 仓库
将整个项目初始化 Git 并推送至 GitHub:
git init
git add .
git commit -m "init: enterprise api automation with claude skills"
git branch -M main
git remote add origin https://github.com/你的用户名/你的仓库名.git
git push -u origin main
7.2 触发流水线
推送成功后,GitHub Actions 会自动触发工作流。在仓库的 Actions 页面可实时查看运行状态。
7.3 下载测试报告
流水线完成后,在对应的 workflow run 下方,会出现 Artifacts 区域,点击 api-test-report 即可下载 HTML 报告。
至此,你已拥有一个完整的“AI生成脚本 → 数据驱动 → 业务流验证 → 可视化报告 → CI/CD自动运行”的闭环。
8. 拓展与进阶
8.1 让 Skills 生成更多场景
你可以在对话中继续扩展:
@enterprise-api-test-gen 请根据 api.yaml 中 /orders 接口,
增加以下场景:
- 下单时商品库存不足,返回预期错误码
- 未登录直接下单,返回403
数据驱动方式同上。
Claude 会自动生成新的数据文件和用例,并保持规范一致。
8.2 替换为真实服务
将 common/base_request.py 中的 base_url 改为你的真实服务地址,移除 Mock 服务启动步骤,即可直接测试真实 API。
8.3 集成其他报告工具
若需要更丰富的报告,可以修改 pytest.ini 的 addopts,加入 --allure-features 等参数,配合 Allure 生成更专业的测试报告。Claude Code 也能根据指令自动调整配置。
9. 总结
通过这套“Claude Code + GLM-5 + Skills”的 AI 驱动方案,我们实现了:
-
规范统一:所有脚本遵守同一套编码标准,新人无需培训即可读懂;
-
效率倍增:从接口文档到可运行的自动化脚本,仅需一句话;
-
业务闭环:自然语言描述业务流程,即可生成完整的链路用例;
-
数据驱动:自动生成多场景数据文件,覆盖正常与异常;
-
可视报告:一键生成自包含 HTML 报告,方便分享与归档;
-
持续集成:提交即触发测试,报告自动存档至 GitHub Artifacts。
更多推荐


所有评论(0)