> 技术文档 > Postman使用

Postman使用

目录

前言

一、安装

二、Postman的使用

2.1欢迎来到Postman!

2.2升级打怪前看看我们能干什么

2.3我独自升级!

2.3.1迈出第一步吧!

2.3.2发送第一个请求吧!

2.3.2.1向bilibili首页发送一个获取请求        

2.3.2.2请求方法

2.3.3响应分析——断言

2.3.3.1示例——断言状态码

2.3.3.2如何编写断言?

2.3.3.2.1脚本的作用时间        

2.3.3.2.2响应处理脚本的编写

a.断言多个状态码

b.响应正文判断

c.响应头断言

d.响应时间断言

2.3.4Postman控制台 

 2.3.5集合测试接口管理

2.4Postman参数化

2.4.1创建一个环境变量

2.4.2如何使用环境变量

2.5文档参数化

2.5.1如何在文档中编写测试数据        

 2.5.2如何使用文档化的测试数据

三、生成测试报告

3.1安装软件

a.安装NodeJs        

b.安装Newman

c.安装HTML报告生成器

3.2使用Newman


前言

在【测试分类】一文中讲解了测试的常见分类方法,本文就来讲解“接口测试”的常用工具Postman。不过在阅读本文前,你最好先了解一下与HTTP协议有关的知识,包括但不限于HTTP的请求方法、Cookie与Session、请求格式、响应格式等。


一、安装

        Postman的安装相当简单,你只需要访问Postman的官网,找到下载页面点击下载即可。    【Postman官网】

图1        官网下载Postman

        下载完成后,你会发现一个引导安装程序,点击运行后根据引导完成安装即可。安装完之后Postman会要求你注册一个账号,根据指引创建一个账号之后我们就可以使用Postman啦!

二、Postman的使用

2.1欢迎来到Postman!

        在开始介绍如何使用Postman之前,我们先看看运行Postman之后的窗口是什么样子的吧!

图2        逛逛“新手村吧”
图3        开始之前选择你的“阵营”

2.2升级打怪前看看我们能干什么

图4        查看一下你的“装备”

2.3我独自升级!

2.3.1迈出第一步吧!

        点击“侧边栏”中的“Collections”,呼唤出你测试计划的目录结构吧。

图5        唤出测试计划目录结构
图6        尝试着创建一个测试请求吧!

2.3.2发送第一个请求吧!

2.3.2.1向bilibili首页发送一个获取请求        

        我想你应该知道Bilibili吧,就是那个被称为B站的视频网站,我们试着请求一下它的首页。

图7        发送你的第一个请求

        想在你成功发送了一个请求,怎么样是不是没有什么难度,接下来我们来分别看一看我们发送的请求部分与相应部分。对于发送请求部分,我们需要将请求网页的URL设置进对应的区域中,然后点击一下“Send”按钮就将请求发送出去了,在这个例子中请求部分没有太多需要关注的点;让我们把视角放到响应报文上,对于一个响应很显然,我们最先要关心的就是响应状态码,可以看到响应状态码为200,这是一个正确响应的标志,此外我们可以查看“响应耗时”、“响应消耗流量”等信息。此外,我们可以看到响应体中已经返回了一个HTML网页了,此外响应报文中还携带了Cookie信息与其它的响应头信息。

(如果你想了解Cookie与Session,可以去看看我的这篇文章【Cookie与Session】)

