---
title: "通过Pipeline Assembler组装测试流水线（测试管道）"
language: "zh"
url: "https://docs.testany.io/zh/docs/how-to-assemble-test-pipeline-via-pipeline-assembl/"
markdown_url: "https://docs.testany.io/zh/docs/how-to-assemble-test-pipeline-via-pipeline-assembl.md"
translation: "https://docs.testany.io/en/docs/how-to-assemble-test-pipeline-via-pipeline-assembl.md"
last_updated: "2026-05-07T09:52:54+08:00"
---

# 通过Pipeline Assembler组装测试流水线（测试管道）

Pipeline Assembler 是 Testany 的可视化流水线编排器。你可以在画布上添加 case、连接执行依赖、配置 `whenPassed` / `whenFailed`、标记 `expect: fail`，也可以切换到 YAML View 直接编辑底层 Pipeline YAML。


> **备注**
>
> 对于所有新建 Pipeline，推荐使用 `kind: rule/v1.3`。`rule/v1.3` 支持 case 级并行调度；`rule/v1.2` 仅用于兼容历史 Pipeline，不支持 case 级并行执行。


## 开始之前

请先确认以下准备工作已经完成：

1. 要编入 Pipeline 的 case 已经注册到 Testany 的 Test Case Library。
2. 你已经知道这些 case 的执行关系：哪些可以先跑，哪些必须等待上游 case 通过或失败后再跑。
3. 如果要配置 relay，上游 case 已声明 Relay-Out 输出变量，下游 case 已声明对应的 Relay-In 输入环境变量。

## 打开 Pipeline Assembler

### 新建 Pipeline

1. 在顶部选择目标 Workspace。
2. 进入左侧导航的 Pipelines 页面。
3. 点击右上角的 Assemble pipeline。
4. 填写 Name 和可选 Description，然后点击 Submit。
5. 系统会创建 Pipeline 并进入 Pipeline 详情页。
6. 在 Flow Diagram 区域点击 Open Pipeline Assembler 图标，进入可编辑的 Pipeline Assembler。

下图展示的是 Pipeline 详情页中的 Flow Diagram 区域。红框标出 Open Pipeline Assembler 图标。图里的 case key 只是示例；实际编排时请使用你自己 Workspace 中的 case。

