当前位置: 首页 > 测试知识 > Postman高级玩法:Pre-request Script和Tests脚本实战,玩转动态请求和断言
Postman高级玩法:Pre-request Script和Tests脚本实战,玩转动态请求和断言
2026-04-28 作者cwb 浏览次数4

Pre-request Script在请求发出前执行,负责动态准备数据;Tests 在响应返回后执行,负责检查结果并提取信息-两者在脚本中都可访问pm.request和pm.response对象,形成完整的自动化流程。


Pre-request Script实战

1. 动态请求参数生成

API 后台一般要求时间戳、签名或唯一TraceId,这类值必须在 Pre-request Script 中动态生成。 一个误区是:在 URL 或 Body 里写 {{Date.now()}} 或 {{Math.random()}} - 这些不会执行,只会被当作纯字符串发送, 正确写法:


js

// 在 Pre-request Script 中生成动态值并存入环境变量

pm.environment.set("timestamp", Date.now().toString());

pm.environment.set("trace_id", Math.random().toString(36).substr(2, 9));

pm.environment.set("uuid", pm.variables.replaceIn("{{$guid}}"));


然后在请求Header或Body中用 {{timestamp}}、{{trace_id}} 引用这些变量。此外Postman还内置了$randomInt、$randomEmail等 60+ 种动态变量,可供直接使用。

如果需要使用pm.request.body.raw获取请求体内容来生成签名(如 HMAC-SHA256),由于Body在Pre‑request阶段尚未序列化,直接读取会失败。解决方案:将要签名的数据提前存入变量,生成签名后,再动态写入请求体。


2. 请求头动态构造和 Token 注入

Pre-request Script 最常见的场景是自动为每个请求添加 Authorization Token:


js

// 从环境变量获取 token,添加到请求头

var token = pm.environment.get("token");

pm.request.headers.add({

    key: "Authorization",

    value: "Bearer " + token

});


这样每次发送请求时Postman都会自动携带Token,避免了手动复制的繁琐。同理也可为每个请求注入X-Request-ID用于链路追踪。


3. 请求体动态格式转换

某些 API 要求将 JSON 格式的请求体转换为Form Data格式,可在Pre-request Script中动态处理:


js

// 定义原始 JSON 数据

const originalData = { name: "测试用户", age: 25, email: "test@example.com" };

// 转换为 Form Data 格式的字符串

const formDataString = Object.entries(originalData)

    .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)

    .join('&');

// 替换请求体

pm.request.body.update({

    mode: 'urlencoded',  // 切换为表单方式

    urlencoded: formDataString

});


这种思路特别适用于需要适配不同Content-Type的老旧接口。

Tests实战

1. JSON断言

仅证实HTTP 200远不够,必须对响应体的业务字段进行断言:


js

// 基础状态码断言

pm.test("状态码为200", function() {

    pm.response.to.have.status(200);

});


// JSON 结构深度检查

pm.test("数据结构正确", function() {

    const jsonData = pm.response.json();

    pm.expect(jsonData.code).to.equal(0);

    pm.expect(jsonData.data).to.be.an('object');

    pm.expect(jsonData.data.token).to.be.a('string').and.not.empty;

});


利用Chai断言库可以检查类型、范围、存在性等多种条件。


2. 从响应中提取数据传递到后续请求

这是创建完整业务流的重要-在Tests中将重要数据存入环境变量供集合中的后续请求使用:


js

const jsonData = pm.response.json();

if (jsonData.code === 0 && jsonData.data && jsonData.data.token) {

    pm.environment.set("auth_token", jsonData.data.token);

    pm.environment.set("user_id", jsonData.data.userId);

} else {

    console.log("登录失败: " + (jsonData.msg || "未知错误"));

}


提取的数据可被下一个请求通过 {{变量名}} 自动引用。


3. 条件跳转和循环

在Tests中使用pm.setNextRequest() 可以根据响应结果动态决定下一个执行的请求:


js

const res = pm.response.json();

if (res.code === 0 && res.data?.token) {

    pm.environment.set("auth_token", res.data.token);

    pm.setNextRequest("获取用户列表");     // 登录成功 → 跳转到业务接口

} else if (res.code === 401) {

    pm.setNextRequest("重新登录");        // Token 失效 → 重新登录

} else {

    pm.setNextRequest(null);              // 停止执行

}


pm.setNextRequest() 只能在 Tests 中调用,Pre-request Script 中使用无效;请求名称必须和集合中显示的名称完全一致(区分大小写和空格)。


