testany-case-writing · git:20260307.1307472 · 2026-03-07 · sha256 77c39ff096c31e60
testany-case-writing git:20260307.1307472A
Immutable. This exact content is served forever at /api/v1/blob/77c39ff096c31e60.
---
name: testany-case-writing
description: 测试用例和脚本编写助手 - 根据需求生成测试用例文档和 Testany-compatible 测试脚本
argument-hint: "[需求描述],如:根据 PRD 生成登录测试、写一个 API 测试脚本"
---
# 测试用例和脚本编写助手
根据用户需求生成测试用例文档和 Testany-compatible 测试脚本。
用户输入: $ARGUMENTS
## 宿主能力适配
- 如果宿主支持 slash command,可把 `testany-case` 作为推荐上传入口。
- 如果宿主不支持 slash command,则直接在当前线程切换到 `testany-case` workflow,继续上传脚本或配置 metadata。
## 职责
- 根据用户需求生成测试用例文档
- 根据测试用例生成 Testany-compatible 测试脚本
- 帮助用户选择合适的 Executor
- 创建可直接上传到 Testany 的 ZIP 包
## 工作流程
### Phase 1: 需求收集
询问用户:
1. **测试目标**:API 测试 / UI 测试 / 性能测试?
2. **技术栈偏好**:Python / JavaScript / Java?
3. **环境变量**:需要哪些配置?
4. **Relay 需求**:是否需要传递数据给下游用例?
### Phase 2: 生成测试用例文档
包含:
- 测试场景描述
- 前置条件
- 测试步骤
- 预期结果
### Phase 3: 生成测试脚本
根据选择的 Executor 生成代码:
1. 创建符合 ZIP 结构要求的文件
2. 参考对应 Executor 模板生成代码
3. 打包为 ZIP
### Phase 4: 交付
询问用户是否要上传到 Testany:
- **是** → 切换到 `testany-case` workflow 上传;如宿主支持 slash command,也可建议 `/testany-case`
- **否** → 仅保留本地文件
---
## Executor 选择决策树
```
用户需求
├─ API 测试
│ ├─ 熟悉 Python → PyRes ✓
│ └─ 不想写代码 → Postman
├─ UI/E2E 测试 → Playwright
└─ Java 项目 → Maven 或 Gradle
```
根据选择的 Executor,参考对应模板:
| Executor | 模板文件 | 适用场景 |
|----------|---------|---------|
| PyRes | [pyres.md](./references/executors/pyres.md) | Python API 测试(推荐) |
| Postman | [postman.md](./references/executors/postman.md) | 无代码 API 测试 |
| Playwright | [playwright.md](./references/executors/playwright.md) | UI/E2E 测试 |
| Maven/Gradle | [maven.md](./references/executors/maven.md) | Java 项目测试 |
> 注意:`executor` 是后端严格字符串。本 skill 涉及的取值为:`pyres`, `postman`, `playwright`, `maven`, `gradle`(平台还支持 `python`, `jmeter`)。
>
> Playwright 可能还需要配置 Config Path(对应字段 `case_meta.trigger_method.playwright_config_path`);具体填写规则以文档为准。
---
## 环境变量类型(case_meta.environment_variables.type)
| 类型 | 用途 | 示例 |
|------|------|------|
| `env` | 输入/普通配置(包括 relay 输入) | `API_BASE_URL`, `AUTH_TOKEN` |
| `output` | Relay 输出 | `ACCESS_TOKEN`, `USER_ID` |
> 约束(与平台校验一致):
> - `type` 仅支持 `env` 与 `output`(不支持 `secret`)。
> - `name` 必须以大写字母开头,只能包含大写字母、数字、下划线;同一 case 内必须唯一。
> - `name`/`value` 不能为空或仅空白字符;如需表达“空值”,请显式填 `-`。
> - 敏感凭证请使用 Secure key reference 绑定,并在代码中通过 `TESTANY_SECRETS_SERVICE` 获取。
---
## Output Relay 完整指南
Output Relay 用于在 Pipeline 中将一个 case 的输出传递给下游 case。**必须同时完成配置和代码两部分**,否则 relay 不会生效。
### 端到端流程
```
┌─────────────────────────────────────────────────────────────────┐
│ 1. Output Case 配置 │
│ environment_variables: │
│ - name: ACCESS_TOKEN ←── 变量名 │
│ type: output ←── 必须是 output │
│ value: "-" │
├─────────────────────────────────────────────────────────────────┤
│ 2. Output Case 代码 │
│ relay_service = os.environ.get("TESTANY_OUTPUT_RELAY_SERVICE") │
│ requests.post(relay_service, json={ │
│ "ACCESS_TOKEN": token ←── key 必须与配置的变量名一致 │
│ }) │
├─────────────────────────────────────────────────────────────────┤
│ 3. Pipeline YAML │
│ - run: E5F6A7B8 │
│ relay: │
│ - key: AUTH_TOKEN ←── Input Case 中的变量名 │
│ refKey: A1B2C3D4/ACCESS_TOKEN ←── Output Case 的输出 │
├─────────────────────────────────────────────────────────────────┤
│ 4. Input Case 配置 │
│ environment_variables: │
│ - name: AUTH_TOKEN ←── 与 relay.key 一致 │
│ type: env ←── 必须是 env │
│ value: "-" │
├─────────────────────────────────────────────────────────────────┤
│ 5. Input Case 代码 │
│ token = os.getenv("AUTH_TOKEN") ←── 直接读取环境变量 │
└─────────────────────────────────────────────────────────────────┘
```
### 关键约束
| 约束 | 说明 |
|------|------|
| **变量名必须一致** | 代码中 POST 的 key 必须与 case 配置的 `environment_variables.name` 完全一致 |
| **type 必须正确** | Output Case 用 `type: output`,Input Case 用 `type: env` |
| **只有 passed 才 relay** | 如果 Output Case 失败,relay 数据不可用 |
| **必须预先声明** | Output 变量必须在 case 配置中声明,否则 relay 不生效 |
### 常见错误
```python
# ❌ 错误:代码中的 key 与配置不一致
# 配置:name: ACCESS_TOKEN
# 代码:
relay_output({"TOKEN": token}) # 应该是 ACCESS_TOKEN
# ✅ 正确:
relay_output({"ACCESS_TOKEN": token})
```
```python
# ❌ 错误:只写了代码,没有在 case 配置中声明 output 变量
relay_service = os.environ.get("TESTANY_OUTPUT_RELAY_SERVICE")
requests.post(relay_service, json={"ACCESS_TOKEN": token})
# 但 case 的 environment_variables 里没有 type=output 的 ACCESS_TOKEN
# ✅ 正确:必须同时配置
# case 配置:
# environment_variables:
# - name: ACCESS_TOKEN
# type: output
# value: "-"
# 代码:
relay_service = os.environ.get("TESTANY_OUTPUT_RELAY_SERVICE")
requests.post(relay_service, json={"ACCESS_TOKEN": token})
```
### 检查清单
编写带 Relay 的 case 时,确认以下内容:
- [ ] Output Case 的 `environment_variables` 中声明了 `type: output` 的变量
- [ ] 代码中 POST 的 key 与配置的变量名**完全一致**
- [ ] Input Case 的 `environment_variables` 中声明了 `type: env` 的变量
- [ ] Pipeline YAML 中的 `run`/`whenPassed`/`whenFailed` 使用 Test Case Key(8 位大写十六进制,如 `AC2F5A50`)
- [ ] Pipeline YAML 中的 `relay.refKey` 格式正确:`<SOURCE-CASE-KEY>/<VARIABLE-NAME>`
---
## 完成后
脚本编写完成后,告知用户:
1. 已生成的文件列表
2. ZIP 包位置
3. 可切换到 `testany-case` workflow 上传到 Testany;如宿主支持 slash command,也可建议 `/testany-case`
---
## 参考文档
### 本地 References
**Executor 模板**
- [PyRes (Python)](./references/executors/pyres.md) - 推荐
- [Postman](./references/executors/postman.md)
- [Playwright](./references/executors/playwright.md)
- [Maven/Gradle](./references/executors/maven.md)
**设计规范**
- [测试设计原则](./references/test-design.md) - Test Case vs Assertion、如何从 PRD 设计测试
- [Case 元数据规范](./references/case-metadata-spec.md) - **必读**:name/labels/description/env_vars 的填写标准
### 文档(兜底)
如果本地 references 不足以解决问题,请查阅 Testany 文档中心;当本 skill 的示例与文档不一致时,以文档为准:
**综合指南**
- [How to Build a Testany-Compatible Test Case](https://docs.testany.io/en/docs/how-to-build-a-testany-compatible-test-case/)
**凭证与安全**
- [How to Protect Credentials](https://docs.testany.io/en/docs/how-to-protect-the-credentials-used-in-testing/) - TSS 使用指南
**Output Relay**
- [Understanding Output Relay](https://docs.testany.io/en/docs/understanding-output-relay/)
- [Managing Test Case with Relay Case](https://docs.testany.io/en/docs/managing-test-case-with-relay-case/)