---
title: "理解 Output Relay"
language: "zh"
url: "https://docs.testany.io/zh/docs/understanding-output-relay/"
markdown_url: "https://docs.testany.io/zh/docs/understanding-output-relay.md"
translation: "https://docs.testany.io/en/docs/understanding-output-relay.md"
last_updated: "2026-03-26T15:39:24+08:00"
---

# 理解 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 Relay 简单流程](https://docs.testany.io/docs/images/zh/output-relay-simple-flow.svg)

每个测试保持独立，但数据通过流水线流动。

## 核心概念

### Output Case vs Input Case

| 概念 | 描述 | 示例 |
|------|------|------|
| **Output Case** | 为其他测试生成数据的测试用例 | 生成访问令牌的登录测试 |
| **Input Case** | 消费其他测试数据的测试用例 | 使用令牌发起请求的 API 测试 |


> **说明**
>
> 一个测试用例可以同时是 Output Case 和 Input Case。例如，测试 B 可能从测试 A 接收 token，然后将 user ID 传递给测试 C。


### Relay 变量

Relay 变量是一个命名变量，它：
1. 在 Testany 平台的 Output Case 环境变量中声明
2. 在 Output Case 的代码运行时被赋值
3. 作为环境变量被 Input Case 消费

### 流水线中的数据流向

以下是典型的 Output Relay 流水线中数据的流动方式：

![Output Relay 流水线数据流](https://docs.testany.io/docs/images/zh/output-relay-pipeline-flow.svg)

在这个示例中：
- **Case A** 输出 `ACCESS_TOKEN`
- **Case B** 输入 `ACCESS_TOKEN`，输出 `USER_ID`
- **Case C** 同时输入 `ACCESS_TOKEN`（来自 A）和 `USER_ID`（来自 B）

## 端到端配置概览

配置 Output Relay 涉及跨两个系统的**三个步骤**：

![Output Relay 配置概览](https://docs.testany.io/docs/images/zh/output-relay-setup-overview.svg)

### 步骤 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` 连接用例：

```yaml
kind: 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](https://docs.testany.io/zh/docs/managing-test-case-with-relay-case.md) |
| 在 pipeline YAML 中配置 relay | [Build your tests more robust & flexible with Output Relay](https://docs.testany.io/zh/docs/build-your-tests-more-robust-flexible-with-output-.md) |
| 学习 pipeline YAML 语法 | [Pipeline YAML Schema Reference](https://docs.testany.io/zh/docs/pipeline-yaml-schema-reference.md) |

## 快速参考

| 术语 | 定义 |
|------|------|
| 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 服务。平台会根据你的流水线配置处理路由。

## 本页术语

- [输出中继 (Output Relay)](https://docs.testany.io/zh/docs/glossary.md#output-relay)
- [测试流水线 (Test Pipeline)](https://docs.testany.io/zh/docs/glossary.md#test-pipeline)
- [测试用例 (Test Case)](https://docs.testany.io/zh/docs/glossary.md#test-case)
- [环境 (Environment)](https://docs.testany.io/zh/docs/glossary.md#environment)
- [运行时 (Runtime)](https://docs.testany.io/zh/docs/glossary.md#runtime)
- [执行 (Execution)](https://docs.testany.io/zh/docs/glossary.md#execution)
- [测试脚本 (Test Script)](https://docs.testany.io/zh/docs/glossary.md#test-script)
