Postman快速入门


我们通常在开发完自己的接口后,都会测试一下,常用的工具就是Postman。下面将向你介绍Postman基本的使用,让你快速入门。

注意:下面的是基于postman 9.14.0 版本进行的操作,不同版本的功能入口可能会有区别。

本文参考:

下载安装Postman

软件安装这里不做过多的说明,直接到Postman的官网上去下载即可:https://www.postman.com/downloads/ ;之后直接安装即可无特殊的说明。

打开软件后会让你登录,直接跳过即可;当然你也可以去注册一个账号登录。

Postman使用说明

下面通过几个示例来快速让你了解Postman的基本使用。

简单请求

请求的示例

添加请求头header

当我们的接口需要在请求头添加参数时(比如token就放在请求头里面的),postman依然支持添加

通常我们的接口都会有一个权限验证,因此postman也为此设计了相关功能;比如我们的接口需要在头部放置一个名为token的标识,可以点击Authorization 标签进行设置。

请求体body设置

对于post请求,我们通常是将请求参数以JSON格式放置于body中的,下面是示例

文件上传请求体设置

保存接口和接口集合的创建

我们接口测试完后,后面可能也会再次使用,因此需要将其保存下来;至于接口集合就是将多个接口放到一个集合下面,这样方便我们以后使用postman的runner进行多个接口测试。

变量

postman中变量分为内置变量(动态变量)、全局变量、环境变量、集合变量、接口对象;这些变量使得Postman的接口测试能力得到很大的增强。下面我们通过一张图让你快速了解变量的作用域大小。

创建环境和全局变量值

当我们有多个环境时,各个环境的部分配置是不一样的,因此需要区分;同时有些参数是各个接口共有的(比如token认证信息);这些就是我们需要用到的。下面的示例中我们将接口域名统一配置的环境变量中,并做个接口自动设置token的操作。

上面示例中创建了一个名为dev的环境,然后再该环境里面添加了一个domain的域名地址;同时在Globals里面添加了一个名为token的值(以便下面我们做自动设置token使用)

注意:记住点击右上角的保存按钮

接口自动设置token

我们在上面设置了环境和全局变量,下面就在接口中使用这些变量。postman中使用变量的语法和Vue的很像,使用2个大括号包裹:{{变量名称}}
动态变量需要额外加一个美元符号:{{$变量名称}}

我们要实现这个自动设置token的功能就需要借助postman提供的功能,分别是Pre-request Script (前置函数:在请求前执行,可以设置请求参数) 和 Tests (后置函数:在拿到响应后执行,postman本意是用来做接口响应数据的测试验证的); 里面支持js代码。

  • token获取的接口

Tests 中添加如下代码,将获取到的token设置到Globals中。

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});
// 将返回的token 设置到Globals中
pm.globals.set("token", responseBody)

可以点击右上角的眼睛图标,查看当前环境和Globals中的值

  • 普通接口设置token

在普通接口中直接使用该变量即可

使用Runner执行多个接口

当我们需要一次性进行多个接口的运行,此时就可以使用Runner了。在集合上点击那3个点的地方选择 run collection 。可以根据需要,调整接口顺序,待会在执行的时候会安装界面上显示的顺序依次执行。

注意如果使用数据文件进行测试,以JSON文件为例,其格式如下(即postman每次读取一行数据,数据名称最后一致,否则将不能识别):

[
  {"hotelName": "酒店名称001","roomNum": 1,"price": 100},
  {"hotelName": "酒店名称001","roomNum": 1,"price": 100}
]

注意接口中就需要使用变量来赋值了。同时我们也可以通过 Pre-request ScriptTests 配合实现接口之间的关联性测试。

这里需要说明的是Postman是不能做并发压力测试的,一个Runner它是串行执行的。若需要做压力测试请使用 JMeter

动态变量

动态变量一般是用来生成参数的;作用域只在当前接口参数中生效。动态变量通过 {{$变量名}} 来使用。

变量名称 描述 例子
$timestamp 当前UNIX时间戳(以秒为单位) 1647326175
$randomUUID 随机的36个字符的UUID 2768b2ea-bb0b-4cb4-bb68-d1f6e8016395
$randomAlphaNumeric 随机字母数字字符 1
$randomBoolean 随机布尔值(true/false) true
$randomInt 1 至1000之间的随机整数 200
$randomUserName 随机用户名 Jules_Kreiger35
$randomPhoneNumber 随机的10位数电话号码 423-310-1317
$randomPrice 100.00至999.00之间的随机价格 99.99

更多请查阅官网:https://learning.postman.com/docs/writing-scripts/script-references/variables-list/

函数

pm发起请求

发送GET请求

var domain = pm.environment.get("domain")
// 发送请求
pm.sendRequest(domain+"/demo/token", function(err, response){
    if(response.code==200){
        // 将返回结果设置到环境变量中
        pm.environment.set("token", response.text())
    }else{
        console.log(response)
        console.log(err)
    }
})

发送POST请求

