从脚本到工程体系:用 Claude Code + GLM-5 搭建企业级 AI 接口自动化测试平台(TaoToken 统一 Key 接入篇)
发布时间:2026/9/25 11:56:26来源:尧图网络
1. 从能跑到能扛接口自动化测试的工程化断层很多团队都经历过这个阶段用 Claude Code 一句话生成几个 pytest 脚本跑通了登录、下单、查询看着终端里的绿色 PASS 挺开心。可一旦接口数量从 20 个涨到 200 个环境从 dev 扩到 stg、prod问题就全冒出来了——base_url 硬编码在用例里、测试数据互相污染、失败重试靠手动、报告只有一份 HTML 没人看。这时候你会发现缺的不是“生成脚本的能力”而是把脚本组织成工程体系的能力。这篇要解决的就是这个断层。核心思路是让 Claude Code 负责生成符合规范的用例骨架让 GLM-5 负责补全断言和边界条件而所有模型调用统一走 TaoToken 的 Key 和 API 通道避免在多个平台之间来回切换 Key、对账、限流。适合谁适合已经能写 pytest、但项目一变大就失控的测试开发同学也适合想把 AI 生成能力真正嵌进 CI 流水线的工程团队。我试过把 Key 散落在各个脚本里后来发现统一入口才是省心的关键。下面从配置骨架开始一步步搭出可复制的目录分层、config.toml、settings.json最后跑一次接口回归验证整条链路。2. TaoToken 前置统一 Key 与 API 通道在动手写配置之前先把“模型调用”这件事收口。企业级测试平台里AI 能力通常出现在三个位置生成用例骨架、补全断言、失败归因分析。如果每个位置各接一个平台的 Key运维成本会指数级上升。TaoToken 在这里扮演的是统一入口——一个 Key 覆盖 Claude Code 和 GLM-5 的调用API 地址固定计费和限流集中管理。你需要先拿到 Key。访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进入控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建时建议按用途命名比如pytest-gen、assert-fill方便后续在日志里区分调用来源。API 基础地址统一用 https://taotoken.net/api 注意这个地址不带任何查询参数直接作为 base_url 写进配置即可。模型对话调试可以在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 里先验证 GLM-5 是否可用确认返回正常再写进工程配置。如果你后续要做长期编码或 Agent 任务可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。注意Key 只放在环境变量或本地配置文件里不要提交到 Git。下面所有配置示例都用占位符sk-xxxx你替换成自己的即可。3. 可复制配置config.toml 与 settings.json 骨架工程化的第一步是把“环境相关”和“模型相关”的配置从代码里抽出来。我采用双文件策略config.toml管测试环境和执行策略settings.json管 AI 通道和模型参数。这样 CI 里只需要替换环境变量不用改代码。3.1 目录分层示例先看整体结构后面所有配置都基于这个分层api-test-platform/ ├── config/ │ ├── config.toml # 环境与执行策略 │ └── settings.json # AI 通道与模型参数 ├── common/ │ ├── config_loader.py # 配置加载器 │ ├── base_request.py # 统一请求封装 │ └── data_factory.py # 测试数据工厂 ├── tests/ │ ├── conftest.py # 全局 fixture │ ├── smoke/ │ │ └── test_health.py │ └── regression/ │ └── test_order_flow.py ├── scripts/ │ └── coverage_calc.py ├── reports/ └── pytest.ini这个分层的核心原则是config/只放配置common/只放可复用能力tests/只放用例scripts/只放辅助脚本。Claude Code 生成用例时只要约束它往tests/下写就不会污染其他层。3.2 config.toml 完整骨架# config/config.toml [default] env dev timeout 10 retry 2 retry_delay 3 [env.dev] base_url http://localhost:8000/api/v1 db_host localhost db_name shop_dev [env.staging] base_url https://staging-api.example.com/api/v1 db_host staging-db.internal db_name shop_stg [ai] provider taotoken base_url https://taotoken.net/api model_gen claude-code model_assert glm-5 max_tokens 4096 temperature 0.2这里把base_url按环境隔离用例里通过 fixture 读取绝不硬编码。[ai]段落里model_gen负责生成用例骨架model_assert负责补全断言两者都走同一个base_url。3.3 settings.json 完整骨架{ ai_channel: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, timeout: 60, max_retries: 3 }, models: { claude-code: { endpoint: /v1/messages, role: case_generator }, glm-5: { endpoint: /v1/chat/completions, role: assertion_filler } }, logging: { level: INFO, file: reports/ai_calls.log } }api_key_env指向环境变量名而不是直接写 Key。运行时用os.getenv(TAOTOKEN_API_KEY)读取。这样在 CI 里只需要配置一个 Secret本地开发用.env文件加载。3.4 配置加载器# common/config_loader.py import os import json import tomllib from pathlib import Path ROOT Path(__file__).resolve().parent.parent def load_config(env: str | None None) - dict: with open(ROOT / config / config.toml, rb) as f: cfg tomllib.load(f) env env or os.getenv(TEST_ENV, cfg[default][env]) merged {**cfg[default], **cfg[env][env], ai: cfg[ai]} return merged def load_settings() - dict: with open(ROOT / config / settings.json, r, encodingutf-8) as f: return json.load(f)tomllib是 Python 3.11 内置的如果你用 3.10换成tomli即可。加载器把默认配置和环境配置合并用例里拿到的就是一份扁平化的字典。4. 验证请求一次接口回归的完整动作与预期输出配置写好了得跑一次真实回归来验证整条链路。这里用 Claude Code 生成一个订单流程的用例骨架再用 GLM-5 补全断言最后通过 TaoToken 通道调用。4.1 生成用例骨架在 Claude Code 里输入约束提示让它按目录分层生成在 tests/regression/ 下生成 test_order_flow.py 要求 1. 使用 config fixture 获取 base_url禁止硬编码 2. 使用 DataFactory 生成用户和商品数据 3. 包含创建订单、查询订单、取消订单三个步骤 4. 每个步骤留出 assert 占位标注 # TODO: assert 5. 添加 allure 装饰器生成的骨架大致如下# tests/regression/test_order_flow.py import allure import pytest from common.base_request import BaseRequest from common.data_factory import DataFactory allure.feature(订单管理) class TestOrderFlow: allure.story(创建并取消订单) def test_create_and_cancel_order(self, config): api BaseRequest(config[base_url]) user DataFactory.user_payload() product DataFactory.product_payload() resp_user api.post(/auth/register, jsonuser) # TODO: assert resp_order api.post(/orders, json{ user_id: user[username], product_id: product[name], quantity: 1 }) # TODO: assert order_id resp_order.json().get(order_id) resp_cancel api.post(f/orders/{order_id}/cancel) # TODO: assert4.2 用 GLM-5 补全断言把上面的骨架和接口文档片段一起发给 GLM-5让它补全# TODO: assert部分。调用走 TaoToken 的/v1/chat/completions# scripts/fill_assertions.py import os import json import requests from common.config_loader import load_settings def fill_assertions(code_snippet: str, api_doc: str) - str: settings load_settings() channel settings[ai_channel] key os.getenv(channel[api_key_env]) resp requests.post( f{channel[base_url]}/v1/chat/completions, headers{Authorization: fBearer {key}}, json{ model: glm-5, messages: [ {role: system, content: 你是接口测试断言专家只输出补全后的代码。}, {role: user, content: f接口文档{api_doc}\n\n待补全代码{code_snippet}} ], temperature: 0.2, max_tokens: 4096 }, timeoutchannel[timeout] ) resp.raise_for_status() return resp.json()[choices][0][message][content]补全后的断言会变成类似resp_user api.post(/auth/register, jsonuser) assert resp_user.status_code 201, f注册失败: {resp_user.text} assert user_id in resp_user.json() resp_order api.post(/orders, json{...}) assert resp_order.status_code 201 assert resp_order.json()[status] created resp_cancel api.post(f/orders/{order_id}/cancel) assert resp_cancel.status_code 200 assert resp_cancel.json()[status] cancelled4.3 执行回归并查看预期输出export TAOTOKEN_API_KEYsk-xxxx export TEST_ENVdev pytest tests/regression/test_order_flow.py -v --alluredirreports/allure-results预期输出tests/regression/test_order_flow.py::TestOrderFlow::test_create_and_cancel_order PASSED [100%] 1 passed in 2.34s 如果断言失败终端会打印resp_user.text的内容方便定位是接口返回结构变了还是数据问题。Allure 结果目录里会生成对应的 JSON后续可以用allure serve查看带步骤的报告。5. 本篇常见错排查5.1 401 Unauthorized最常见的原因是环境变量没生效。检查echo $TAOTOKEN_API_KEY是否有值以及settings.json里的api_key_env名称是否和实际环境变量一致。注意 Key 不要带引号也不要在末尾留空格。5.2 模型返回空内容如果 GLM-5 返回的choices[0].message.content为空先确认max_tokens是否设得太小。补全断言这种任务建议至少 2048。另外检查temperature是否过高导致输出不稳定测试场景建议 0.2 以下。5.3 base_url 拼接错误BaseRequest里如果直接拼接config[base_url] path要确保base_url末尾没有多余的/path 开头有/。建议在BaseRequest.__init__里做一次rstrip(/)处理。5.4 pytest 找不到 config fixtureconfigfixture 必须定义在conftest.py里且conftest.py要在tests/根目录。如果放在子目录只有该子目录的用例能用到。全局 fixture 统一放tests/conftest.py。5.5 并行执行时数据冲突用pytest-xdist并行时多个 worker 可能生成相同的用户名。DataFactory里要加随机后缀比如fuser_{fake.user_name()}_{random.randint(1000,9999)}避免唯一约束冲突。6. 把 AI 通道收口到工程体系里走到这里你已经有了可复制的config.toml、settings.json、目录分层以及一次完整的回归验证动作。关键点不在于某个脚本多聪明而在于所有 AI 调用都通过 TaoToken 的统一 Key 和 API 通道走配置集中、日志集中、限流集中。后续要扩展失败归因、用例自愈只需要在settings.json里加模型配置不用动业务代码。如果你在接入过程中遇到 Key 或通道问题可以直接看接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。需要管理多个项目的 Key去 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。长期跑编码和 Agent 任务的话Coding Plan 会更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 相关的接入细节在 https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-codeutm_campaignrewrite 。最后留一个实用技巧在conftest.py里加一个 session 级的 fixture启动时打印当前环境和模型配置跑 CI 时一眼就能看出用的是哪个通道省去翻日志的时间。
网站建设高端定制企业官网