理解 Output Relay
什么是 Output Relay?
Output Relay 是一种机制,允许同一个测试流水线中的一个测试用例将数据传递给另一个测试用例。可以把它理解为测试之间的"数据交接"。
简单类比:想象一场接力赛,运动员之间传递接力棒。在 Output Relay 中:
- 接力棒是一个变量(如 token、ID 或 URL)
- 第一棒选手(Output Case)生成并传递数据
- 下一棒选手(Input Case)接收并使用该数据
Output Relay 在保持测试独立性的同时实现了数据依赖。每个测试用例保持原子性和自包含,但在流水线编排时可以共享输出。
为什么需要 Output Relay?
问题:硬编码的依赖关系
没有 Output Relay 时,你可能会这样写测试:
Python# 测试 A:登录并获取 token def test_login(): token = api.login("user", "pass") # Token 在测试结束后就丢失了! # 测试 B:获取用户资料(失败 - 没有 token!) def test_get_profile(): token = "???" # 这个从哪来? api.get_profile(token)
常见的变通方法(都有问题):
- 硬编码 token → token 过期就失效
- 合并成一个巨大的测试 → 难以维护,调试缓慢
- 使用全局变量 → 测试之间产生耦合,变得脆弱
解决方案:Output Relay
使用 Output Relay,测试 A 可以将 token 传递给测试 B:
每个测试保持独立,但数据通过流水线流动。
核心概念
Output Case vs Input Case
| 概念 | 描述 | 示例 |
|---|---|---|
| Output Case | 为其他测试生成数据的测试用例 | 生成访问令牌的登录测试 |
| Input Case | 消费其他测试数据的测试用例 | 使用令牌发起请求的 API 测试 |
一个测试用例可以同时是 Output Case 和 Input Case。例如,测试 B 可能从测试 A 接收 token,然后将 user ID 传递给测试 C。
Relay 变量
Relay 变量是一个命名变量,它:
流水线中的数据流向
以下是典型的 Output Relay 流水线中数据的流动方式:
在这个示例中:
- Case A 输出
ACCESS_TOKEN - Case B 输入
ACCESS_TOKEN,输出USER_ID - Case C 同时输入
ACCESS_TOKEN(来自 A)和USER_ID(来自 B)
端到端配置概览
配置 Output Relay 涉及跨两个系统的三个步骤:
步骤 1:编写代码输出数据
在 Output Case 中,使用 TESTANY_OUTPUT_RELAY_SERVICE 环境变量来 POST 数据:
Python# Python 示例 import os import requests relay_service = os.environ.get('TESTANY_OUTPUT_RELAY_SERVICE') requests.post(relay_service, json={ 'ACCESS_TOKEN': 'eyJhbGciOiJIUzI1NiIs...' })
步骤 2:在平台上标记变量为 Relay
在测试用例详情页面,添加环境变量并点击 relay 图标 将其标记为 relay 变量。
步骤 3:配置 Pipeline YAML
在流水线定义中,使用 relay 连接用例:
YAMLkind: rule/v1.3 spec: rules: - run: A1B2C3D4 # 登录用例 - run: E5F6A7B8 # 获取资料用例 relay: - key: ACCESS_TOKEN refKey: A1B2C3D4/ACCESS_TOKEN # 引用登录用例的输出
对于所有新建 Pipeline,推荐使用 rule/v1.3。rule/v1.2 仍可继续运行,但不具备 case 级并行执行能力。
约束和限制
Relay 仅对通过的用例有效
你只能从通过的测试用例获取 relay 数据。如果 Output Case 失败、中止或超时,其 relay 数据不可用。
在 rule/v1.3 中,这个约束还意味着:消费 relay 的测试脚本不能与提供 relay 的测试脚本处于可能同时启动的关系里。平台会要求提供 relay 的测试脚本先完成,再启动消费 relay 的测试脚本。
这意味着你不能这样配置:
YAML# 无效 - relay 与 whenFailed 组合 - run: E5F6A7B8 # Input case whenFailed: A1B2C3D4 # Output case 失败了,没有可靠数据 relay: - key: TOKEN refKey: A1B2C3D4/TOKEN
不允许循环依赖
平台会自动检测并拒绝循环的 relay 配置:
YAML# 无效 - 循环依赖 - run: A1B2C3D4 # Case A relay: - key: X refKey: E5F6A7B8/Y - run: E5F6A7B8 # Case B relay: - key: Y refKey: A1B2C3D4/X # 错误:循环依赖
不支持性能测试
Output Relay 仅适用于功能测试,不支持性能/负载测试场景。
下一步
现在你已经理解了概念,请继续阅读实现指南:
| 如果你想... | 阅读这篇文档 |
|---|---|
| 在测试脚本中编写 relay 代码 | Managing Test Case with Relay Case |
| 在 pipeline YAML 中配置 relay | Build your tests more robust & flexible with Output Relay |
| 学习 pipeline YAML 语法 | Pipeline YAML Schema Reference |
快速参考
| 术语 | 定义 |
|---|---|
| Output Relay | 在流水线中传递测试用例之间数据的功能 |
| Output Case | 生成 relay 数据的测试用例 |
| Input Case | 消费 relay 数据的测试用例 |
| Relay Variable | 从 Output Case 传递到 Input Case 的命名变量 |
TESTANY_OUTPUT_RELAY_SERVICE | 包含 relay 服务 URL 的环境变量 |
relay.refKey | Pipeline YAML 中引用另一个用例输出的字段 |
还是很困惑? 关键要点是 Output Relay 将数据生成(在代码中)与数据路由(在 pipeline YAML 中)分离。你的测试代码只需要将数据 POST 到 relay 服务。平台会根据你的流水线配置处理路由。
还有疑问?
我们的团队随时为您服务。欢迎联系我们,我们会尽快回复。