Files
prompt-optimizer/docs/testing/vcr-usage-guide.md
linshen 63ab9e66cd feat(test): 建立完整的测试基础设施和集成测试
- 建立 VCR 测试基础设施,支持 LLM API 回放
- 添加错误门禁和冒烟测试
- 添加 LLM 服务集成测试(P0)
- 记录测试进展并更新任务计划
2026-01-03 21:08:00 +08:00

3.0 KiB
Raw Permalink Blame History

VCR 使用指南

VCRVideo Cassette Recorder用于在自动化测试中对 LLM API 调用进行录制回放,让测试在离线/CI 环境中也能稳定运行。

目录

快速开始

# 默认auto 模式(有 fixture 就回放;缺 fixture 且未启用真实 API 时会失败或降级,取决于测试/拦截层)
pnpm test

# 强制回放CI 推荐):缺 fixture 或未拦截请求会直接失败
pnpm test:replay

# 重新录制(真实 API会产生费用需配置 API Key
pnpm test:record

# 禁用 VCR真实 API会产生费用需配置 API Key
pnpm test:real

模式与环境变量

VCR 的行为由以下环境变量控制:

  • VCR_MODE: auto | record | replay | off
  • ENABLE_REAL_LLM=true: 允许真实 API用于 record/off
  • RUN_REAL_API=1: 兼容 core 包已有开关(等价于 ENABLE_REAL_LLM=true

项目已提供脚本(根目录 package.json

  • pnpm test:record 等价于 VCR_MODE=record ENABLE_REAL_LLM=true pnpm test
  • pnpm test:replay 等价于 VCR_MODE=replay pnpm test
  • pnpm test:real 等价于 VCR_MODE=off ENABLE_REAL_LLM=true pnpm test

Fixtures 目录结构

默认 fixtures 目录位于:

  • packages/core/tests/fixtures/

按提供商/场景名组织:

  • packages/core/tests/fixtures/llm/<provider>/<scenario>.json

示例:

  • packages/core/tests/fixtures/llm/deepseek/optimize-simple-prompt.json

编写测试

在 core 包测试中,优先使用 withVCR() 包住真实调用(录制/回放由 VCR 决定):

import { withVCR } from '../utils/vcr'

const response = await withVCR(
  'optimize-simple-prompt',
  { provider: 'deepseek', model: 'deepseek-chat', messages: [{ role: 'user', content: 'hi' }], stream: true },
  async () => {
    // 这里放真实 API 调用record/off 模式会实际发请求)
    return await llmService.optimizePromptStream(...)
  }
)

核心原则:

  • 日常开发/CI使用 replay,确保测试离线可重复
  • 需要更新 fixtures使用 record 并显式启用真实 APIENABLE_REAL_LLM=true
  • fixtures 需要纳入版本控制(避免 CI 缺失导致不稳定)

故障排查

  1. Fixture not found
  • 说明当前处于回放路径但缺少 fixture。
  • 解决:运行 pnpm test:record 生成 fixture并将 packages/core/tests/fixtures/ 纳入提交。
  1. Real LLM is disabled. Cannot record fixture.
  • 说明正在录制,但未启用真实 API。
  • 解决:运行 pnpm test:record(已自动设置 ENABLE_REAL_LLM=true),并确保 .env.local 中配置了对应 API Key。
  1. 回放时出现“未拦截请求”错误
  • pnpm test:replay 会以更严格的方式运行,任何未被 fixtures/MSW 覆盖的请求都应视为失败。
  • 解决:补齐对应 fixture 或补齐拦截/handlers避免测试静默访问网络。