postman介绍

您可以在 Postman 中发送请求以连接到您正在使用的 API。您的请求可以检索、添加、删除和更新数据。无论您是构建或测试自己的 API,还是与第三方 API 集成,您都可以在 Postman 中发送请求。您的请求可以发送参数、授权详细信息以及您需要的任何正文数据。
image-1653115756259

  • Params:请求参数,发送 HTTP 请求所使用的请求的参数的设置。params传参一般用于get请求,params传参时参数会附于url后面以问号形式展示
  • Authorization:发送请求时,添加的认证或者授权的信息。
  • Headers(10):自定义HTTP Header信息。
  • Body:设置Request body内容。
  • none:代码没有参数
  • form-data:
  • x-www-form-urlencoded是表单提交常用的格式。
  • raw是源码格式,也可以是JSON格式数据。
  • binary二进制形式的数据,可以上传文件,一般用于上传文件。
  • Pre-request Script:请求前执行的脚本(请求前置脚本)。
  • 例如每次请求之前需要生成的一些测试信息。
  • Tests:请求完成后执行的脚本(请求后置脚本),例如在收到response之后执行的断言测试。
  • Setting: 请求相关设置。
  • Cookies :Postman管理Cookie信息

请求页签

  1. form-data:
    就是http请求中的form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息;由于有boundary隔离,所以form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
    image-1653119450596
  2. x-www-form-urlencoded
    就是application/x-www-from-urlencoded,会将表单内的数据转换为键值对,当模拟表单上传数据时,用此选项,但当然此表单不能上传文件,只能是文本格式,要上传文件,使用上面的格式。
    总结一下两位重要格式的区别:
    multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;
    x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。
    image-1653119491029
  3. raw
    请求头:application/json 可以上传任意格式的文本,可以上传text、json、xml、html等,其实主要的还是传递json格式的数据,当后端要求json数据格式的时候,就要使用此种格式来。
    image-1653119542711
  4. binary
    请求头:Content-Type:application/octet-stream,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。

响应页签

image-1653120615378
Body:返回信息

  • Pretty(各种格式查看返回数据)
  • Raw(文本格式)
  • Preview(网页格式)

Cookie:响应Cookie
Headers:响应头信息
Test Results:测试结果

Postman接口的关联

获取接口统一鉴权码token

第一种方式:JSON提取器

  1. 使用Tests,取到接口返回的token数据
  2. 将token设置为全局变量。
  3. 在下一个接口调用变量{{token}}
//打印响应信息
console.log(responseBody);
//json 提取器,把返回的结果转换为json对象
var jsdata = JSON.parse(responseBody);
console.log(jsdata);
// 取值,并设置为全局变量
console.log(jsdata.data.token)
pm.globals.set("token", jsdata.data.token);

image-1653122619295
image-1653122649449
image-1653122673256

第二种方式:正则表达式提取器

//打印响应信息
console.log(responseBody);
//正则表达式提取器,match匹配,new RegExp():新建正则表达式
var data = responseBody.match(new RegExp('"token":"(.*?)"'));
// 取值,并设置为全局变量
pm.globals.set("token1", data[1]);

image-1653123841622
image-1653123756682
image-1653123800006

全局变量与环境变量

全局变量可以在所有的接口请求中使用,通过{{}}取值
作用:可以使用全局变量保存在所有接口都需要使用的变量

环境变量可以在当前环境下的所有请求中使用,通过{{}}取值
作用:可以保存多种环境,可以让接口在多种环境中测试
如测试环境、开发环境、生产环境、预发布环境
image-1653125212879
image-1653125260011
不管是环境变量也好还是Globals也好,都是全局变量。只不过环境变量只是用于环境,全局变量一般是用于用例。

postman内置动态参数

多接口关联时遇见传参数是动态的,这个时候给接口关联设置全局变量时就会用到动态参数了。

内置动态参数

{{$timestamp}} 生成当前时间的时间戳。(很多时候不用内置的)
{{$randomint}} 生成0-1000之间的随机数,可重复。(不常用)
{{$guid}} 生成速记GUID字符串

自定义动态参数

手动的获得时间戳,下图位置输入
image-1653132529392

var times=Date.now();
//设置全局变量
pm.globals.set('times',times);

接口业务的闭环

image-1653133516599
image-1653133564040

postman常规断言,动态参数断言,全局断言

常规断言

一般会有两个断言:
状态断言:断言返回的状态码
业务断言:断言核心业务的关键字
image-1653133865559
Status code:Code is 200 :断言返回的状态码为200(常用)
Response body :Contains string : 断言返回的body包含有一个字符串
Response body :JSON value check :检查json中的其中一个值
Response body :is equal a string: 断言返回的body 等于一个字符串
Response headers : 断言响应头包含Content -type
image-1653134546358

