测试 API 并在 CI 中运行
为请求添加检查,在运行器中运行它们,然后在 GitHub Actions 中用命令行工具运行同一个工作区并生成 JUnit 报告。
检查能把请求变成测试:每次发送都会说明哪些通过、哪些没有。在本教程中,你会为 Alpenglow 的请求添加检查,在运行器中运行文件夹,然后在 GitHub Actions 中每次推送时用 echolot run 运行同一个工作区。
- 用时: 20 分钟。
- 你需要: Alpenglow 工作区,以及最后一部分用到的、你可以推送的 GitHub 仓库。
- 你将学到: 检查、运行器及其报告、
echolot run,以及 CI 中的机密。
1. 查看请求已有的检查
- 打开 Catalog › List products,选取它的测试标签页。
- 它有四项检查:状态等于
200,JSON 值$.items.length大于0,标头Content-Type包含json,响应时间(毫秒)小于1000。 - 发送。标签页显示 4 项通过,响应的测试标签页显示
4/4,每项检查都列在检查下。
2. 添加你自己的检查
- 在测试标签页中,打开添加测试并选取 JSON 值。
- 把路径设为
$.items[0].price.currency,比较方式设为等于,期望值设为CHF。 - 再次打开添加测试,选取大小(字节)、小于、
65536。 - 发送。六项检查全部通过。
还有两种更快的添加检查的方法:
- 在响应的 JSON 树中,右键点按某个值并选取添加断言。检查会采用它的路径和值。
- 从响应生成… 会根据最新的响应提出检查建议,包括正文的 JSON Schema。
现在来看看失败的情形:把响应时间检查改为小于 1 并发送。标签页显示 1 个失败,共 6 个,响应的测试标签页会在失败的检查下显示返回的内容。再把它改回 1000。
对于需要代码的检查,可以在脚本标签页中用 pm.test() 编写测试脚本;参见脚本与测试。

3. 在运行器中运行文件夹
- 右键点按 Catalog 文件夹并选取运行文件夹。运行器页面会打开,并按顺序运行其中的每个请求。
- 统计数据显示请求、通过、失败、失败的检查和时长,结果卡片则列出每个请求的状态、耗时和失败的检查。
- 要自己设置一次运行,请选取视图 › 运行器(⌥⌘R)。在运行卡片中:
- 运行对象:整个工作区、某个文件夹,或一个请求。先选 Auth 并运行,再选 Orders:Orders 中的请求会发送 Sign in 存储的令牌。
- 环境、迭代(试试
3)、请求之间的延迟(毫秒)、失败请求的重试次数,以及首次失败时停止。 - 数据:选取 CSV 或 JSON… 会按每一行运行一次,并把行中的列作为变量。
- 选取运行(⌘R)。
- 打开存储报告,选取 JUnit XML…、JSON…、HTML… 或 HAR(所有交换)…。
运行整个工作区时也会运行 Realtime 和 Inventory。除非本地服务器正在运行,否则其中的 Socket.IO、MQTT 和 gRPC 请求会失败。详见运行器。

4. 在“终端”中运行
-
安装命令行工具:选取 Echolot › 安装命令行工具…,或者在设置 › 通用中开启它。它会把
echolot放到你的PATH上。 -
检查每个文件是否可读、每个变量是否可解析:
echolot validate Alpenglow.echolot它会输出
29 requests, 3 environments: no problems。 -
运行那三个只需要演示 API 的文件夹:
echolot run Alpenglow.echolot --folder auth --folder catalog --folder orders✓ POST auth/sign-in 200 142 ms ✓ Status equals 200 ✓ JSON value $.access_token exists ✓ GET auth/who-am-i 200 87 ms ✓ Status equals 200 … All 13 requests passed 18/18 checks passed · 1.35 s--folder接受文件夹或请求的文件名(auth、catalog/list-products)。当请求没有收到响应或检查失败时,退出码为1,脚本和 CI 可据此停止。 -
除了控制台输出,再写出一份 JUnit 报告:
echolot run Alpenglow.echolot --folder auth --folder catalog --folder orders \ --reporter junit --out results.xml --reporter console每个请求成为一个
testsuite,每项检查成为一个testcase。所有选项都在echolot run中。
5. 在 GitHub Actions 中运行
-
把
Alpenglow.echolot提交到你的仓库。 -
添加
.github/workflows/api.yml:name: API checks on: [push, pull_request] jobs: api: runs-on: macos-15 steps: - uses: actions/checkout@v4 - name: Install the Echolot CLI env: GH_TOKEN: ${{ github.token }} run: | gh release download --repo staticdreams/echolot-public --pattern 'echolot-*-macos.zip' --dir "$RUNNER_TEMP" unzip -q "$RUNNER_TEMP"/echolot-*-macos.zip -d "$RUNNER_TEMP/echolot" echo "$RUNNER_TEMP/echolot" >> "$GITHUB_PATH" - name: Validate run: echolot validate Alpenglow.echolot - name: Run run: > echolot run Alpenglow.echolot --folder auth --folder catalog --folder orders --reporter console --reporter junit --out results.xml - name: Keep the report if: always() uses: actions/upload-artifact@v4 with: name: echolot-results path: results.xml -
推送。Run 步骤会打印与你的 Mac 上相同的行,检查失败时作业会失败。JUnit 文件会作为
echolot-results附加到这次运行上;任何 JUnit 测试报告 action 都可以把它显示为表格。
命令行工具运行在搭载 Apple 芯片的 macOS 上,所以作业使用 macOS runner。
6. 为 CI 提供机密
你 Mac 上的钥匙串不会随工作区一起转移。在 CI 中,命令行工具会从环境变量 ECHOLOT_SECRET_NAME 读取机密变量 name,或者从用 --secrets 指定的、由 NAME=value 行组成的文件读取。
Alpenglow 的演示密码是公开的,所以它是普通变量。对于真实的密码:
-
在工作区中把它设为机密变量,比如
password,然后提交。 -
在 GitHub 中添加仓库机密
API_PASSWORD(Settings › Secrets and variables › Actions)。 -
把它传给该步骤:
- name: Run env: ECHOLOT_SECRET_PASSWORD: ${{ secrets.API_PASSWORD }} run: echolot run Alpenglow.echolot --env staging --reporter console --reporter junit --out results.xml
--env 接受环境的文件名(不含 .toml)或名称。关于 CI 的更多内容见 CI。
后续步骤
- 规范优先的设计与模拟:对照 OpenAPI 规范检查响应,在 App 中和 CI 中都可以。
- 运行器:数据文件、并排的迭代、重试。
echolot run:所有选项,包括--bail、--delay和 HTML 报告。

