后端与接口
需要将本地 YAML 测试用例、模板和…
适用于已订阅 Shiplight cloud 并通过 MCP 工具或 REST API 推送/拉取测试资产、管理运行、环境、套件、标签和产物的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要将本地 YAML 测试用例、模板和 特定
解决思路
- 前置要求:需要 Shiplight cloud subscription 和 SHIPLIGHT_API_TOKEN。
- 如果 cloud MCP tools(save_test_case、get_test_case 等)不在工具列表中,说明 token 缺失。
- 引导用户:Cloud tools are not available。从 https://app.shiplight.ai/settings/api-tokens 获取 API token,在项目 .env 文件中设置 SHIPLIGHT_API_TOKEN,然后重连 MCP(/mcp)。
- 如果用户提供 token,将其追加到项目的 .env 文件(必要时创建),并告诉用户:Saved to <project>/.env — 确保 .env 在 .gitignore 中。重连 MCP(/mcp)以激活 cloud tools。
- 所有 REST API 调用都需要 `Authorization: Bearer $SHIPLIGHT_API_TOKEN`。
- 错误处理 401 Unauthorized:token 无效或过期,让用户检查 .env 中的 SHIPLIGHT_API_TOKEN。
- 错误处理 403 Forbidden:权限不足,告知用户。
- 错误处理 404 Not Found:资源未找到,报告用户。
- 错误处理 422 Validation:向用户展示验证消息。
- 错误处理 Tool not found:token 缺失,按上述设置流程引导用户。
- MCP tools 在设置 SHIPLIGHT_API_TOKEN 后可用;优先使用 file_path 而不是直接传 content,以节省 token。
- 对 get_test_case 始终使用 output_format: yaml。
- 上传类 MCP tools:save_test_case、save_test_account、save_template、save_function。
- 下载类 MCP tools:get_test_case、get_template、get_function。
- 账号类 MCP tool:save_test_account,可创建/更新测试账号,并用可选 storage_state_path 上传本地浏览器会话到云端。
- ID 跟踪:上传后把返回的 cloud ID 加到本地文件,未来保存时更新而不是创建重复项。
- Test case 的 ID 跟踪:本地文件 *.test.yaml,顶层 YAML 字段 test_case_id: 123。
- Template 的 ID 跟踪:本地文件 templates/*.yaml,顶层 YAML 字段 template_id: 45。
- Function 的 ID 跟踪:本地文件 helpers/*.ts,每个 export 的 JSDoc tag @function_id 67。
- REST API base URL:https://api.shiplight.ai。
- Test Cases 列表:GET /v1/test-cases;查询参数 ids、folderId、folderIdRecursive、labelIds(OR 逻辑)、createdBy、orderBy(默认 id)、order(asc 或 desc,默认 desc)、limit;响应 { data: [{ id, title, test_flow, folder_id, ... }], count: number }。
- 获取 Test Case:GET /v1/test-cases/123;响应 { id, title, test_flow, folder_id }。
- 删除 Test Case(软删除):DELETE /v1/test-cases/123;将 test case 及其结果标记为删除(记录保留但查询隐藏);响应 { success: true, message: Test case deleted }。
- 批量移动 Test Cases 到文件夹:PUT /v1/test-cases/batch-update-folder;body { test_ids: number[], folder_id: number | null };folder_id 设为 null 移到根;响应含成功和更新数据。
- Test Data 列表:GET /v1/test-data;用 ids 获取特定文件,如 ?ids=1,2,3;响应数组含 organization_id、id、name、s3_path、created_at、updated_at、usage_count?。
- 获取 Test Data:GET /v1/test-data/123;响应 { organization_id, id, name, s3_path, created_at, updated_at }。
- 下载 Test Data 文件:GET /v1/test-data/123/download;从 S3 以 application/octet-stream 流式返回;用 curl -L ... -o ./filename.ext 保存。
- Test Runs 列表:GET /v1/test-runs?limit=10;查询参数 testPlanId、trigger(API、MANUAL)、result(PASSED、FAILED)、limit;响应数组含 id、status、result、trigger、start_time、end_time、duration、total_test_case_count、passed_test_case_count、failed_test_case_count。
- 获取 Test Run 详情:GET /run-results/456(注意无 /v1/ 前缀);响应含 testRun 和 testCaseResults。
- 触发 Test Run(按 test case):POST /v1/test-run/test-case/123;body { trigger: API }。
- 触发 Test Run(按 test suite):POST /v1/test-run/test-suite/1;body { trigger: API }。
- 触发 Test Run(通用,多 test cases、suites、labels):POST /v1/test-run;body { trigger: API, test_case_ids: [101, 102], test_suite_ids: [1] }。
- 触发 Test Run(按 labels,运行具有任一 label 的测试用例):POST /v1/test-run;body { trigger: API, label_ids: [22, 18] }。
- 触发 body 字段:trigger 必填,用 API;test_case_ids、test_suite_ids、label_ids 仅通用端点;label_ids 使用 OR 逻辑,可与 test_case_ids、test_suite_ids 组合;environment 为 { id?: string } 可覆盖环境;响应 201 返回 test run 对象。
- 触发后轮询:GET /v1/test-runs?limit=1 或 GET /run-results/<id> 检查状态。
- 获取 Test Case Result:GET /test-case-results/789(注意无 /v1/ 前缀);响应含 video、trace、report_s3_uri 等 S3 URI;report[0].resultJson 有逐步执行详情,每步含 description、status、message、duration 和 artifact S3 URI(screenshot_s3_path、messages_s3_path 等)。
- Environments 列表:GET /v1/environments;响应数组 { id, name, url }。
- 获取 Environment:GET /v1/environments/1;响应 { id, name, url }。
- Variables:环境作用域变量,是 playwright.config.ts 中 variables 的云端等价物;用 isSensitive: true 标记密钥(密码、API key)以便日志中掩码;列表 GET /v1/variables?environmentId=1;响应数组含 { id, name, value, environment_id, is_sensitive }。
- Test Accounts 列表:GET /v1/test-accounts?environmentId=1;environmentId 可选但推荐,按环境过滤;响应数组含 { id, name, username, environmentId, loginConfig }。
- 获取 Test Account:GET /v1/test-accounts/1;响应 { id, name, username, password, environmentId, loginConfig }。
- Forward Email Configs 列表:GET /v1/forward-email-configs;返回组织所有配置,按 created_at 降序;响应数组字段含 id、organization_id、name、forward_email、extraction_type、prompt、filter_from_email、filter_to_email、filter_subject、filter_body_contains、created_at、updated_at。
- 获取 Forward Email Config:GET /v1/forward-email-configs/1;响应字段同上。
- Forward Email Config 字段说明:forward_email 是 Mailgun 转发收件箱地址;extraction_type 如 verification_code、activation_link、custom;prompt 可选自定义提取提示;各 filter 可选过滤。
- Folders 列出全部:GET /v1/test-folders/all;可选 ?search=keyword;响应数组 { id, name, description, parentId, pathIds }。
- Folders 按 parent 列出:GET /v1/test-folders?parentId=1;省略 parentId 获取根级文件夹;响应 { id, name, description, parentId }。
- 获取 Folder:GET /v1/test-folders/1;响应 { id, name, description, parentId, pathIds }。
- 创建 Folder:POST /v1/test-folders;body { name: string, description?: string, parentId?: number | null };响应 201。
- 更新 Folder:PATCH /v1/test-folders/1;body { name?: string, description?: string }。
- 删除 Folder:DELETE /v1/test-folders/1。
- 移动 Folder:POST /v1/test-folders/1/move;body { parentId: number | null };parentId 设 null 移到根。
- Test Suites 列出全部:GET /v1/test-suites;响应数组 { id, title, description, testCount, createdAt, updatedAt }。
- 获取 Suite:GET /v1/test-suites/1?fields=id,title,status;始终用 ?fields= 只选择需要的列,否则返回完整 test case 实体,开销过大;?fields= 支持 id、title、description、status、folder_id、test_type、created_at、updated_at、url;响应含 suite 和 testCases。
- 创建 Suite:POST /v1/test-suites;body { title: string, description?: string }。
- 更新 Suite:PUT /v1/test-suites/1;body { title?: string, description?: string }。
- 删除 Suite:DELETE /v1/test-suites/1。
- 添加 Test Cases 到 Suite:POST /v1/test-suites/1/test-cases;body { testCaseIds: number[] }。
- 从 Suite 移除 Test Cases:DELETE /v1/test-suites/1/test-cases;body { testCaseIds: number[] }。
- Labels 列表:GET /v1/labels;响应 { success: true, data: [{ id, name, color, organizationId, createdAt, updatedAt }] }。
- 创建 Label:POST /v1/labels;body { name: string, color: string }。
- 更新 Label:PUT /v1/labels/22;body { name?: string, color?: string }。
- 删除 Label:DELETE /v1/labels/22。
- 给 Test Case 添加 Labels:POST /v1/labels/test-case/123/add;body { labelIds: number[] }。
- 从 Test Case 移除 Labels:POST /v1/labels/test-case/123/remove;body { labelIds: number[] }。
- 获取 Test Case 的 Labels:GET /v1/labels/test-case/123;响应 { success: true, data: [{ id, name, color }] }。
- 按 Label 获取 Test Case IDs:GET /v1/labels/test-cases/22;响应 { success: true, data: [101, 102, 103] }。
- Templates(可复用步骤):可通过 YAML 中 template: 或云端 reference_id 引用;API 使用旧名 reusable-steps;获取 GET /v1/reusable-steps/138;响应 { id, name, description, statements }。
- Test Functions:可从 test cases 通过 YAML 中 call: file#export 调用;获取 GET /v1/functions/42;响应 { id, name, description, code, status }。
- Artifacts:下载测试产物(视频、trace、报告):GET /v1/s3/file?uri=s3://bucket/path/video.webm;uri 必填,来自 test result 的 video、trace、report_s3_uri;响应原始文件内容;二进制文件用 curl -o <output_file> 保存。
- 工作流:同步本地项目到云端:先同步 test accounts,调用 save_test_account 带 credentials 和 storage_state_path(如果本地项目使用 storageState 认证)。
- 同步 test cases:查找所有 .test.yaml 文件,对每个调用 save_test_case 并传 file_path;如果文件已有 test_case_id 则更新,否则创建并返回 ID。
- 跟踪 ID:如果 YAML 中还没有,把返回的 test_case_id 添加到 YAML。
- 同步 templates 和 functions:用 save_template 和 save_function 重复。
- 工作流:从云端下载 test case:调用 get_test_case,传 test_case_id 和 output_format: yaml。
- 转换云端 url: 为 baseURL + 相对路径:云端 test case 有顶层 url: 字段表示起始 URL(如 url: https://app.example.com/dashboard);本地 YAML 测试拆成两部分:Base URL 在 playwright.config.ts 项目级 use: { baseURL: https://app.example.com } 设置(若所有测试同源),或按测试通过 base_url: https://app.example.com;推荐项目级。Navigation 在测试步骤用相对路径(URL: /dashboard)。
- 从下载的 YAML 移除顶层 url: 字段,确保 baseURL 已配置,并将任何绝对 URL 语句转换为相对路径。
- 将返回的 YAML 保存为 .test.yaml 文件。
- 工作流:下载测试产物:GET /test-case-results/<id> 找到 video、trace 或 report_s3_uri 字段(S3 URI)。
- GET /v1/s3/file?uri=<S3_URI> 下载 artifact 内容。
适用边界 · 注意事项
- 没有 Shiplight cloud 订阅或未设置 SHIPLIGHT_API_TOKEN 时无法使用。
- 不需要云端调度、团队共享或 CI 集成时,没必要引入云端同步。
- 无法使用 MCP 工具或 REST API(如网络或权限受限)时不适用。