图8        对比Postman和浏览器中的Cookie信息

        那么这里简单介绍一下Cookie和Session,由于HTTP协议是无法鉴别用户的身份的,所以如果你想要服务器能辨别用户,你就需要每一次请求都携带你的身份信息(账号/密码),但是如果每一次【请求】都让用户手动输入,这会给用户带来极差的体验,所以就有了Cookie这套机制,这套机制下,当我们首次进行登录后,浏览器就会将我们的账密信息缓存进Cookie中。但是如果将账号、密码明文存放在你的浏览器中,那么当你的电脑被入侵时,黑客可以轻而易举的将你的身份信息盗走,进而给你造成损失。所以有人想出了另一套机制——在用户第一次登录的时候携带你的账密信息,服务端结合该信息生成一个可以代表你身份的ID,也叫Session ID,然后将Session ID虽响应返回给你的浏览器,这时你的浏览器的Cookie就不保存账密信息了,而是保存浏览器返回的这个Session ID。下次浏览器在发送请求时,就会自动填充Session ID进Cookie来帮助服务器验明身份。这一整套机制就叫做Session。

        回到我们的图8,既然是验明身份,那么为什么我们的Postman和浏览器中缓存的Cookie信息是不同的呢?这其实还是Session在发力。很显然对于B站这种视频网站是允许多端同时访问的,这就意味着我们的服务器会给登录同一个账号的平台发送不同的数据。那么在客户端我们虽然是一个人,但是在服务端我们要如何分辨不同的平台呢,如果只有一个Session ID显然是不够的,所以在服务端同一账号的多端登录平台都会给分配一个Session ID,(对于一些浏览器来说,为了保密性是不允许你查看该信息的)这也就解释了为什么图8中的现象。

        说句题外话,对于有一些特殊平台是不允许我们多端登录的,比如一些银行APP,这个时候如果我们多端登录是使用同一个Session ID还是不同Session ID呢?

        答案还是不同Session ID,一般来说,每有一个新的客户端连接请求到来,验明身份后服务端都会生成一个新的Session ID,而后先让旧的Session ID失效,在让新的Session ID与你的账号信息建立映射,这样你只能通过最新的Session ID来进行服务的获取。

        点到为止,因为上面说的东西与本文的关联并不大,我们还是回到我们的正题上。

        那么现在你完成了第一次请求的发送!

2.3.2.2请求方法

        还记得在图6中标记出来的请求方法吗?

图9        Postman中支持的请求方法

        这里我们不对所有的方法进行介绍,因为大多数情况下,服务端只受理GET、POST请求方法。这时因为服务器在设计时,会尽可能减少接口暴漏风险,使用尽可能少的接口来完成服务器的功能,一方面这样服务器对恶意工具的防范也就更轻松,另一方面对于客户端的常见操作,都可以使用PUT、POST、GET方法进行覆盖,所以也就没有必要增加更多的接口。

  • GET:根据RFC规范,该请求方法通常是用来获取服务器资源的,如果存在请求参数,请求参数需要设置在请求URL中。
  • POST:根据RFC规范,该请求方法通常新网更改服务器上的数据,如果存在请求参数,请求参数需要设置在请求体中。

但是实际上,POST方法请求时URL也可以带上请求参数,服务端也能够识别。

2.3.3响应分析——断言

        我们发送响应的目的当然不是单纯想看看它的响应报文这么简单,我们肯定是希望判定这个报文中的一些字段是不是符合预期值。比如说,我问你你中午吃了吗?你回答到:“今天天气真好!”,虽然你回答了,但是你回答的驴唇不对马嘴,这也是不行的,所以我们要对响应返回的内容进行判定。        

        对于我们的响应来说,正常情况下,我们肯定是希望返回的状态码是“2xx”形式的,因为这代表我们的请求是无误的,可被正确处理的,如果我们发送了一个预期值是正常状态的请求,那么我们就应该对请求响应的状态值进行判断,如果预期值与实际值相同,那么我们就认为在该测试请求下,该功能可以正常表现。反之,则不能证明该功能正常表现,这个时候就可以让开发愉快的加班了(【手动狗头保命】)。

        断言就是我们响应分析的一把“利剑”,我们来看看“断言”在响应分析的表现!

        需要注意的是,Postman中对内容的每一次修改之后,都要使用Ctrl+s来保存修改,以让修改生效。

2.3.3.1示例——断言状态码

      我们先来看一个判断响应状态码的实例,如图10所示。在该例子中,我们对Bilibibli网站发送测试请求,请求返回后我们编写script脚本来进行自动化判断!

为什么要自动化判断?

本例中,测试的请求只有一个比较少,如果使用肉眼来进行查看似乎也不是一个什么难事,但是如果有成千上万个测试请求发出呢?难道也需要我们一个一个个来进行检查吗?显然这样是一个有挑战的事,这还只是检查一个状态码,如果让你检查响应包体的内容是否正确那你不炸了。【手动狗头】

图10        编写第一个断言并查看

        既然讲解了脚本编写了,那么我们就来看看脚本编写的规则。当然,再怎么讲解也不如官方文档给的全面,这里大家也可以去官方文档中查找你想了解的内容。【Postman脚本编写手册】

2.3.3.2如何编写断言?
2.3.3.2.1脚本的作用时间        

        Postman中的断言可以通过Script(脚本)来进行控制,那么想了解如何编写断言我们就要先了解如何编写script脚本,在图10中所示,要编写脚本我们需要先切换到script选项下,在脚本编写框左侧存在两个选项“pre-request script ”、“post-response script ”,这两个选项影响的是脚本的作用时间。pre-request script作用在请求发送之前post-response script作用在请求发送之后,在官方文档中,给出了一个执行顺序的示例图。

