Postman 集合测试和自动化
javascript // 检查状态码是否为 200 pm.test("状态码是 200", function () { pm.response.to.have.status(200); });
// 检查响应体是否为 JSON 格式 pm.test("响应体是 JSON", function () { pm.response.to.be.json; });
// 检查返回的数据中是否包含至少一个用户 pm.test("用户列表不为空", function () { var jsonData = pm.response.json(); pm.expect(jsonData.length).to.be.above(0); });
// 验证第一个用户的字段结构 pm.test("第一个用户具有 id 和 name 属性", function () { var jsonData = pm.response.json(); pm.expect(jsonData[0]).to.have.property('id'); pm.expect(jsonData[0]).to.have.property('name'); });
### 常用断言方法
- `pm.response.to.have.status(code)`:验证状态码
- `pm.response.to.have.header(key, value)`:验证响应头
- `pm.expect(value).to.be.true/false/null`:布尔/空值判断
- `pm.expect(array).to.be.an('array').that.is.not.empty`:数组非空
- `pm.expect(value).to.have.property('key', 'expectedValue')`:对象属性检查
- `pm.expect(value).to.have.string('substring')`:字符串包含
### 使用 Chai 风格的断言
Postman 内置了 `pm.expect`(基于 Chai 的 BDD 风格),你也可以使用 `chai.assert` 或 `chai.should`,但 `pm.expect` 代码更清晰,推荐使用。
## 使用变量增强测试灵活性
变量让你在不同请求间共享数据,并方便切换不同环境(开发、测试、生产)。
### 集合变量
1. 选中集合,点击 **Variables** 标签。
2. 添加变量名,例如 `baseUrl`,初始值设为 `http://localhost:3000`。
3. 在请求的 URL 中,用双花括号引用变量:`{{baseUrl}}/users`。
### 环境变量和动态变量
- **环境变量**:在右上角环境选择器中创建环境,填入不同环境的值,方便切换。
- **动态变量**:通过 `pm.variables.set("token", responseData.token)` 在脚本中设置,生命周期仅限当前请求或集合运行。
### 在请求之间传递数据
一个典型的场景:先登录获取 Token,再将 Token 用于后续请求。
在“登录”请求的 **Tests** 脚本中:
```javascript
var jsonData = pm.response.json();
pm.environment.set("authToken", jsonData.token);
在后续请求的 Authorization 标签中,选择 Bearer Token,Token 值填写 {{authToken}}。这样运行时就会自动替换。
运行集合与查看结果
使用 Collection Runner
- 点击集合名称旁的 Run 按钮(或右键选择 Run collection)。
- 在 Collection Runner 界面中:
- 可以调整请求的执行顺序(拖拽)或取消勾选不需要的请求。
- 设置迭代次数(需要配合数据文件)。
- 设置延迟时间,模拟真实网络。
- 选择是否保留响应记录。
- 点击 Run,所有请求按顺序执行。
- 执行完毕后会展示总体结果:通过/失败数量、平均响应时间等。点击每个请求可查看详细的请求/响应及测试结果。
测试执行顺序
默认请求顺序就是你在集合中看到的顺序。你也可以在请求的 Pre-request Script 或 Tests 中使用 pm.execution.setNextRequest("请求名") 来动态控制跳转,实现循环或条件分支。
数据驱动测试
数据驱动让你用外部文件(CSV 或 JSON)提供多组测试数据,每次迭代使用不同数据。
准备数据文件
CSV 示例 (testdata.csv):
username,email
alice,alice@example.com
bob,bob@example.com
JSON 示例 (testdata.json):
[
{ "username": "alice", "email": "alice@example.com" },
{ "username": "bob", "email": "bob@example.com" }
]
在请求中使用数据变量
在请求的 URL、Body 或 Headers 中,使用 {{username}}、{{email}} 引用数据列名。
运行数据驱动测试
- 打开 Collection Runner,点击 Select File 导入数据文件。
- 迭代次数会自动匹配数据行数(也可以手动设置)。
- 点击 Run Postman,每次迭代会使用一行数据。响应中的
pm.iterationData携带当前迭代的数据,可以在测试脚本中用于断言,例如:
pm.test("创建用户成功,用户名匹配", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.username).to.eql(pm.iterationData.get("username"));
});
使用 Newman 实现命令行自动化
Newman 是 Postman 的命令行收集运行工具,可以脱离 GUI 在服务器或 CI 环境中执行测试套件。
安装 Newman
确保已安装 Node.js,然后全局安装 Newman:
npm install -g newman
导出集合与环境
在 Postman 中,右键集合选择 Export,导出为 JSON 文件(例如 UserAPI.postman_collection.json)。同样导出环境文件(可选)。
运行测试
基本命令:
newman run UserAPI.postman_collection.json
指定环境和数据文件:
newman run collection.json \
-e environment.json \
-d testdata.csv \
--iteration-count 2
生成报告
Newman 支持多种报告器,常用的有 CLI、HTML、JUnit 等。
安装 HTML 报告器:
npm install -g newman-reporter-htmlextra
运行并生成报告:
newman run collection.json \
-r htmlextra \
--reporter-htmlextra-export report.html
结果报告会包含请求详情、测试结果概览和失败原因。
集成 CI/CD 流水线
将 Newman 命令添加到你的持续集成配置中,实现每次代码提交自动触发 API 测试。
GitHub Actions 示例
在项目根目录创建 .github/workflows/api-tests.yml:
name: Run Postman Collection
on: [push, pull_request]
jobs:
api-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install Newman and reporter
run: |
npm install -g newman newman-reporter-htmlextra
- name: Run tests
run: |
newman run ./tests/UserAPI.postman_collection.json \
-e ./tests/production.postman_environment.json \
-r cli,htmlextra \
--reporter-htmlextra-export newman-report.html
- name: Upload report artifact
if: always()
uses: actions/upload-artifact@v3
with:
name: newman-report
path: newman-report.html
这样每次推送代码时,GitHub Actions 都会在虚拟机中执行你的 Postman 测试,并生成可下载的 HTML 报告。
常见 CI 工具配置
- Jenkins:在构建步骤中执行 Newman 命令,并利用
publishHTML插件展示报告。 - GitLab CI:在
.gitlab-ci.yml中添加 similar 任务。 - Azure DevOps:通过命令行任务调用 Newman,并发布测试结果。
进阶技巧与最佳实践
预请求脚本(Pre-request Script)
在请求发送之前执行的脚本,常用于动态生成签名、时间戳或构造请求参数。例如为请求添加当前时间戳:
pm.variables.set("timestamp", Date.now());