你是否还在手写重复的接口自动化脚本?是否担心团队代码风格不一致?是否被“测试报告不直观”和“无法融入流水线”困扰?本教程将带你用 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。

Logo

一站式 AI 云服务平台

更多推荐