Postman代码攻略
目录
Postman
基于 Http, Dubbo, WebService, WebSocket 协议的接口测试;

下载与安装
Postman 命令行工具 --- newman 官方指导文档
动态参数
# 内置的动态参数
{{$timestamp}} # 生成当前时间的时间戳
{{$randomInt}} # 生成0-1000之间的随机数
{{$guid}} # 生成随机GUID字符串
# 注意
postman 内置的动态参数和环境变量无法进行断言,必须使用方法获取自定义动态参数
在 body 中引用全局变量同样使用 双大括号的形式
在前置脚本和后置脚本中不可以使用 双大括号获取全局参数,需要使用方法获取
pm.test 断言只能在test选项卡【后置脚本】中使用
# 获取响应对象
const data1 = pm.response.json()
# 自定义动态参数
// 在前置脚本中获取当前时间戳,并设置为全局变量
// 手动获取当前时间戳
var times = Date.now();
// 设置times为全局变量
pm.globals.set("times", times);
# 获取全局变量参数 --- 3 种形式
pm.globals.get("times")
globals["times"]
globals.times
# 提取动态数据
var jsonData = pm.response.json();
pm.globals.set("dynamic_variable", jsonData.key_you_are_interested_in);
# 打印日志
console.log(data1)
常用脚本代码 --- JS 代码
pm 变量为 Postman 变量的别名;
# postman对象的一些关键属性和方法
postman.getResponseHeader(headerName) # 获取响应头的值。
postman.setEnvironmentVariable(key, value) # 设置环境变量。
postman.setGlobalVariable(key, value) # 设置全局变量。
postman.getResponseCookie(cookieName) # 获取响应中的cookie。
postman.clearEnvironmentVariable(key) # 清除环境变量。
postman.clearGlobalVariable(key) # 清除全局变量。
postman.setNextRequest("requestName") # 设置下一个要运行的请求。
postman.getResponseCode() # 获取响应代码。
postman.getResponseBody() # 获取响应体。
postman.sendRequest(request, callback) # 发送请求,并提供一个回调函
环境变量管理
# 作用域: --- 变量的生效范围大小
作用域就是变量的生效范围大小
全局变量 (globals)> 环境变量(enviroment)> 集合变量(collection) > 本地(local)> 数据(data)
# 变量优先级: --- 优先级高的覆盖优先级低的变量
全局变量 (globals)< 环境变量(enviroment)< 集合变量(collection) < 本地(local)< 数据(data)
# 设置
var jsonData = pm.response.json();
pm.globals.set("dynamic_variable", jsonData.key_you_are_interested_in); # 全局变量
pm.environment.set("name", "fafafaf") # 环境变量
pm.collectionVariables.set("name", jsonData.id) # 集合变量
# 获取
pm.globals.get("forgeJS") # 全局变量
pm.environment.get("name", "fafafaf") # 环境变量
pm.collectionVariables.get("afaf") # 集合变量
pm.variables.get("name") # 用例变量
# 判断, 其他同理
pm.globals.has("forgeJS")
# 清除变量,其他同理
pm.globals.unset("variableName") # 清除指定的全局变量
pm.globals.clear() # 清除全部全局变量
# 注意
Globals 仅有一组,而环境变量和集合变量可以有多组;
断言
断言即测试后置脚本;按生效范围可区分为全局断言和局部断言;全局断言作用于每个测试用例;
// 1. 检查状态码
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
// 2. 检查响应体中是否包含该字符串
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
// 3. 检查json中某个字段的值
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
// 4. 检查响应中body中指定的字符串
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
// 5. 检查是否包含某响应头
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
// 6. 检查请求消耗的时间是否小于xxms
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
// 7. 断言 Post 请求返回状态码是否在指定的范围内
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
// 8. 断言返回的状态码中是否包含指定的字符串
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});
断言中内置的变量
responseBody # 响应体内容
数据提取器
Json 提取器
# 解析数据为 json 对象
var jsValue = JSON.parse(responseBody)
# json 对象字典键值对的获取
jsValue["xxx"]
jsValue.xxx
jsonData['data']['pageListData'][0]['customPhone']; # 多级嵌套
正则提取器
var biaoID = responseBody.math(new RegExp('"id": (.+?)'))[1] # 默认为一个数组
Cookie 提取器
var csrf_token = postman.getResponseCookie('csrf_token'); # 获取的是对象
var csrf_token = postman.getResponseCookie('csrf_token').value; # 获取的是value值
请求头提取器
var types = postman.getResponseHeader('Content-Type')
console.log(types)
函数的定义
// 获取一个1000-2000之间的随机数
1.获取一个随机数( constant 是定义一个函数)
const randomInt = (min,max) =>Math.random() //范围在0-0.9999999之间
console.log(randomInt(1000,2000))
const randomInt = (min,max) =>Math.random()*100 //0-100之间取随机数
2.获取一个1000到2000之间的随机数
const randomInt = (min,max) =>Math.floor(Math.random()*(max-min+1))+min
console.log(randomInt(1000,2000))
Math.floor是取整的意思
// 如果多个接口都要用动态参数
可以设置一个全局变量,值等于动态参数 var randomInt = (min,max) =>Math.floor(Math.random()*(max-min+1))+min
那么多个接口都可以取这个值,但是取到的时候字符串,需要用 eval函数把这个转换成一个函数
// 自定义动态函数
将自定义函数脚本文本定义到全局变量中,然后在测试用例的前置和后置脚本中使用 eval 关键字二次解析为代码,然后再使用该自定义函数
eval(pm.globals.get("randomInt"))
var random = randomInt(200, 300)
数据的加密
# crypto-js 是一个 JavaScript 加密算法库,提供了多种常见的加密算法,包括对称加密(如 AES、DES)、哈希函数(如 MD5、SHA)和消息认证码(如 HMAC)等。
使用 crypto-js 可以在前端和后端环境中进行数据的加密和解密操作。它支持多种编码格式,包括 UTF-8、Base64 等。
该库的主要特点包括:
# 提供了简单易用的接口:crypto-js 提供了一套简单易用的 API,使得在 JavaScript 中使用各种加密算法变得简单和方便。
支持多种加密算法:crypto-js 支持多种常见的加密算法,如 AES、DES、Triple DES 等。可以根据需求选择合适的算法进行加密和解密操作。
支持多种编码格式:crypto-js 支持多种编码格式的输入和输出,包括 UTF-8、Base64、Hex 等。这样可以方便地处理不同格式的数据。
跨平台兼容性:crypto-js 可以在前端和后端环境中使用,适用于浏览器端和 Node.js 等服务器端环境。这样可以在不同的平台上实现相同的加密算法。
使用 crypto-js 可以实现各种加密场景,比如密码存储、数据传输安全等。需要注意的是,为了确保数据的安全性,除了选择合适的加密算法,还需要正确管理密钥和其他安全措施。
# 对称式加密,加密和解密使用同一个秘钥
DES, AES, Base64
# 非对称式加密即双钥加密,区分为私钥和公钥,根据公钥加密文本,根据私钥解密文本;
RSA
私钥加密: 数字签名
公钥解密: 验证签名即身份验证
# 数字证书
通过第三方的CA(数字证书颁发机构)对公钥加密,加密后的内容则称之为数字证书,包含: 用户的基本信息,公钥的信息,X509的标准,
Fiddle 想要抓取 https 报文,则需要安装一个数字证书
# 加密,不考虑解密,哈希算法,散列算法
MD5
RSA 加密
MD5 的加密
// postman的MD5加密(有时候传参需要穿加密过的参数,需要进行把参数在pre--request Script里进行预处理,处理过后设置一个全局变量,传参时直接引用)
// 1. 在前置中引入CryptoJS库
// 第一种方法: 设置全局变量
pm.globals.set('CryptoJS', require('crypto-js'));
// 第二种方法: 通过require("crypto-js") 引入 crypto-js 模块
const CryptoJS = require("crypto-js");
// 2. 在你需要加密数据的地方,使用CryptoJS进行加密
var CryptoJS = pm.globals.get('CryptoJS');
var username = CryptoJS.MD5('admin').toString().toUpperCase() //toUpperCase()是加密后把小写字母转换为大写字母
console.log(username)
AES 的加密
var secretKey = "your-256-bit-secret-key"; // 替换为你的密钥
var message = "Your data to encrypt"; // 替换为你需要加密的数据
var ciphertext = CryptoJS.AES.encrypt(message, secretKey);
Base64 的加密
var user = CryptoJS.enc.Utf8.parse("admin")
var base64_user = CryptoJS.enc.Base64.stringify(user)
console.log(base64_user)
pm.globals.set("base64_user",base64_user);
------------------------------------------------------------
const key = crypto_js.enc.Utf8.parse("deeertg34kuysas"); //十六位十六进制数作为密钥
const iv = crypto_js.enc.Utf8.parse('id2zhEsN145ertjha'); //十六位十六进制数作为密钥偏移量
//加密方法
function Encrypt(word) {
let srcs = crypto_js.enc.Utf8.parse(word);
// let encrypted = crypto_js.AES.encrypt(srcs, key, { iv: iv, mode: crypto_js.mode.CBC, padding: crypto_js.pad.Pkcs7 });
let encrypted = crypto_js.AES.encrypt(srcs, key, { iv });
return crypto_js.enc.Base64.stringify(encrypted.ciphertext);
}
var src_data = pm.environment.get("starrocks_pwd");
console.log('Encrypt mysql_password before: ', src_data)
var src_data_en = Encrypt(src_data)
pm.environment.set("starrocks_pwd_after", src_data_en);
console.log('Encrypt starrocks_pwd_after: ', src_data_en)
console.log('Encrypt starrocks_pwd_after : ', pm.environment.get("starrocks_pwd_after"))
-----------------------------------------------------
if (!pm.globals.has("forgeJS")) {
pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", function (err, res) {
if (err) {
console.log(err);
} else {
pm.globals.set("forgeJS", res.text());
}
})
} else {
eval(postman.getGlobalVariable("forgeJS"));
// 公钥
var rsa_public_key = pm.globals.get("RSA");
var publicKey = forge.pki.publicKeyFromPem(rsa_public_key);
//rsa加密得到签名
var encryptedText = forge.util.encode64(publicKey.encrypt(pm.environment.get("raw_sword"), 'RSAES-PKCS1-V1_5', {
md: forge.md.sha1.create(),
mgf1: {
md: forge.md.sha1.create()
}
}));
//将加密得到的签名放到环境变量中
pm.environment.set("sword",encryptedText);
}
其他
# 将 XML 对象转化为 JSon 对象
var jsonObject = xml2Json(responseBody);
# 获取时间戳
var times = Date.now()
var ssss = new Date().getTime();
# 转化为字符串
toString()
# 把小写字母转换为大写字母
toUpperCase()
# 日志打印
console.log('Encrypt mysql_password before: ', src_data)
# 获取json体数据
var jsonData = pm.response.json()
# 获取id的值,通过slice(-1)获取列表中最后一个元素。
var id = jsonData.data.rows.slice(-1)[0]
JS 内置对象
对象 --- pm.response
pm.response 对象包含响应有关的所有信息
pm.response 对象可直接 简写为 response 对象
| 方法 | 描述 |
|---|---|
| pm.response.code | 获取当前请求返回的状态码如200,404,500等 |
| pm.response.reason() | 当前请求成功返回OK |
| pm.response.headers | 以数组的形式返回当前请求成功后的response的headers |
| pm.response.responseTime | 获取执行此次请求的时间单位为ms |
| pm.response.text() | 以文本的方式获取响应里面的body的内容 |
| pm.response.json() | 将body里面的内容解析为一个json对象 |
| response.status | 放回当前状态 |
对象 --- pm.request
pm.request 对象用来获取请求对象。但request中的参数只可读
pm.request 对象可直接 简写为 request 对象
postman.getResponseHeader("Server"); //获取响应头
postman.getRequestHeader() // 没有这个函数
request.headers.host //获取请求头的某个字段数据
| 方法 | 描述 |
|---|---|
| request.data | 用于获取请求头的表单内容 |
| request.headers | 用于获取请求头 |
| request.method | 用于获取请求的请求方法 |
| request.url | 用于获取请求的URL |
对象 --- pm.sendRequest
pm.sendRequest对象允许异步发送HTTP/HTTPS请求。简单的来说就是:用户有一个繁重的计算任务或需要发送多个请求,那么现在可以在后台执行该逻辑。用户可以指定一个回调函数,并在底层操作完成时得到通知,而不是等待调用来完成(因为这会阻碍任何下一个请求)
pm.sendRequest()方法接收两个参数,一个URL(请求信息)和一个函数;函数又接收两个参数:第一个URL参数的响应(错误和正确响应),Postman内部将第一个URL参数的响应赋值给两个变量err,res(即err,res就是脚本请求的错误响应或正确响应,如果要对脚本请求的响应进行处理的话,就可以使用err,res来处理)
// 发送get 请求
pm.sendRequest("https://postman-echo.com/get?name=mouse", function(err, res) {
if (err) {
console.log(err);
} else {
name = res.json()["args"]["name"]; // 获取字典数据
pm.environment.set("name", name); // 设置环境变量
//断言
pm.test("测试描述", function() {
pm.expect(err).to.equal(null); //错误信息为空
pm.expect(res).to.have.property("code", 200); // 判断状态码
pm.expect(res).to.have.property("status", "OK"); // 判断状态文本
});
}
});
pm.sendRequest("http://192.168.10.206:8099/rest/news/list.page?sortType=1", function(err, res) {
if (err) {
console.log(err);
} else {
//返回 body->data->records 数据的第一个元素的id值
id = res.json().data.records[0].id;
pm.environment.set("id", id);
}
})
console.log(pm.environment.get("id"));
接口的鉴权
http , basic, authentication , session, cookie, token , Oauth
接口签名
sign 接口签名 == 时间戳,用户名和密码和其他一些参数格式转化后,再排序,再加密后得到的字符串,
该字符串时唯一有权访问第三方金融接口的鉴权码
命令行工具 Newman 讲解
# 该工具依赖 node.js , 故需提前安装
# 执行命令
newman run <json 或 csv 格式Postman 数据文件> --reporters cli # 生成终端打印的报告
# # 生成 HTML 报告
newman run xxx.json -d xxx.json/xxx.csv -r html --reporter-html-export /Users/lz01/Desktop/tdtest.html
构造 Allure 报告
#1. Allure 依赖于 JDK 环境,故先提前 JDK 环境
#2. 安装 Newman 生成 Allure 报告的插件
npm install -g newman-reporter-allure
#3. 构造报告
newman run <json 或 csv 格式Postman 数据文件> --reporters allure
newman run <json 或 csv 格式Postman 数据文件> --reporters cli,allure # 可同时生成多种格式
# alluer 查看 HTML 格式的测试报告
allure serve # 局限性,在自身电脑可看,别人无法看,也就是不易迁移

浙公网安备 33010602011771号