图11        脚本作用时机

        我们不仅可以对请求编写脚本,我们也可以对收录请求的目录和收录目录的Collections进行脚本的编写,这些脚本的作用时间如图12。 

图12        目录结构脚本的作用时机

        这里我们先跳过请求脚本的编写,我们先来看看响应脚本的编写。

2.3.3.2.2响应处理脚本的编写

        其实代码的编写还是较为简单的,因为代码可以不需要我们人来编写,Postman中存在一些预设的代码,我们可以点击Snippets进行查看

图13        使用postman预设代码

        当然,由于这些代码是被预设的,当场景比较复杂的时候,可能并没有能够满足我们要求的预设代码,这个时候如果你还不想写,你可以试试Postman官方提供的辅助AI——Postbot来帮助你完成代码的编写,不过这里就不进行演示了。接下来我们尝试写一下常见的断言。

a.断言多个状态码

        正确响应的状态码,通常不止一个,比如说我们的200、204、206都可以表示正确响应,这个时候如果我们想用一个断言语句来囊括这三种正确的响应状态码应该怎么办呢?

pm.test(\"Status code is 200\", function () { pm.expect(pm.response.code).to.be.oneOf([200,204,206]);});//解释://pm.response.code 响应中的状态码//oneof([200,204,206]) 预设的结果值
图14        断言多个状态码示例运行结果
b.响应正文判断

内容查找正文判断

        当我们查找返回的响应中有没有相关的字段的时候,就可以使用这个方式,有点像我们ctrl+f查找内容一样,如果在返回的响应中包含查找值,则返回正确,否则返回错误。该实例运行后可以正常通过。

pm.test(\"response include 哔哩哔哩\",function(){ pm.expect(pm.response.text()).to.be.include(\"哔哩哔哩\"); pm.expect(pm.response.text()).to.be.includes(\"bilibili\",\"哔哩哔哩\",\"二次元\");})//解释://pm.response.text()以文本形式获取响应体//使用include()选项用来检测是否存在单个字符串,includes()可以用来查找多个目标字符串。
图15        断言正文包含示例运行结果

大正文比较正文判断        

        我们也可以用来判断响应体的内容是不是于预期值相同。这里由于bilibili的返回值相当大,这里就不将对应的内容拷贝的这里进行比较了,所以如果你运行这个示例,那么结果一定是失败的。

pm.test(\"Body is correct\", function () { pm.response.to.have.body(\"response_body_string\");});//解释://pm.response.to.have.body 以文本形式获取响应包体中的所有内容。//\"response_body_string\" 这是我们设置的预期值,即我们希望响应包体中的内容与该值完全相同。
图16        断言包体相同示例运行结果

         关于文件过大时,我们无法通过拷贝内容来进行全文比对,其实也有解决方案,我们可以为文件生成一个md5值(你只需要知道,如果md5值相同那么,文件的内容一定相同),然后我们去比对目标网页的md5值是否相同即可。我们使用请求测试能否返回正确的网页时,我们需要先进行一次md5运算将我们预取网页的md5值计算出来,然后请求网页将请求网页的md5计算出来,理论上这两个值应该相同,也就会通过。

pm.test(\"Response hash matches\", function() { // 1. 引入加密库 const CryptoJS = require(\"crypto-js\"); // 2. 计算响应内容的MD5哈希值 const responseHash = CryptoJS.MD5(pm.response.text()).toString(); //3. 提前计算出预期网页的hash值 const expect_hash = \"5fc155ec69d2f809f648d6e27d37aac7\"; //4.将预期哈希值与计算得到的hash值作比较 pm.expect(responseHash).to.equal(expect_hash);});
图17        断言包体相同示例玉兴结果。

        需要注意的是,小伙伴们在进行验证的时候要选择一个静态网页来进行验证,因为动态网页的内容是一直在变化的,对于动态网页我们的这种正文校验方式就不太适合了。静态网页就是那种新闻类的网页,这种网页一般发出后就不会进行修改了,所以也就非常适合我们来进行校验。

对某个字段的值进行判断

        实际上我们的网页是有一个一个元素构成的,有些时候我们需要确定某个元素内的值是否符合预期,这个时候就需要我们来对这个字段的值来进行判断了。你也许会问:“这一点不是在响应状态码那一部分提到了吗,怎么又提一边?是不是在水文章?”。当然不是啦,这是因为状态码在每一个响应报文中都存在,无论响应的正确与否,所以Postman就将获取报文的响应状态码的获取做了简化,来帮助我们快速访问,但是我们响应中的一些自定义字段是否存在是无法确定的,这就导致了Postman没有办法帮我们完成上述过程,所以需要我们自己手动完成该功能。

        这里还要说明的一点是对某个字段进行处理这个工作与响应返回的包体格式有关系,如果返回的包体格式为Json格式,也是我们使用该方法检查字段值最多的格式,我们可以根据规则很轻松的获取信息。

//这是一个示例的Json包体返回{ \"status\": \"success\", // 验证字段1:顶级字段 \"user\": {  // 验证字段2:嵌套对象 \"id\": 123, \"name\": \"John Doe\", \"role\": \"admin\" // 嵌套字段\"role\" }, \"items\": [  // 验证字段3:数组 { \"id\": 1, \"name\": \"Item A\" }, { \"id\": 2, \"name\": \"Item B\" }, { \"id\": 3, \"name\": \"Item C\" } ], \"meta\": { \"total\": 10, \"page\": 1 }}
// 验证status字段为\"success\"pm.test(\"Status is success\", function() { const jsonData = pm.response.json(); pm.expect(jsonData.status).to.equal(\"success\");});// 验证嵌套字段pm.test(\"User role is admin\", function() { const jsonData = pm.response.json(); pm.expect(jsonData.user.role).to.equal(\"admin\");});// 验证数组长度pm.test(\"Items count is 3\", function() { const jsonData = pm.response.json(); pm.expect(jsonData.items.length).to.equal(3);});

        但是,博主没有找到能够返回Json格式数据的网站,所以这里就没有Postman对Json格式的响应包体做断言的实际效果演示了。

        实际上除了Json格式还存在HTML格式、XML格式的响应包体,这也是最常见的响应包体。但是,Postman本身优势在于接口测试,处理HTML格式的响应包显然不是一个预料之内的事情。所以我们通常使用其它的软件来对网页进行测试,比如Selenium而不是Postman。所以这里我们就不赘述了,这与本文的主要内容相关性不高。(不过如果你对Selenium的使用比较感兴趣,可以看一下我的这篇文章,【Selenium自动化测试工具常见函数】)

c.响应头断言

        在上一小节中,我们讲解了有关响应正文的处理,这一小节,我们来讲解如何对响应头中的值做断言。

pm.test(\"response header test\", function() { pm.response.to.have.header(\"Content-Type\");});//解释://pm.response.to.have.header: 获取响应头//\"Content-Type\": 期望字段//这条测试语句的意思是在响应头中查看是否存在\"Content-Type\"字段
图18        响应头断言示例
d.响应时间断言

        最后,我们在讲解一下响应时间断言,出于一些效率上的考虑,在特定的网络环境下,一般网页的响应需要在一定的时间内进行返回,如果超出了时间没有返回,或者超出预期时间较久之后返回,就需要我们对服务是否正常进行检查。

        我这里请求的网页动态资源比较多,所以耗时相对久一点,大家在测试的时候,可以根据自己的网络状况和网页资源量进行调整。

pm.test(\"response time test\", function() { pm.expect(pm.response.responseTime).to.below(3000);});//解释://pm.response.responseTime 响应返回时间//pm.expect(pm.response.responseTime).to.below(3000); 期望响应时间小于3000ms
图19        响应时间断言

2.3.4Postman控制台 

        我们不仅可以使用断言来自动判断某些字段的值是否正确,我们还可以通过控制台打印更详细的信息以供我们修改测试任务。

图20        控制台打印响应时间

 2.3.5集合测试接口管理

        所谓集合测试就是指一次执行多个测试请求,我们可以直接运行某个目录或Collection的所有测试请求。

图21        创建一个Runner
图21        Runner的详细配置
图22        Runner运行后的效果

2.4Postman参数化

        在测试工作中,有可能某些内容,我们在多个测试请求中都有所使用,甚至有的测试请求中有大量较长的重复部分,这个时候就会特别影响我们人去观察,我们可以将这些重复的部分提取出来以一个变量来存储它。在Postman中,这种变量叫做“环境变量”。

2.4.1创建一个环境变量

图23        创建一个环境变量
图24        创建一个环境变量

        需要说明的是,环境变量的初始值和当前值是有可能不同的,当这两个值不同的时候,以当前值为准。此外,为什么这两个值会不同呢?这是因为我们可以通过代码来修改当前值,初始状态下当前值和初始值相同,但是后面,代码获取数据后,根据逻辑功能可能会对当前值做出校正。校正后的当前值才是正确的值。

2.4.2如何使用环境变量

        在非脚本部分使用环境变量需要遵循如图25的格式,需要使用两个花括号括起来,然后在括号的中间写上你的环境变量名,此外,如果想在脚本中使用你的环境变量,你必须按照图25所示的那样获取到环境变量——\"pm.environment\",然后对环境变量进行删、改、查操作。

图25        使用环境变量
图26        使用脚本设置、清空环境变量

        注意,这里的清空环境变量(clear方法),指的是删除这个环境变量。

        此外,Postman中还内置了一些变量:

  • {{$guid}} //生成GUID
  • {{$timestamp}} //当前时间戳
  • {{$randomInt}} //0-1000的随机整数
图27        使用Postman内置变量

2.5文档参数化

2.5.1如何在文档中编写测试数据        

        这一部分主要想告诉大家,我们可以使用文档来请求字段中的值,进而到达为测试请求赋值的效果。想要使用文档设置,我们首先需要选择一个合适的文件,通常是选择文本文件或者CSV文件,这两个文件中的内容有严格的格式要求,所以不要胡乱的设置分隔符。这里我还是比较建议大家使用CSV文件来进行数据的输入的,因为我们可以使用Windows自带的Excel软件来进行值的填写,Excel不仅可以更加格式化的填写值,其还存在其一些内嵌函数,绝对是不二之选,但是这里还是给大家贴一张图来说明:如果使用文本,应该以何种格式来进行编写。

图28        txt文本如何编写测试输入值
图29        Excel如何编写测试输入值

        需要注意的是:Postman并不支持Excel的默认存储格式,你需要将其另存为.csv文件,并且要以“逗号”作为CSV文件的分隔符,然后才能被Postman选中,

 2.5.2如何使用文档化的测试数据

        这就要聚焦到我们的Runner上了,在Runner中我们就可以选择我们编写好的测试文本了,

图30        设置测试文档
图31        查看测试结果

2.6请求前脚本

        关于这一部分,你已经完全可以自行去设计了,请求前脚本的意义,这里就说两个我印象比较深刻的:一是我们可以是用请求前脚本来关联多个请求,在本文中讲解的例子中,都是以一个请求为个体的,该请求的参数也都是我们直接设置给这个请求的,但是对于一些请求的参数只有在请求运行过程中才能够确定,比如说我们之前说的Cookie等身份验明信息,只有我们发起登录请求之后,这个来自服务端的信息才会到我们的测试环境中,所以这个时候我们就可以将这个值设置进我们本次测试的环境变量中,在该次集合测试中的其它请求中就可以使用这个环境变量了。

        什么你说怎么设置环境变量?你看你就没有认真读博主的文章,在图26中,我们就演示了如何设置、清空环境变量!

三、生成测试报告

        经过我们Postman接口测试请求的洗礼,我们我可使用Newman来生成一份报告用来描述我们这次测试执行的的状况。但是Postman本身是没有这个功能的,所以需要额外的软件来进行辅助,

3.1安装软件

a.安装NodeJs        

        直接去官网地址下载引导安装程序,跟随引导完成安装即可【官网地址】。为了保证下一步能够正确的进行,这里建议大家直接安装在C盘,这个软件的硬盘空间占用并不大,所以大家也不用太过焦虑。

b.安装Newman

安装命令,这里建议大家,打开cmd的时候以管理员身份打开。        

npm install -g newman

验证安装:

newman -v

c.安装HTML报告生成器

npm install -g newman-reporter-html

3.2使用Newman

        使用Newman生成报告与我们使用Postman测试的过程都差不多,只不过Newman是以命令行的形式开始运行的,输出一个能够表明执行状况的HTML网页。

        开始之前,我们需要把Postman中测试的环境变量和测试计划都导出,然后还需要我们文档化的测试输入数据(如果有)。然后我们就可以来试着生成一个HTML版本的测试报告了。

newman run C:\\Users\\WIN10\\Desktop\\TestAdd.postman_collection.json //这是你的测试任务-e C:\\Users\\WIN10\\Desktop\\postman_environment.json //这是你的环境变量-d C:\\Users\\WIN10\\Desktop\\new.txt //这是你的测试输入数据-n 2  //这个字段表明你想执行几次-g C:\\Users\\WIN10\\Desktop\\workspace.postman_globals.json //这个字段表明你的全局变量 -r html  //这个字段表明你想生成一个HTML网页 

        上述的选项中,如果对应的内容为空,则可以不写。