![Pipeline 详情页中的 Flow Diagram 和 Open Pipeline Assembler 图标](https://docs.testany.io/docs/images/zh/pipeline-assembler-flow-diagram.png)

### 编辑已有 Pipeline

1. 在 Pipelines 列表中打开目标 Pipeline。
2. 在详情页的 Flow Diagram 区域查看当前编排图。
3. 点击 Flow Diagram 右上角的 Open Pipeline Assembler 图标。


> **说明**
>
> Pipeline 详情页默认展示只读 Flow Diagram。只有进入 Pipeline Assembler 后，才能修改 case、依赖、relay 或 YAML。


## 认识编辑界面

Pipeline Assembler 由下图编号标出的区域和控件组成：

1. Test Case Library：搜索 case，并将 case 添加到当前 Pipeline。
2. Canvas View 区域：通过节点和连线可视化编辑执行依赖。
3. Properties Panel：查看或编辑当前选中的节点、边、Expect Fail、Relay-In 和 Relay-Out。
4. Canvas View 按钮：回到可视化画布。
5. YAML View 按钮：直接编辑 YAML。
6. Reset Layout 按钮：重新整理画布布局。
7. Legend 按钮：查看节点和边的含义。
8. Save 按钮：校验并保存当前 Pipeline 定义。

![Pipeline Assembler 画布总览，包含 Test Case Library、Canvas 和 Properties Panel](https://docs.testany.io/docs/images/zh/pipeline-assembler-canvas-overview.png)

## 在 Canvas View 编排 Pipeline

### 添加 case

在左侧 Test Case Library 中搜索 case name 或 case key，然后点击 Add to Pipeline。被添加的 case 会成为画布上的一个节点。

下图中，`1` 标出搜索框，`2` 标出 Add to Pipeline 按钮：

![在 Test Case Library 中搜索 case 并准备添加到 Pipeline](https://docs.testany.io/docs/images/zh/pipeline-assembler-case-search-add.png)

如果某个 case 已经在当前 Pipeline 中，添加操作会变成禁用状态，不能重复添加。同一个 Pipeline 中每个 `run` case key 必须唯一。

添加成功或 case 已存在时，添加按钮会变成禁用状态，避免重复编入同一个 Pipeline。红框标出这个禁用状态：

![case 添加后添加按钮变为禁用状态](https://docs.testany.io/docs/images/zh/pipeline-assembler-case-after-add.png)

### 创建执行依赖

在画布中，从上游 case 节点右侧连接点拖出连接线，连到下游 case 节点左侧连接点。新建连线默认表示 `whenPassed`，也就是上游 case 向 Pipeline 报告 Passed 后，下游 case 才会被调度。

选择一条边后，可以在右侧 Properties Panel 中查看：

1. Edge Type
2. Source
3. Target

下面的右侧面板展示了一条已选中的 `whenPassed` 边：它从 `093710E4` 指向 `E18ADBB0`。红框标出 Switch to WhenFailed 按钮。

![选中 whenPassed 边后的 Edge Properties 面板](https://docs.testany.io/docs/images/zh/pipeline-assembler-edge-whenpassed.png)

如果需要把条件从 `whenPassed` 改为 `whenFailed`，点击 Switch to 按钮切换边类型。

切换后的边会在 Edge Type 中显示 WhenFailed，并提供反向切换按钮。下图中，`1` 标出已经切换后的 Edge Type，`2` 标出 Switch to WhenPassed 按钮：

![选中 whenFailed 边后的 Edge Properties 面板](https://docs.testany.io/docs/images/zh/pipeline-assembler-edge-whenfailed.png)


> **警告**
>
> 一个 case 节点最多只能有一个执行依赖入边。也就是说，一个下游 case 只能由一个 `whenPassed` 或 `whenFailed` 条件直接触发。系统也会阻止自环和循环依赖。


### 编排 fan-out 并行分支

在 `rule/v1.3` 中，fan-out 没有单独的 YAML 字段。它的 YAML 结构是：多个下游 case 的 `whenPassed` 或 `whenFailed` 都引用同一个上游 case，并使用相同的触发条件。

在 Canvas View 中，你可以从同一个上游节点分别连到多个下游节点。红框标出同一个上游 case 发出的三条 `whenPassed` 连线：

![一个上游 case 连接到三个 whenPassed 下游 case 的 fan-out 画布](https://docs.testany.io/docs/images/zh/pipeline-assembler-fanout-canvas.png)

```text
A
├─ whenPassed -> B
├─ whenPassed -> C
└─ whenPassed -> D
```

对应 YAML 是：

```yaml
kind: rule/v1.3
spec:
  rules:
    - run: A1B2C3D4
    - run: B1B2C3D4
      whenPassed: A1B2C3D4
    - run: C1B2C3D4
      whenPassed: A1B2C3D4
    - run: D1B2C3D4
      whenPassed: A1B2C3D4
```

当 `A1B2C3D4` 通过后，`B1B2C3D4`、`C1B2C3D4`、`D1B2C3D4` 会在语义上同时 ready。实际是否同时启动，取决于当前 Workspace 的可用并发槽位；如果槽位不足，平台会排队补位。

没有入边的 root case 在 `rule/v1.3` 下也可以并行调度：

```yaml
kind: rule/v1.3
spec:
  rules:
    - run: A1B2C3D4
    - run: B1B2C3D4
    - run: C1B2C3D4
```

### 标记 Expect Fail

选择一个 case 节点，在右侧 Properties Panel 中打开 Expect Fail。红框标出 Expect Fail 控件。

![在节点属性面板中勾选 Expect Fail](https://docs.testany.io/docs/images/zh/pipeline-assembler-expect-fail-toggle.png)

被标记为 Expect Fail 的 case 会写成：

```yaml
- run: B1B2C3D4
  whenPassed: A1B2C3D4
  expect: fail
```

`expect: fail` 表示该 case 即使实际执行失败，也会向 Pipeline 报告 Passed。因此，如果后续 case 依赖它继续执行，应使用 `whenPassed`，不要使用 `whenFailed`。

## 配置 relay

Relay 用于把上游 case 运行时产生的变量传给下游 case。

### 准备 relay case

配置 relay 前，需要先准备好 case 的环境变量：

- 上游 case 必须有 Output Variables，也就是 Relay-Out 变量。
- 下游 case 必须有 Input Variables，也就是 `type: env` 的输入环境变量。
- 变量名称和测试脚本里的读写逻辑应保持一致。

更多 case 侧配置请参考 [Managing Test Case with Relay Case](https://docs.testany.io/zh/docs/managing-test-case-with-relay-case.md) 和 [Understanding Output Relay](https://docs.testany.io/zh/docs/understanding-output-relay.md)。

### 在 Pipeline Assembler 中配置 relay

1. 在画布上选择提供数据的上游 case 节点，确认它已经声明 Output Variables (Relay-Out)。
2. 在画布上选择消费数据的下游 case 节点。
3. 在右侧 Properties Panel 找到 Input Variables (Relay-In)。
4. 点击目标输入变量旁边的配置图标，或展开目标输入变量条目。
5. 在 relay 表单中选择 Select Relay-Out Case。
6. 选择 Select Relay-Out Variable。
7. 如需要在日志中可见，勾选 Non-Secret Variable (nonSecret)。
8. 点击 Apply。

下图演示的是上游 case 节点中 Output Variables (Relay-Out) 列表的位置。`1` 标出 Relay-Out 变量列表；实际配置时请选择你要提供运行时变量的上游 case。

![上游节点属性面板中的 Relay-Out 输出变量](https://docs.testany.io/docs/images/zh/pipeline-assembler-node-expect-relay.png)

然后选中下游 case，展开目标 Input Variables (Relay-In) 条目。如果条目尚未展开，点击输入变量旁边的配置图标即可打开同一个表单。下图中，`1` 标出 Relay-In 变量卡片，`2` 标出展开/收起控件，`3` 标出 Select Relay-Out Case，`4` 标出 Select Relay-Out Variable，`5` 标出 Non-Secret Variable，`6` 标出 Apply：

![Relay 表单中选择上游 case、变量和 Non-Secret](https://docs.testany.io/docs/images/zh/pipeline-assembler-relay-form.png)

保存后，YAML 中会生成类似配置：

```yaml
- run: B1B2C3D4
  whenPassed: A1B2C3D4
  relay:
    - key: ACCESS_TOKEN
      refKey: A1B2C3D4/ACCESS_TOKEN
      nonSecret: true
```


> **警告**
>
> 不能跨 `whenFailed` 依赖配置 relay。如果一条边已经有 relay 引用，系统会阻止你把这条边切换成 `whenFailed`。如果必须改成失败分支，请先清除 relay 引用。



> **提示**
>
> 如果下游 case 消费上游 case 的 relay 输出，建议在画布上保留清晰的 `whenPassed` 执行依赖，让执行顺序和数据依赖保持一致。


## 使用 YAML View

当你已经知道完整规则结构，或者需要一次性调整多个依赖时，可以切换到 YAML View。

YAML View 会持久化以下字段：

- `run`
- `whenPassed`
- `whenFailed`
- `expect: fail`
- `relay`

切换视图和保存时，系统会解析 YAML、加载相关 case、检查图结构，并通过后端校验当前定义。保存失败时，请根据错误信息修正 YAML 或回到 Canvas View 调整。

YAML View 展示的是和画布等价的 Pipeline 定义。下图中，`1` 标出 schema version，`2` 标出带 relay 的预期失败分支，`3` 标出另一个带 relay 的 fan-out 兄弟分支，`4` 标出 `BF18144B` 的 `whenFailed` 失败分支。

![Pipeline Assembler YAML View 中的 rule/v1.3 定义](https://docs.testany.io/docs/images/zh/pipeline-assembler-yaml-v13.png)


> **备注**
>
> 新建或翻新 Pipeline 时，优先使用 `kind: rule/v1.3`。如果你打开的是历史 `rule/v1.2` Pipeline，请确认是否只是维护旧行为；不要把 `rule/v1.2` 当作新 Pipeline 的默认版本。


## 复杂 v1.3 示例

下面的示例包含一个 setup case、三个 `whenPassed` fan-out 下游分支（其中一个设置 `expect: fail`）、relay，以及一个只有在某个分支失败时才执行的 `whenFailed` 分支。

```yaml
kind: rule/v1.3
spec:
  rules:
    - run: '093710E4'
    - run: 'E18ADBB0'
      whenPassed: '093710E4'
      expect: fail
      relay:
        - key: URL
          refKey: 093710E4/BASE_URL
          nonSecret: true
    - run: 'AA923134'
      whenPassed: '093710E4'
      relay:
        - key: URL
          refKey: 093710E4/BASE_URL
          nonSecret: true
    - run: 'BD3C03F5'
      whenPassed: '093710E4'
    - run: 'BF18144B'
      whenFailed: 'AA923134'
```

这个示例在 Canvas View 中的核心结构是 `093710E4` 通过后扇出到三个同一波次的下游 case，并额外保留一条 `whenFailed` 分支：

![复杂 rule/v1.3 示例的 Canvas View fan-out 结构](https://docs.testany.io/docs/images/zh/pipeline-assembler-fanout-canvas.png)

这个 Pipeline 的执行语义是：

1. `093710E4` 先执行。
2. `093710E4` 通过后，`E18ADBB0`、`AA923134`、`BD3C03F5` 变为同一 ready 波次，可按 `rule/v1.3` 并行调度。
3. `E18ADBB0` 设置了 `expect: fail`，即使实际失败，也会作为预期失败处理，不会导致 Pipeline 失败。
4. `AA923134` 使用 `093710E4` 输出的 `BASE_URL`。
5. 只有 `AA923134` 向 Pipeline 报告 Failed、Aborted 或 Timeout 时，`BF18144B` 才会执行；如果 `AA923134` 通过，`BF18144B` 会被跳过。

## 保存和验证

编辑完成后点击 Save。系统会：

1. 从 Canvas View 生成 YAML，或读取 YAML View 当前内容。
2. 校验 YAML 是否可解析。
3. 校验 case key、依赖关系、relay 引用和循环依赖。
4. 调用后端验证 Pipeline YAML。
5. 保存 Pipeline 定义。

保存后，你可以在 Pipeline 详情页查看 Flow Diagram 和 Test Case List。触发一次执行后，在 Execution Detail 中确认：

- Pipeline 总状态是否符合预期。
- `expect: fail` 的 case 是否显示为预期失败或等价成功状态。
- 未满足条件的 `whenFailed` 分支是否被跳过。
- `rule/v1.3` 的 fan-out 分支是否在可用并发范围内并行启动。

## 常见问题

| 问题 | 处理方式 |
|------|----------|
| 找不到要添加的 case | 确认 case 已注册，并且你在正确的 Workspace 中搜索。 |
| 不能连接两个节点 | 检查是否存在自环、循环依赖，或目标节点是否已经有一条执行依赖入边。 |
| 不能切换为 `whenFailed` | 如果这条依赖上存在 relay 引用，请先清除 relay。 |
| relay 表单没有可选变量 | 确认上游 case 已声明 Relay-Out，且下游 case 已声明 Input Variables。 |
| 保存失败 | 打开错误信息，检查 YAML 结构、case key、重复 `run`、relay `refKey`、`whenPassed` / `whenFailed` 互斥规则。 |
| fan-out 没有同时启动 | 确认 Pipeline 是 `rule/v1.3`，并检查 Workspace 当前并发槽位是否足够。 |

## 本页术语

- [执行 (Execution)](https://docs.testany.io/zh/docs/glossary.md#execution)
- [测试用例库（Test Case Library）](https://docs.testany.io/zh/docs/glossary.md#test-case-library)
- [环境 (Environment)](https://docs.testany.io/zh/docs/glossary.md#environment)
- [工作区 (Workspace)](https://docs.testany.io/zh/docs/glossary.md#workspace)
- [运行时 (Runtime)](https://docs.testany.io/zh/docs/glossary.md#runtime)
- [测试脚本 (Test Script)](https://docs.testany.io/zh/docs/glossary.md#test-script)
- [测试用例 (Test Case)](https://docs.testany.io/zh/docs/glossary.md#test-case)
