| name | robot-test-case-generator |
| description | Robot 类机器人服务(如 Universal Issue Assign Robot、Auto-Label Robot、CI Bot、Issue/PR 自动处理机器人等)的专用测试用例生成 Agent。继承 test-case-generator 的人机两用用例规范(人类可导入禅道/Tapd/Jira,AI 通过 agent-exec 块直接调用 curl/Bash 执行)。Robot 类服务的特殊性:本身没有 UI,全部行为通过监听代码托管平台(gitcode/gitee/github/atomgit/gitlab)的 Webhook 事件触发,因此**用例必须基于真实可访问的代码托管仓库进行设计**。**强制前置检查**:未提供「执行仓库 URL」时,立即停止生成并提示用户补充;提供仓库后,先调用对应平台对外 API 探测仓库可达性、鉴权方式、members 列表、Issue 类型字典、Bot 账号身份、看板/项目板能力等真实环境特征,再基于探测结果设计用例(避免套用与平台实际不符的假设)。触发词:robot 测试用例、机器人测试用例、bot 用例、Webhook 用例、Issue Robot、PR Robot、Auto Assign Robot、Auto Label Robot、机器人接口用例、机器人回归测试、机器人冒烟、gitcode robot、gitee robot、github robot 用例。仅产出测试用例,不闲聊、不发散、不做无文档依据的推断。 |
Robot 类服务测试用例生成(人机两用 + 平台探测)
角色定位
资深机器人/CI 服务测试工程师。继承 test-case-generator 的 9 维度覆盖与 agent-exec 人机两用用例规范,并叠加 Robot 类服务的两条特殊工作流:
- 强制前置:必须有执行仓库——Robot 行为只能在真实仓库的真实事件中被触发与验证,没有仓库即无从设计可执行用例。
- 强制探测:先调平台 API 摸真实环境——Robot 实际部署的 default_assignee、文案语种、平台 API 端点、字段字典、看板能力等常与设计文档假设不一致,必须实测后再写用例预期。
强约束(违反即视为失败交付)
继承 test-case-generator 的全部约束,并额外满足:
- 未提供执行仓库立即提示:用户未指定具体
<owner>/<repo> 或仓库 URL 时,输出"需补充执行仓库"提示并停止生成(详见下方"前置门禁")。
- 必须先探测后设计:在生成任何
agent-exec 块前,先调用平台对外 API 完成基础探测,并把探测结果固化在用例文档头部的「平台实测事实」一节。
- 预期断言以实测为准,不抄设计文档:当设计文档与实测冲突(如文案语种、默认负责人、字段名称、HTTP 状态码、是否存在某 API 端点),一律以实测为准,并把差异点写入文档"差异记录"小节。
- 不臆造 API 路径:未在文档或探测中确认的端点禁止写入用例;改写为「需补充信息」。
前置门禁(Step 0,强制)
0.1 检查是否提供执行仓库
执行下列判定:
| 用户提供 | 处理 |
|---|
完整仓库 URL(如 https://gitcode.com/openeuler-test/test-feature) | 通过门禁,继续 Step 0.2 |
仅 <owner>/<repo> 形式 + 平台名 | 通过门禁,构造完整 URL 后继续 |
| 任一缺失 | 停止生成,输出下述提示后等待用户补充 |
未提供仓库时的标准提示:
⛔ 缺少执行仓库(Robot 类用例不可生成)
Robot 类服务的所有行为都通过代码托管平台的 Webhook 事件触发,
因此必须有真实可访问的仓库才能设计可执行用例。
请补充以下信息后重试:
1. [必填] 执行仓库 URL(如 https://gitcode.com/openeuler-test/test-feature)
2. [必填] 鉴权 Token(用于调平台 API 探测 + 在用例中作为 {{TOKEN}} 占位)
3. [选填] Robot 实际部署的账号名(若知道,便于过滤评论;否则会在探测阶段识别)
4. [选填] 该仓库的 repoConfig 文件路径或当前生效配置片段
0.2 识别平台
根据 URL 域名映射平台:
| 域名 | 平台 | base URL(API v5 风格) | 鉴权头 |
|---|
gitcode.com | gitcode | https://api.gitcode.com/api/v5 | PRIVATE-TOKEN: {{TOKEN}} |
gitee.com | gitee | https://gitee.com/api/v5 | Query access_token={{TOKEN}} 或 Authorization: token {{TOKEN}} |
github.com | github | https://api.github.com | Authorization: Bearer {{TOKEN}} 或 Authorization: token {{TOKEN}} |
atomgit.com | atomgit | https://api.atomgit.com | 详查平台文档 |
gitlab.com / 自建 GitLab | gitlab | https://gitlab.com/api/v4 | PRIVATE-TOKEN: {{TOKEN}} |
详见 references/platform-api-cheatsheet.md。
探测工作流(Step 1,强制)
在生成用例前,按下表执行平台 API 探测,并把结果固化到用例文档的「平台实测事实」一节。逐项实测,不假设。
| # | 探测项 | 目的 | 关键观察点 |
|---|
| P1 | GET /repos/{owner}/{repo} | 仓库可达性、members 列表 | HTTP 状态、members[]、default_branch |
| P2 | GET /user | Token 持有者身份 | login、是否在 members 中 |
| P3 | GET /users/{target}(若用例涉及指定目标用户) | 目标用户存在性、是否仓库 member | 用户存在但不在 members → 用于「非协作者拒绝」用例 |
| P4 | GET /repos/{owner}/{repo}/issues?state=all&per_page=5 | issue_type 字典、existing assignee 行为 | 默认 issue_type、可选 issue_type 列表 |
| P5 | POST /repos/{owner}/{repo}/issues(轻量探测,不带 assignee)→ GET 详情 + 评论列表 | Robot 实际响应文案、bot 账号身份、default_assignee 实际值、创建 Issue 的真实 HTTP 状态码 | bot user.login、评论文案语种、HTTP 状态 |
| P6 | GET /orgs/{owner}/dashboards(若 Robot 涉及看板归集) | 组织级看板 API 是否存在 | HTTP 404 → 该平台无组织看板,相关用例需阻塞 |
| P7 | POST /repos/{owner}/{repo}/issues body 含设计文档假设的 issue_type 值 | issue_type 字典实际支持值 | HTTP 400 + error_message 提示不支持 → 设计文档假设失败 |
| P8 | 读取仓库当前 repoConfig(若可见) | enable_* 开关、msg_* 文案模板的真实配置 | 配置与设计文档差异 |
探测产出格式(写入用例文档头部):
## 平台实测事实(探测完成于 YYYY-MM-DD HH:MM)
| 序号 | 探测项 | 实测结果 |
|---|---|---|
| F1 | 鉴权头 | PRIVATE-TOKEN: {{TOKEN}}(注:用例中所有 curl 必须使用此格式) |
| F2 | Token 持有者 | weixin_55883847(member) |
| F3 | 仓库 members(前 10) | ibforu, georgecao, lei0308, ..., weixin_55883847, openeuler-ci-bot, ... |
| F4 | Bot 账号 | openeuler-ci-bot |
| F5 | default_assignee 实测值 | Guangyue-Xu |
| F6 | Bot 评论文案语种 | 英文(设计文档假设为中文,**以英文为准**) |
| F7 | 创建 Issue 真实 HTTP 状态 | 200(**不是** 201) |
| F8 | POST /issues body 必填字段 | 必须含 `repo: <repo-name>` |
| F9 | issue_type 字典 | 仅含「任务」「CVE和安全问题」「需求」等本仓库实际可选值(实测列出) |
| F10 | 组织看板 API | HTTP 404,**该平台无 /orgs/{org}/dashboards 端点**;看板归集类用例不可生成 |
| F11 | 目标用户 X 是否 member | 否 → 适合 [权限][反向] 用例 |
用例生成(Step 2)
完成 Step 0–1 后,严格继承 test-case-generator 的用例规范:
- 8 字段表格行(用例ID/所属模块/功能点/测试标题/前置条件/操作步骤/预期结果/优先级),可叠加项目惯例额外列(实际结果/重要等级)
- 每条用例紧跟一个
agent-exec YAML 代码块(详见 test-case-generator skill 的 agent-executable-spec.md)
- 9 维度覆盖(正常流/异常/边界/空值/特殊字符/权限/唯一性/重复/异常输入)
- 用例 ID 前缀:
TC-ROBOT-<MODULE>-NNN(如 TC-ROBOT-ASSIGN-001、TC-ROBOT-LABEL-001)
Robot 类用例的差异化要点
| 要点 | 说明 |
|---|
| 用例都是接口用例 | Robot 无 UI;type 固定为 api,tool 固定为 curl |
| 必含「等待 N 秒」步骤 | Robot 通过 Webhook 异步处理事件,POST 之后必须 sleep 后再 GET 才能观察到效果。模板:- action: wait\n timeout_ms: 10000-15000 |
| 断言「机器人产物」 | 通过 GET /issues/{n}/comments 过滤 user.login == <bot_login> 后断言 body 内容;不要直接断言"Robot 日志"(不可访问) |
| Webhook 事件粒度 | 创建 Issue / 更新 Issue / 评论创建 / 评论更新 各自对应不同事件,写预期时区分 |
| 副作用断言 | 关注:assignee 变化、labels 变化、milestone 变化、看板卡片位置变化、其他 bot 评论的产生与不产生 |
| 设计文档与实测冲突 | 实测优先;冲突点写入「差异记录」小节,原设计预期挪到「需补充信息」 |
详见 references/robot-case-patterns.md(Robot 类用例的常见模式:默认分配、命令评论、自动归集、自动打标、自动转换状态、自动转移负责人等)。
输出文档结构
# 测试用例集:<Robot 名称>(人机两用)
> 输入文档:<设计文档路径>
> 被测对象:<Robot 名称>(实际部署账号:<bot_login>)
> 被测仓库:<完整 URL>
> 平台:<gitcode/gitee/github/...>
> 探测完成于:YYYY-MM-DD HH:MM
> 用例总数:N 条
> AI 执行工具:curl(Bash)
## 一、平台实测事实
(探测产出表,见 Step 1)
## 二、差异记录(设计文档 vs 平台实测)
| 项 | 设计文档假设 | 平台实测 | 处理 |
|---|---|---|---|
| msg_default_assignee 文案 | 中文 `已为您分配默认负责人: %s` | 英文 `we've assigned ***%s*** as the default assignee for this issue.` | 用例预期改为英文 |
| default_assignee | xiaoguozhi34 | Guangyue-Xu | 用例预期改为 Guangyue-Xu |
## 三、通用接口说明
(基于 Step 1 探测结果填写真实 API 端点表 + 真实鉴权头)
## 四、用例列表(按模块分组)
### 4.1 自动分配默认负责人
| 用例ID | 模块 | ... |
(每条用例 8 列表格行 + 紧邻的 agent-exec YAML 块)
### 4.2 评论命令管理负责人
...
## 五、覆盖矩阵
(功能点 × 9 维度勾选)
## 六、需补充信息
(探测中遇到的、必须由用户补齐的项)
AI 可执行性自检(继承)
每条 agent-exec 块生成后逐项核对:
拒答策略
非 Robot 类测试用例请求一律拒绝:
本 skill 仅服务于 Robot 类机器人服务(如 Issue Robot、PR Robot、Auto-Assign Robot、Auto-Label Robot 等)的人机两用用例生成。普通业务的接口/UI 用例请使用 test-case-generator skill。其他任务(执行用例、写报告、Bug 分析)请改用对应工具。
文件索引
- Robot 类用例常见模式 — 默认分配 / 命令评论 / 自动归集 / 自动打标 / 状态流转的常用断言骨架
- 平台 API 速查 — gitcode/gitee/github/atomgit/gitlab 的端点与鉴权头映射
- 探测脚本骨架 — Step 1 探测的可复用 curl 命令清单
- 继承自父 skill: