Published on

Postman全功能指南:从接口调试到自动化测试实战

Authors
  • avatar
    Name
    Liant
    Twitter

Postman介绍

官网地址:https://www.getpostman.com/
官方文档地址: https://www.getpostman.com/docs/
问题反馈官方地址:https://go.pstmn.io/app-issues
官方git地址:https://github.com/postmanlabs
官方实例学习:http://blog.getpostman.com/case-studies/
官方blog: http://blog.getpostman.com/
官方下载地址:https://www.getpostman.com/apps

版本分别有:

chrome插件版本
mac版本
linux版本(32/64)
windows客户端版本(32/64)
newman: https://www.npmjs.com/package/newman,本说明不涉及newman。

介绍:

很好用的一款API/接口功能测试工具,很方便的塞数据,查看响应,设置检查点/断言,能进行一定程度上的自动化测试,但是不要指望它能代替你进行性能测试,一次批量执行太多太久的话容易崩溃掉。 有免费版、pro版、企业版三个版本。个人学习及日常工作免费版完全够用。 本系列介绍中,如无特殊说明,均以postman chrome插件版为例。

注: POSTMAN里的各种语法是基于JS的,很容易上手;推荐学习网址: https://www.runoob.com/js/js-tutorial.html

Postman安装

Chrom版本

方法1.Chrom应用商店直接安装,需要科学上网。 方法2.搜索下载postman 的crx扩展文件,把crx后缀修改成rar或者zip,然后解压,修改解压目录下的”_metadata”文件夹名为” metadata”,然后打开chrom扩展页面chrome://extensions/,打开开发者模式,加载已解压的扩展,把刚刚解压后的扩展加载进去。 点击详细信息,在桌面创建快捷方式。 此种方法安装的postman可正常使用,但不能配合Postman Interceptor抓包使用,应该是谷歌商店不认此种方法安装的原因。

客户端版本

Postman官网,下载客户端版本,直接默认安装。安装完之后会在桌面创建一个快捷方式。 客户端版本与chrom版本不冲突,可以同时安装。客户端版本比chromapp版本多了编辑及调试功能,但是不支持请求URL中包含中文,需要encode一下才能使用。日常chrom版本够用。

IOS版本appstore里搜索安装。
linux版本未使用过,暂不介绍,欢迎补充。

注:postman官网可直接访问,不需要科学上网。

Postman Sendbox界面介绍

安装后首次打开postman,会提示你是否需要登录,登录的话可以云端保存你的收藏及历史记录,不登陆不影响使用。

进入后就是如下图所示的界面了。

img/1.png

我把postman主界面大概分为图示中的三个大黄框,代表不同的功能区域

左边:

请求历史栏

点击该处可看到所有使用postman发出的请求记录,在配合postmaninterceptor进行抓包时,抓取的请求记录也在该处显示。点击clear all可清除所有记录。

img/2.png
收藏夹

就是保存所有请求的地方。点击带+号那个图标 可创建新的文件夹,方便归类

用例文件夹

如图所示。需要注意的是大文件夹下还可以再创建一级子文件夹。如下图所示:

img/3.png
图中几个菜单的意思分别是:
1重命名
2编辑
3新建子文件夹
4复制一个当前文件夹
5导出当前文件夹下所有用例
6监控当前文件夹(免费版不可用)
7mock当前文件夹用例(免费版不可用)
8发布当前文件夹下接口用例文档
9删除
最上边那个 ShareCollection是分享当前文件夹下所有用例,Pro版才可用的,免费版的就老老实实的导入导出使用吧。本文最开始中的那个大图左上角 左数第三个按钮 Import,就是导入(这只是一种导入方法,还有一种在设置里全局导入,等下说)。 img/4.png

其他的按钮,用到了再说。

右上

标签栏

可以看待你当前执行的是那个接口用例

接口请求方法

目前支持: 15种请求方式,实际应用中常用到 GET、POST、PUT、DELETE这4中请求方法

img/5.png
接口请求URL

请求url,需要注意的是GET请求的参数是直接跟在URL后边的。