动态参数断言

自定义动态参数的断言方式
在texts页签中是不能通过{{}}方式去取得全局变量的,而只能通过以下方式获取

  • pm.globals.get[‘times’]
  • globals[‘times’]
  • globals.times
    第一步:在Pre-request Script中设置对应的变量(请求前的操作)
    image-1653135720699
    第二步:在请求体中用上对应的全局变量
    image-1653135735004
    第三步:动态参数断言
    image-1653135775672

全局断言

一般用于所有的结果都需要做的断言,比如状态断言
image-1653136611529

postman 批量执行参数用例

image-1653187138756
image-1653187919682
关于文件上传接口在批量运行时报错的解决方案:
改变设置把上传的文件复制到目录下C:\Users\12446\Postman\files
image-1653188593101

postman数据驱动方式:CSV或JSON文件

组织测试数据,测试名称、正例、反例

username,password,assert_str
,123456,参数错误
admin123,,参数错误
admin1234,123456,该用户没有权限登录
admin123,12345,密码错误
admin123,123456,登录成功


image-1653189316156
在具体要参数化的接口处也要进行变量的替换
image-1653189637111
断言处理

// 判断只有正常返回才提取token
if(responseBody.search('token')!=-1){

    //打印响应信息
    console.log(responseBody);
    //正则表达式提取器,match匹配,new RegExp():新建正则表达式
    var data = responseBody.match(new RegExp('"token":"(.*?)"'));
    // 取值,并设置为全局变量
    pm.globals.set("token1", data[1]);
}


pm.test("断言响应状态码为200", function () {
    pm.response.to.have.status(200);
});

// 从csv文件中提取变量值设置断言
// 获取csv文件中定义的变量
const errmsg = pm.variables.get("assert_str");
console.log(errmsg)

pm.test("断言是否登录成功", function () {
    pm.expect(pm.response.text()).to.include(errmsg);
});

image-1653196086547
断言的时候使用data.变量名也可以取csv中的变量值做断言。

pm.test("断言响应状态码为200", function () {
    pm.response.to.have.status(200);
});
pm.test("断言是否登录成功", function () {
    pm.expect(pm.response.text()).to.include(data.assert_str);
});

注意:注意:预览脚本时,有时候会显示乱码: 那么需要修改文件的编码格式为utf-8,修改方式可以通过nopad++、UE、或者记事本打开,然后另存为时修改格式:
如果是从json中导入文件,那么创建json文件,然后执行测试集的时候选择json文件即可,其他的方法都与csv文件使用方法相同。(注意,如果存在中文字符,文件格式必须修改为utf-8):

设置头域才能访问的接口参数

如:腾讯课堂评论接口
image-1653195532311
缺少headers
image-1653195593513
少什么hesders是根据接口文档定的
image-1653195616499
referer:限定网站来源
image-1653195642761

postman Cookie鉴权

做web测试的基本上都用用到 postman 去做一些接口测试,比如 测试接口的访问权限,对于某些接口用户A可以访问,用户B不能访问;比如 有时需要读取文件的数据 。在postman上要实现这样 做web测试的基本上都用用到postman去做一些接口测试,比如测试接口的访问权限,对于某些接口用户A可以访问,用户B不能访问;比如有时需要读取文件的数据。在postman上要实现这样测试,我们就必要要用到cookie请求。
postman操作cookie的两种方式

  1. 直接在头域中添加cooki头域,适用于已知请求时的cooki头域的情况
  2. 使用postman的cookie管理机制,既可以手动添加,同时postman也会将操作流程中获取的参数自动保存,因此可以通过调用前置接口来完成cookie的获取。

举例说明:购物车列表接口
GET 请求 :http://www.testingedu.com.cn:8000/index.php?m=Home&c=Cart&a=header_cart_list

直接请求不加Cookies
image-1653196990576

  1. 当cookie的值已知且能保存一段时间,可以使用方法1
    image-1653197154865
  2. 方法2使用postman的cookie管理】
    cookie管理会自动保存登录过后产生的cookie
    image-1653197677335
    修改添加一个sessionid
    image-1653197874409

postman 接口的Mock server服务器

作为测试工程师,在日常工作中遇到和三方对接的项目,三方开发进度不理想,导致无法进行联调测试,基于此,开始学习与了解mock服务
下面看下创建mock server的步骤。
创建 mock server
image-1653200817139
image-1653200927763
创建成功页面,复制mock url地址
image-1653200967028
查看创建的server
回到 Collections集合中,在Mocks下面,可以看到创建的server
image-1653201143090
image-1653201332687

