Postman中的Pre-request Script是一个强大的工具,能在请求发送前动态处理数据、定制请求,从而实现更复杂和灵活的API测试。
Pre-request Script的概念
简单说,Pre-request Script就是一段在HTTP请求发送之前执行的JavaScript代码。能将一些手动、重复的操作进行自动化,如:
动态参数:生成时间戳、随机字符串,或对参数进行编码、加密。
请求元素:在发送前动态设置请求头、URL参数或请求体数据。
环境和变量:灵活地设置或更新环境变量、集合变量,为请求准备合适的数据。
处理接口:通过发送异步请求来获取必要的令牌(Token)或数据,保证后续请求的正确。
脚本执行顺序和作用域
理解脚本的执行顺序和作用域对于编写正确的预请求脚本非常重要。
执行顺序:当请求位于集合或文件夹中时,脚本的执行遵循一个特定的层级顺序:
集合级别脚本(如果存在)
文件夹级别脚本(如果存在)
请求本身级别的脚本
这个顺序就像是剥洋葱,从外到内,一层一层地执行。
作用域:Pre-request Script可以添加到集合、文件夹或单个请求中,影响范围由所在的位置决定的。
动态数据处理实战
以下是一些在Pre-request Script中动态处理数据的常见情况和代码示例:
生成随机数据
const randomStr = Math.random().toString(36).substr(2, 10); pm.environment.set("randomStr", randomStr);
//避免因重复数据导致请求失败,常用于用户名、订单号等字段。
生成时间戳
const timestamp = Math.floor(Date.now() / 1000).toString(); pm.globals.set("timestamp", timestamp);
//用于校验请求时效性或作为签名参数。
参数编码
encodevalue = encodeURIComponent(pm.request.url.query.get("p")); pm.request.url.query.remove("p"); pm.request.url.query.add("p=" + encodevalue);
//保证URL参数符合规范,避免服务器解析错误。
和请求元素进行交互
Pre-request Script的强大之处在于可以直接修改请求的各个部分。
操作查询参数(URL Params)
动态地添加、修改或删除URL中的查询参数。下面的代码演示了如何获取、编码并更新一个名为"p"的查询参数:
javascript
// 获取、编码并更新查询参数
encodevalue = encodeURIComponent(pm.request.url.query.get("p")); // 获取并编码参数值
pm.request.url.query.remove("p"); // 删除原有的参数
pm.request.url.query.add("p=" + encodevalue); // 添加编码后的新参数
console.log("p=" + encodevalue); // 可在控制台查看输出
设置请求头(Headers)
在发送需要认证的API请求时,可以动态地在请求头中添加认证信息:
javascript
// 从环境变量获取token并添加到请求头
const token = pm.environment.get("authToken");
pm.request.headers.add({
key: "Authorization",
value: "Bearer " + token
});
构建请求体(Body)
对于POST请求,你可以动态地构建或修改请求体中的数据:
javascript
// 生成随机用户名和密码并设置到请求体
let randomUsername = 'user' + Math.random().toString(36).substr(7);
let randomPassword = 'pass' + Math.random().toString(36).substr(7);
// 设置请求体(Raw JSON)
const requestBody = {
username: randomUsername,
password: randomPassword
};
pm.request.body.raw = JSON.stringify(requestBody);
高级技巧
当基础操作无法满足需求时,可以尝试以下高级技巧:
发送异步请求处理依赖
如果当前请求依赖于其他接口的返回结果(例如需要先获取一个短时效的Token),可以使用 pm.sendRequest 方法。
javascript
// 在发送主请求前,先获取Token
pm.sendRequest({
url: pm.environment.get("apiBaseUrl") + "/token",
method: "POST",
body: JSON.stringify({ username: "user", password: "pass" })
}, (error, response) => {
if (!error) {
const token = response.json().token;
pm.environment.set("authToken", token); // 将Token存入环境变量
}
});
注意:由于 pm.sendRequest 是异步的,你需要保证在主请求中处理好回调逻辑。
实现数据驱动测试
可以利用Pre-request Script和Collection Runner或Newman结合,实现数据驱动测试。通过在CSV或JSON文件中准备多组测试数据,在脚本中使用 pm.iterationData.get("key") 来获取每次迭代的数据,从而用不同的数据重复执行同一个请求。
调试和优化
编写脚本时难免会遇到问题,掌握调试方法非常重要。
使用控制台(Console):在脚本中使用 console.log() 来输出变量的值或执行流程信息。通过点击Postman左上角的"View" -> "Show Postman Console"打开控制台查看这些日志。
查看测试结果:请求发送后,你可以在"Tests Results"标签页看到断言的结果,失败的断言会显示红色错误信息,帮助你定位问题。