认证

某些接口需要认证。

img/6.png
报文头

请求报文头。 报文头有三列,Key是报文头参数列,Value是报文头参数值列,description是说明列

img/7.png

右侧的Presets是可以预先设置几组报文头,拼装报文的时候可以直接选中使用。Bulk Edit是文本编辑报文头。

报文体

请求报文体,GET请求下不可用。有四种报文体类型。

img/8.png

其中form-data和x-www-form-urlencoded两种类型是key-value格式的报文。Raw里可以自由选择报文格式,binary是自由选择文件作为报文体。

img/9.png
预处理脚本

预处理脚本,你可以理解为这里是在你接口请求之前执行代码的地方,支持JS语言。举例说明: 请求参数中有个参数time,参数值格式为YYYYMMDD24HHMMSS格式,每次请求时该time参数为当前时间,我们可以在预处理脚本这里直接生成一个当前时间,然后传给postman座位环境变量,在请求参数中引用这个变量,就可以了。如下图,上边是生成当前时间time,最后一句是把time存到环境变量里,这环境变量叫做Time。

img/10.png 接下来,我们在请求报文里(报问题、报文头都行)引入这个环境变量Time,如下图。如果环境变量中暂时没有Time这个变量,{{Time}}会是红色的。
img/11.png

如果环境变量中该变量已经有值,鼠标放上去,就会显示当前值。

img/12.png

这里只是简单的说了一种使用方法,更多功能,还请自行摸索

断言/检查点

有各种叫法,但是意思是一样的,可以理解为检查报文内容的地方, 支持JS语言。比如要判断响应报文中某个参数值等不等于预期值,就是在这里写代码。

Postman自带的接口用例中有示范如何使用,请自行摸索,多上网搜索,多练习,很快就会熟起来的。

img/13.png

下图是响应,上图中检验的就是这个res是不是等于0:

img/14.png
环境变量集

Postman中可以预先设置几组环境变量,使用的时候直接选择就行,比如测试、灰度、生产这三个环境的地址和请求里的参数值不一样,我们就可以把地址和参数值参数化,设置三个环境变量集,三个环境变量对应测试环境,生产环境,灰度环境。非常方便

设置环境变量

设置环境变量

发送请求

发送请求

保存

保存此时的请求报文信息

源代码

这是一个很有意思的地方,这里可以方便的把你的请求报文转换成各种程序语言,例如:

img/15.png

直接点击copy就能去代码中粘贴了。

右下

响应报文体

响应报文体、返回cookies、返回报文头、断言/检查点执行结果这四个是响应内容选择标签,点击就能看到对应内容

返回cookies

如果有,就返回。

返回报文头

如下图所示:

img/16.png
断言/检查点执行结果

12中的断言、检查点执行结果展示区域,如下图所示:

img/17.png
报文体展示方式

下图示例相同报文三种展示方式,一般使用pretty。

img/18.png
img/19.png
img/20.png
报文体展示类型

仅在Pretty模式下可用

img/21.png

该图标推测为自动换行图标~

报文体正文
httpstatus响应码及耗时
img/22.png Http status及请求耗时,客户端版本的postman这里还会多出一个响应报文大小。
img/23.png

为复制图标,点击就复制响应报文体至剪切板,

img/24.png

为搜索图标,可以在响应报文中搜索制定内容。

Runner 介绍

概述

Runner是用来批量调用collection里某个文件夹里的全部接口的。 (注意,是文件夹内所有接口,可以是一级文件夹,也可是二级文件夹) 示意图 在Sendbox界面里左上角打开runner,runner界面如图所示

img/25.png

说明

历史记录

历史执行记录

导入
导入别人或之前导出的runner结果以方便查看。 img/26.png
当前执行
执行详情

点击这个会跳到历史记录

选择用例集合

选择需要执行的用例集合

环境变量

选择执行时需要使用的环境变量

迭代次数

输入需要执行的次数 注意:在使用csv文件进行参数化时,最好有多少组数据,这里就填多少。

