基于真实厂商 API 的端到端测试运行指南。 最后更新:2026-04-22
TokenRouter 的 E2E 测试在进程内通过 httptest 组装生产级路由链:
AuthMiddleware → 可选 RateLimitMiddleware → server.ChatPipeline.Handle → DeepSeek API
测试使用临时 SQLite 数据库 seed 用户、API Key、模型定价和请求记录表,直接对接真实 DeepSeek API,验证完整 pipeline 在真实网络环境下的行为。与 tests/integration/ 中的 mock-based 测试互补:mock 测试保证逻辑正确性,E2E 测试保证外部兼容性和生产中间件链路。
E2E 测试分为两个 suite:
| Suite | Build Tag | 请求数 | 用途 | 运行频率 |
|---|---|---|---|---|
| Fast | e2e |
2-3 | 开发阶段快速验证核心场景 | 随时 |
| Full | e2e_full |
10+ | 上线前全量兼容性验证 | 发布前 |
日常 go test ./... 不会运行 E2E 测试(build tag 隔离),不影响开发效率。
- Go 1.22+
- 有效的 DeepSeek API Key
E2E 测试通过环境变量读取配置:
# 必需
export DEEPSEEK_API_KEY="sk-xxx"
也可以在项目根目录 .env 文件中配置(会被 godotenv 读取)。
Fast Suite 覆盖三个核心场景,每次运行消耗 2-3 个 API 请求:
make test-e2e-fast等价命令:
go test -tags=e2e ./tests/e2e/...覆盖场景:
- 非流式请求返回完整 JSON
- 流式 SSE 请求返回完整 data 流
- 带 tools 的请求被上游正确接受
Full Suite 在上线前运行,覆盖边界和并发场景:
make test-e2e-full等价命令:
go test -tags=e2e_full ./tests/e2e/...覆盖场景:
- 长上下文消息(多轮对话)
- 特殊字符 / Unicode
- 并发请求稳定性
- API Key 认证:缺失、无效、已撤销、合法 key
- 隔离限流:小限额下同一认证用户触发 429
- Dedup 对错误状态码的保持
- DeepSeek V4 Flash / V4 Pro(推理模型)基础兼容
- JSON response_format 和采样参数透传
- Tool call 两轮 round-trip
- 无效 model 的错误处理
- 空 messages 边界行为
E2E 测试只验证响应结构,不验证内容:
| 验证项 | 原因 |
|---|---|
choices 存在且长度 >= 1 |
保证响应格式正确 |
message.content 为非空字符串 |
保证模型返回了有效内容 |
usage.prompt_tokens > 0 |
保证计费数据可用 |
SSE 流包含 data: [DONE] |
保证流式协议完整 |
不验证内容的原因:大模型对相同输入可能返回不同内容,内容断言会导致 flaky test。
helper_test.go:XX: DEEPSEEK_API_KEY not set, skipping e2e test
原因:环境变量未设置。
解决:export DEEPSEEK_API_KEY=sk-xxx
原因:上游 DeepSeek API 暂时不可用或网络问题。
解决:检查网络连接,稍后重试。
原因:DeepSeek API 速率限制。
解决:降低并发数,或等待一段时间后重试。Fast Suite 通常不会触发。