4. 数组遍历和批量检查

对响应中包含列表的场景,可遍历数组进行批量检查:


js

pm.test("商品列表价格 > 0", function() {

    const jsonData = pm.response.json();

    pm.expect(jsonData.data.goodsList).to.be.an('array').and.not.empty;

    jsonData.data.goodsList.forEach((item, index) => {

        pm.expect(item.price, `商品 ${index + 1} 价格异常`).to.be.above(0);

    });

});


跨脚本协同进阶

全局函数复用

多个请求需要相同的处理思路时,可在Collection级别的Pre-request Script中定义公用函数:


js

// 在集合根目录 Pre-request Script 中定义

function generateSignature(body, secretKey) {

    // 返回 HMAC-SHA256 签名

    return CryptoJS.HmacSHA256(body, secretKey).toString();

}

// 声明为函数即可,使用时定义在请求内部


这样集合内所有请求都会继承这个环境无需重复编写签名思路。借助JSDoc注释格式,自定义函数还能获得代码提示。


在Pre-request Script中实现高安全性签名

Postman 内置了CryptoJS库,可直接用于MD5、SHA、HMAC、AES等加密运算,无需额外引入。如为满足高安全级别API的HMAC-SHA256签名要求:


js

const CryptoJS = require("crypto-js");  // Postman 沙箱中可直接使用内置 CryptoJS

const body = JSON.stringify(requestData);

const signature = CryptoJS.HmacSHA256(body, pm.environment.get("SECRET_KEY")).toString();

pm.request.headers.add({ key: "X-Signature", value: signature });


这种机制在金融、政务等对安全性要求很高的API测试场景中广泛使用。


在沙箱中发送额外请求

Postman 沙箱中也可通过 pm.sendRequest 发送独立的 HTTP 请求(获取 Token、清理测试数据等):


js

pm.sendRequest({

    url: pm.environment.get("base_url") + "/auth/refresh",

    method: 'POST',

    header: {

        'Content-Type': 'application/json'

    },

    body: {

        mode: 'raw',

        raw: JSON.stringify({ refresh_token: pm.environment.get("refresh_token") })

    }

}, function(err, res) {

    if (!err && res.code === 200) {

        pm.environment.set("new_token", res.json().token);

    }

});


数据驱动测试和CI/CD集成

将脚本和数据驱动测试、CI/CD 流水线结合,才能发挥Pre-request Script和Tests的最大作用。


数据驱动测试

准备CSV数据文件(编码必须为 UTF-8):


在Collection Runner中导入文件,并在请求中用 {{username}}、{{password}} 引用数据列。在Tests中直接用data.变量名即可访问当前行的数据。


Newman + CI/CD 集成

通过 Newman 命令行工具将 Postman 集合无缝集成到 Jenkins 或 GitLab CI 中:


bash

# 基础执行命令

newman run "API_Test_Suite.postman_collection.json" \

    --environment "prod_env.json" \

    --reporters html,cli \

    --reporter-html-export "./reports/report_$(date +%Y%m%d).html"


在 Jenkins Pipeline 中加入测试阶段,即可实现代码提交后自动执行接口测试并生成报告。


技巧指南


变量在请求中无法分析:{{timestamp}} 直接显示为字符串,变量须在 Pre‑request 中设置,不能在 URL/Body 中直接拼接 JS 函数

Response 分析失败:pm.response.json() 报错,改用 pm.response.text() 获准原始文本;XML 响应需引入 xml2js 分析

Sandbox 环境限制:无法使用 require('fs')、axios 等 Node 模块,仅使用内置 pm API 和 CryptoJS;如果需复杂第三方库,通过 CDN 加载

异步顺序错误:脚本中的 Promise 未按预期执行,避免 await 和异步回调嵌套,改用 pm.sendRequest 回调函数或 CryptoJS 同步方法

同名请求导致跳转错误:setNextRequest 跳转到错误接口,为请求命名时加前缀 [Auth]登录、[API]获取用户列表,避免名称重复

沙箱不支持某些加密算法:需要 AES-256-CBC 或 RSA 加密,Postman 内置 CryptoJS 支持 HMAC/SHA/AES;RSA 加密需引入 forge.js 处理


从基础环境变量注入到 pm.sendRequest 的沙箱调用,从简单状态码到复杂断言的检查,再到数据驱动测试和 CI/CD 集成,Pre-request Script 和 Tests 双剑合璧,足以创建起包括全生命周期的API自动化测试体系。


文章标签: 软件测试 测试工具
咨询软件测试