延时/间隔

每个请求之间的间隔

参数文件

在批量执行时,如果遇到想参数化的情况,在此处配置。举例: 一个登录请求为:http://127.0.0.1:80/login,请求方式为post,请求data为:

{
"account": "zhangsan",
"pwd": "123"
}

其中account和pwd分别是帐号、密码,在实际中,有一大批帐号需要登录,这时可以利用runner的参数化来解决。在本例中,需要把account和pwd的值参数化,首先在请求时先定义这两个值为分别变量{{user}}{{密码}}如下:

{
"account": "{{user}}",
"pwd": "{{mima}}"
}

然后创建一个csv格式的文件,文件首行为两个变量名,其余各行值,如下图所示:

img/27.png

然后选中这个csv文件

img/28.png

点击preview,可以看到参数信息

img/29.png

然后就可以开始了。

监控

Pro收费版本才有的功能,本文不作介绍

newman

本教程不做介绍

doc文档

Runner的相关官方英文文档。

当前结果

会显示tests的执行结果

开始按钮

常用操作说明

环境变量

环境变量就是我们存放一组公共数据的地方,比如我有100个接口,三套环境(开发环境、测试环境、生产环境),我们没有必要把这100个接口根据三个环境分别写一套用例。只需要维护一套用例脚本,然后设置对应三个环境的变量就行了。 如下图所示:

img/30.png
img/31.png

这样对比应该能看出,我们在请求接口的时候,只需要把请求地址用参数 {{这里是地址}} 替换掉就行了。在测试的时候,测哪个环境就切换到哪个环境的环境变量组。 下图是我的请求:

img/32.png

另外,在postman的脚本里,还可以用postman.setEnvironmentVariable("key",value); 来直接设置环境变量,下面就会说到。 Pre-request Script 顾名思义,这是一个在请求前执行脚本的地方。 举例说明: 还是刚刚那个接口,请求时需要带上YYYYMMDD格式的当天日期作为参数值。那么我们就可以在这里用JS语法生成一个当前时间nowtime,然后把这个nowtime用上边说道的postman.setEnvironmentVariable(key,value)设置为环境变量NOWTIME,在请求的时候,在引用这个变量NOWTIME就行了。 如下图所示是我的测试接口

img/33.png
常用语法
    //获取一个环境变量
    pm.environment.get("variable_key");
    
    //获取一个全局变量
    pm.globals.get("variable_key");
    
    //获取一个普通变量
    pm.variables.get("variable_key");
    
    //设置一个环境变量
    pm.environment.set("variable_key", "variable_value");
    
    //设置一个全局变量
    pm.globals.set("variable_key", "variable_value");
    
    //清空一个环境变量
    pm.environment.unset("variable_key");
    
    //清空一个全局变量
    pm.globals.unset("variable_key");
    
    //发送一个请求
    pm.sendRequest("https://postman-echo.com/get", function (err, response) {
        if(err){
            console.log(err);
        }else{
             console.log(response.json());
        }
    });
    
    /*pm.globals*/ 
    //检测全局变量是否包含某个变量---返回布尔值
    pm.globals.has(variableName:String)
    
    //获取全局变量中的某个值
    pm.globals.get(variableName:String)
    
    //为某个全局变量设置值
    pm.globals.set(variableName:String, variableValue:String)
    
    //销毁某个全局变量
    pm.globals.unset(variableName:String)
    
    //清除全局变量
    pm.globals.clear()
    
    //将全局变量以一个对象的方式全部输出
    pm.globals.toObject():function → Object
其他语法

    //获取请求body某个字段值
    request.data["key"]=="value"
    
    //获取请求headers某个字段值
    request.headers["key"]=="value"
    
    //获取请求方法
    request.method
    
    //获取请求地址
    request.url
    
    //获取get请求的参数
    request.url.query.members
    
    
    //将请求参数转化为json对象
    —--post:JSON.parse(request.data)
    —--get:JSON.parse(request.url.query.members)
    
    //将字符串进行shal加密
    CryptoJS.SHA1(“string”)
    
    //将字符串进行md5加密
    CryptoJS.MD5(“string”)
    Tests

