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]  # 默认为一个数组

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)


数据的加密

JSON 格式在线格式化 -- 加密和解密网站

#	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 # 局限性,在自身电脑可看,别人无法看,也就是不易迁移 

参考网址

在线JS代码格式化、JS代码美化工具

JSON 格式在线格式化 -- 加密和解密网站

Postman汉化教程,教您把Postman设置为中文!

Chrome 下 Postman 插件下载

postman之pm对象详解

Postman中的变量作用域

posted @ 2024-03-27 10:18  梭梭666  阅读(131)  评论(0)    收藏  举报
返回顶部