理解 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 简单流程

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

核心概念

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 流水线数据流

在这个示例中:

  • Case A 输出 ACCESS_TOKEN
  • Case B 输入 ACCESS_TOKEN,输出 USER_ID
  • Case C 同时输入 ACCESS_TOKEN(来自 A)和 USER_ID(来自 B)

端到端配置概览

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

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 连接用例:

YAML
kind: rule/v1.3
spec:
  rules:
    - run: A1B2C3D4  # 登录用例
    - run: E5F6A7B8  # 获取资料用例
      relay:
        - key: ACCESS_TOKEN
          refKey: A1B2C3D4/ACCESS_TOKEN  # 引用登录用例的输出
📝

对于所有新建 Pipeline,推荐使用 rule/v1.3rule/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 中配置 relayBuild 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.refKeyPipeline YAML 中引用另一个用例输出的字段

还是很困惑? 关键要点是 Output Relay 将数据生成(在代码中)与数据路由(在 pipeline YAML 中)分离。你的测试代码只需要将数据 POST 到 relay 服务。平台会根据你的流水线配置处理路由。

还有疑问?

我们的团队随时为您服务。欢迎联系我们,我们会尽快回复。