常用语法

设置环境变量

pm.environment.get("key", "value");

设置全局变量

pm.globals.set("variable_key", "variable_value");

断言

    pm.test("响应状态码为200", function () {
        pm.response.to.have.status(200);
    });
     
    pm.test("响应数据中包含json_key1", function () {
        pm.expect(pm.response.text()).to.include("json_key1");
    });
     
    pm.test("响应中的url值正确", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData.url).to.eql("http://10.0.6.2/post");
    });
     
    pm.test("Body is correct", function () {
        pm.response.to.have.body("response_body_string");
    });
     
    pm.test("响应头信息中包含Content-Type", function () {
        pm.response.to.have.header("Content-Type");
    });
     
    pm.test("响应时间小于300ms", function () {
        pm.expect(pm.response.responseTime).to.be.below(300);
    });
    pm.test("Status code name has string", function () {
        pm.response.to.have.status("Created");
    });

其他语法

//获取响应Cookies
responseCookies

//获取响应body
responseBody

//将响应体转化为json对象
JSON.parse(responseBody.data)

//将响应体转化为json字符串
JSON.stringify (responseBody.data)

关联


    以OA登录为例:
    先请求接口获取登录code,再用code值去请求token接口,以获取token
    1、通过接口获取code
    (1)、接口如下
    curl --location --request POST 'http://api-oa.test.com/api/user/auth-code' \
    --header 'X-Client-Id: oa' \
    --header 'X-Timestamp: 1651050337' \
    --header 'X-Random: 6417' \
    --header 'Content-Type: application/json' \
    --header 'X-Signature: 9f448334198d0db1f42c72846528a994' \
    --header 'Cookie: API_SESSID=vo17i0ifhlodmln5hk6cc9uv4n; _csrf_api=435b921e89ea007573acdb6e3d07a9f62d18dcbbc364507a975101159528c2b4a%3A2%3A%7Bi%3A0%3Bs%3A9%3A%22_csrf_api%22%3Bi%3A1%3Bs%3A32%3A%22xVHmwETTMKww5tKKVqLM0P2RAu0DWWCE%22%3B%7D' \
    --data-raw '{
        "number": "10084"
    }'
    
    (2)、Pre-request Script代码
    var time = Math.round(new Date()/1000);
    var str_ranmod = Math.ceil(Math.random() * 10000);
    var sign_str="oa" + "_q0LEyk5D8RxJX4O_fOh8tIahXjq2pt4" + time.toString()+str_ranmod.toString();
    var sign_md5 = CryptoJS.MD5(sign_str).toString()//.toUpperCase();
    
    pm.environment.set("sign_md5",sign_md5);
    pm.environment.set("time",time);
    pm.environment.set("str_ranmod",str_ranmod);
    
    (3)、tests代码如下
    var body=JSON.parse(responseBody);
    console.log(body);
    var code = body.data.code;
    var client_id = body.data.oauth_client.client_id;
    var redirect_uri = body.data.oauth_client.redirect_uri;
    console.log(code)
    pm.environment.set("code",code);
    pm.environment.set("client_id",client_id);
    pm.environment.set("redirect_uri",redirect_uri);
    
    2、通过接口获取access_token,请求参数中需要带上code
    
    (1)、接口如下
    curl --location --request POST 'http://oauth-oa.test.com/token' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "grant_type": "authorization_code",
        "code": "1ee94e2941c12159ede6d6e371bc8dbd63885570",
        "client_id": "oa",
        "client_secret": "_q0LEyk5D8RxJX4O_fOh8tIahXjq2pt4",
        "redirect_uri": "http://oa.test.com/login/"
    }'
    
    (2)、tests代码如下
    var body=JSON.parse(responseBody);
    console.log(body);
    var access_token = body.access_token;
    var token_type = body.token_type;
    var Authorization = token_type +  " "  + access_token
    console.log(Authorization);
    pm.environment.set("Authorization",Authorization);