// 请求参数
pm.sendRequest({
    url: 'http://127.0.0.1/mall/inValue',
    method: 'POST',
    header: 'key1:value1',
    body: {
      mode: 'raw',
      raw: JSON.stringify({ key: 'value' })
    }
}, function(err, response){
    // 处理响应
    
})

Pre-request ScriptTests 中常用函数

pm对象包含与正在执行的脚本有关的所有信息,并允许访问正在发送的请求的副本或接受到的响应,它还允许获取和设置环境变量和全局变量

// 获取一个环境变量
pm.environment.get("variable_key");
// 获取一个全局变量
pm.globals.get("variable_key");
// 获取一个变量
pm.variables.get("variable_key");
// 获取一个集合变量
pm.collectionVariables.get("variable_key");

// 设置一个环境变量
pm.environment.set("variable_key", "variable_value");
// 设置一个全局变量
pm.globals.set("variable_key", "variable_value");
// 获取一个变量
pm.variables.set("variable_key", "variable_value");
// 获取一个集合变量
pm.collectionVariables.set("variable_key", "variable_value");

// 清除一个环境变量
pm.environment.unset("variable_key");
// 清除一个全局变量
pm.globals.unset("variable_key");
// 清除一个集合变量
pm.collectionVariables.unset("variable_key");

引入自定义函数

由于postman并未直接提供引入第三方JS的配置,但是由于Pre-request ScriptTests 中支持JS脚本,因此我们可以基于eval函数来实现。具体的实现方案有如下2种:

方式1:将js代码直接设置到环境变量或者是全局变量中,然后直接取里面的值即可,代码如下:

// 加载js
eval(pm.globals.get("forgeJS"));
// 执行js
var now = new Date();
console.log(dateFormat(now, 'yyyy-MM-dd'))

方式2:请求远程js,代码如下:

if (!pm.globals.has("forgeJS")) {
    // 请求远程js
    pm.sendRequest("http://127.0.0.1:8080/common.js",
        (err, res) => {
            if (res.code==200) {
                // 加载js
                eval(res.text());
                // 将js设置到全局变量中
                pm.globals.set("forgeJS", res.text());
                // 执行js
                var now = new Date();
                console.log(dateFormat(now, 'yyyy-MM-dd'))
            }
        }
    );
}else{
    // 加载js
    eval(pm.globals.get("forgeJS"));
    // 执行js
    var now = new Date();
    console.log(dateFormat(now, 'yyyy-MM-dd'))
}

CryptoJS加密函数使用示例

CryptoJS 里面包含封装了许多的加密函数,对于我们需要认证的接口通过它可以很好的实现。

CryptoJS使用之MD5生成签名

请求参数内容如下:

{
  "merchant":"982902201376",
  "amount": 100.01,
  "timestamp":"{{timestamp}}",
  "sign":"{{sign}}"
}

前置脚本中生成时间戳和签名

// 拿到当前请求参数信息
var req = JSON.parse(pm.request.body.toString())
console.log(req)

// 通过 pm.variables.replaceIn 来调用内置的动态函数生成时间戳
var timestamp = pm.variables.replaceIn("{{$timestamp}}")
pm.variables.set("timestamp", timestamp)

// 从环境变量中获取变量
var salt = pm.environment.get("salt")
var str = "uid="+req.merchant+"&money="+req.amount+"&timestamp="+timestamp+"&salt="+salt;
console.log("签名字符串:"+str)

// 通过md5生成加密
var sign = CryptoJS.MD5(str).toString()
console.log("签名:"+sign)
// 设置到接口变量中
pm.variables.set("sign", sign)

CryptoJS使用之Base64

// 对字符串做base64编码
const encStr = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse("待编码字符串"))
console.log(encStr)
// 对base64字符串做解码
CryptoJS.enc.Base64.parse(encStr).toString(CryptoJS.enc.Utf8)
console.log(encStr)

CryptoJS使用之SHA256加密

const str = CryptoJS.SHA256('待加密字符串').toString()
console.log(str)

CryptoJS使用之AES加解密

AES简单加解密

// 加密
var str1 = CryptoJS.AES.encrypt('待加密字符串', '秘钥').toString()
console.log(str1)

// 解密
var str2 = CryptoJS.AES.decrypt('待解密字符串', '秘钥').toString(CryptoJS.enc.Utf8)
console.log(str2)

自定义AES加解密

const key = CryptoJS.enc.Utf8.parse("1234567890123456");  //十六位十六进制数作为密钥
const iv = CryptoJS.enc.Utf8.parse('1234567890123456');   //十六位十六进制数作为密钥偏移量
    
//解密方法
function Decrypt(word) {
    let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
    let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
    let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    return decryptedStr.toString();
}
    
//加密方法
function Encrypt(word) {
    let srcs = CryptoJS.enc.Utf8.parse(word);
    //mode就是加密模式,padding是填充。
    let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
    return encrypted.ciphertext.toString().toUpperCase();
}

const encryptStr = Encrypt("待加密字符串")
console.log(encryptStr)

const decryptStr = Decrypt(encryptStr)
console.log(decryptStr)

特别提醒:扫码关注微信订阅号'起岸星辰',实时掌握IT业界技术资讯! 转载请保留原文中的链接!
  目录