Postman接口测试加密和解密实战

目前市面上的加密解密

  1. 对称式加密(私钥加密):DES,AES,BASE64加密算法
  2. 非对称加密(双钥加密):RSA加密算法
  3. 只加密不解密:MD5加密,SHA1、SHA3
  4. 多种加密方式的组合、

举例1:MD5加密

CryptoJS 及 Pre-request Script
CryptoJS 是一个使用 JavaScript 实现的加密算法库
它支持的算法包含:

  • Base64
  • MD5
  • SHA-1 和 SHA-256
  • AES
  • Rabbit
  • MARC4
  • HMAC、HMAC-MD5、HMAC-SHA1、HMAC-SHA256
  • PBKDF2

在 Postman 中有一个 Tab 「 Pre-request Script 」,它能在请求之前做一些预处理
比如,可以使用 CryptoJS 先对变量进行加密,然后设置到变量中,最后在真实请求时使用这个变量

假设现在有一个登录接口
请求方式为 POST,请求体中包含用户名 username、密码 password,并且 password 是通过 MD5 加密后设置到请求体内
image-1653310894680
如此,我们只需要在 Pre-request Script Tab 下,使用 CryptoJS 编写 JS 脚本,对密码变量进行预处理

# Pre-request Script 
var password = "hu123456";

//md5加密
//使用JS模块CryptoJS中的md5去加密数据
var password_encry = CryptoJS.MD5("hu123456").toString();
console.log("加密后的数据为:"+password_encry);

//设置到环境变量中
//方式一:全局变量
// pm.globals.set("password_encry", password_encry);

//方式二:局部变量
pm.environment.set("password_encry", password_encry);

预处理设置变量有 2 种方式:全局变量、局部变量

需要注意的是,如果设置到局部环境,我们需要先新建一个环境,并创建一个变量才能在 JS 脚本中引用
image-1653310990637
最后,在请求体中替换成上面设置的变量即可
image-1653311006307

举例2:RSA加密

使用「 forgeJS 」来进行 RSA 的加解密
解决方案:在pre-requests-script中,添加forge模块代码到全局变量中,提取的全局变量(字符串类型)通过eval函数使其在当前环境中执行,利用模块中提供的生成公钥对象和加密方法加密。
本次加密得到的产出物,设置到全局变量中:

  • token前50位+时间戳 ,加密后得到的sign
  • 时间戳timestamp
  1. 下载forge(使用gitbash)
    git clone https://github.com/digitalbazaar/forge.git
    image-1653311174165
  2. 安装forge(使用nmp)
cd 到你gitbash下载的位置
npm install

注意事项:这步我没有报错,如果有报错信息请看一下是否有下载node
3. 在需要鉴权的接口请求的pre-request-script中设置
前提:token在登录接口中已经设置到全局变量中了
注意事项:这里的公钥是需要项目开发提供(本文的公钥已做了脱敏处理)

if(!pm.globals.has("forgeJS")){
    pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", function (err, res) {
        if (err) {
            console.log("hellworld")
            console.log(err);
            
        } else {
            pm.globals.set("forgeJS", res.text());
        }
    })
}
eval(postman.getGlobalVariable("forgeJS"));
pm.globals.unset("variable_key");
pm.globals.set("variable_key", "variable_value");
 
 
// 这里的公钥需要项目开发者提供(pem文件公钥)
const public_key = '-----BEGIN PUBLIC KEY-----\n' +
        'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQ5ENTu9Z1LprzedE\n' +
        'O3F7gs+7bzrgPsMl29LX8UoPYvIG8C604CprBQ4FkfnJp0WZyLq6sBr\n' +
        'tuPorOc42+gLnFfyhJAwdZB6SqWfDg7bW+jNe5K555555lEMGo8Dg+S\n' +
        'kKlZFc8Br7SHtbL2tQIDAQAB\n' +
        '-----END PUBLIC KEY-----'
 
var publicKey = forge.pki.publicKeyFromPem(public_key);//公钥
var timestamp = Math.round(new Date().getTime()/1000);//时间戳
var token = pm.environment.get("token")
var tempStr = token.substring(0,50)+timestamp //拼接的token+时间戳
 
//rsa加密得到签名
var sign = forge.util.encode64(publicKey.encrypt(tempStr,'RSAES-PKCS1-V1_5',{md:forge.md.sha1.create(),mgf: forge.mgf.mgf1.create(forge.md.sha1.create())}));
 
//将得到的产物设置到全局变量中
pm.environment.set("timestamp",timestamp)
pm.environment.set("sign",sign)