1.Postman的使用场景
postman发送请求给服务器,然后从服务器接受响应,最后在postman中展示出来。
- 开发接口,快速调用接口、调试
- 测试接口,调用接口,通过不同的参数去测试接口的输出
- 反复运行端口
- 支持断言
Postman是一个商业化的接口测试工具,有收费版本pro和免费版本的,这里使用的是免费版本(免费版本已经够用了)。
postman分为chrome插件版和native版本,插件版官方已经不维护了,而且插件版的有很多功能都受限制,比如,native必须要安装扩展才可以操作cookie,headers设置受限制,没有native版本的Postman console,非常不方便调试。
不登录也可以使用。
接口测试,测试服务器的真实反应。
2.Postman页面介绍
工具栏
New: 新建,可以新建Request请求,Collection请求集,Environment等
Import: 导入,可以导入别人导出的请求集
Runner: 运行一个请求集(批量执行)
Invite: 邀请(需要注册,邀请进行协作)
settings:Postman设置功能
notifications:官方及协助消息
接口管理区
History
请求历史记录,可以查询到之前的请求记录
Collections
接口集,相当于一个接口项目或测试计划,接口集中可以建立子文件夹,用于对接口进行分组管理。
Collection功能的使用场景:
- 用例分类管理,方便后期维护
- 可以进行批量用例回归测试 。
①新建请求集:New按钮-->Collection 或 直接点击请求集列表上方的新建请求集按钮
授权Authorization:请求集及其子文件夹下的接口统一使用该授权,不用每个接口再都单独设置一遍
请求前脚本pre-request script:请求集的每个接口公用的请求前脚本
请求后断言test:请求集每个接口公用的请求后脚本
请求集变量variables:请求集中公用的一些变量
②新建子文件夹:子文件夹的属性中同样拥有描述,授权,请求前脚本,和请求后断言(没有变量,一个请求集的变量统一管理),实现了不同范围(Scope)的Fixture功能。
③测试集导出:测试集可以导出并发送给别人(不携带环境信息),别人通过导入来使用你的接口
④测试集分享:测试集直接分享给别人(双方都需要注册)
⑤添加请求:通过测试集add request 添加请求,这个请求包含于这个测试集里。
Environments
环境管理中还可以点击“Global”添加全局变量,环境变量只有当选择了该环境时才生效,全局变量在任何环境中都生效,测试集中的变量只在当前测试集生效。当测试集变量,环境变量,全局变量有重复的变量名时,优先级为:环境变量>Collection测试集变量>全局变量(Globals)。
创建Global变量
(1)手动创建变量
Environments - Global - new line
(2)自动创建变量
获取接口相应内容
①json解析
②正则
查看token是否正确,如果取多了,调试修改(可以用console.log(token)查看输出),比如pm.globals.set('token',token[1])。
保存变量
- pm.globals.set('token',token[1]) // 把token保存到全局变量中
- pm.environment.set('token',token[1]) // 把token保存到环境变量中
- pm.collectionVariables.set('token',token[1]) // 把token保存到集合变量中
pm常用对象
变量名 | 内容 |
pm.request | 请求 |
pm.response | 响应结果 |
pm.globals | 全局变量 |
pm.collectionVariables | 集合变量 |
pm.environment | 环境变量 |
pm.variables | 局部变量 |
创建Environment变量
创建Collection变量
Collection -> Variables
接口设计区
Params和Body的区别:Params处设置的变量请求时会以问号后面的参数的形式带到请求的接口链接里(成为URL的一部分),而Body里设置的参数则是接口真正请求时发的参数。
例如:https://www.baidu.com?name=beifan,name=beifan就是查询参数,由键值对组成,格式为:key1=value1&key2=value2, 如果有多组键值对,要用&隔开。查询参数的URL一般直接拷贝到输入的URL地址栏中就可以了(会自动填充到Params),当然也可以把查询参数在Params中输入,两者的效果是一样的.
请求行
可以选择请求方法(GET/POST/...),填写请求地址,发送请求和保存请求到测试集。
- GET——从服务器获取资源。返回什么,由服务器决定。
- POST——需要主动告知服务器一些信息,而不是获取。告知服务器的信息一般会放在body里。
- PUT——向指定资源位置上传最新内容。与POST的区别之处在于,POST常用于创建资源,PUT通常用于修改资源。
- DELETE——删除资源。
- HEAD——获得报文首部,HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认URL的有效性及资源更新的日期时间等。
请求数据区
分为授权,请求头,请求数据,请求发送前执行的脚本(用于准备数据),请求结束后执行的脚本(用于断言)。
鉴权(Authorization)
鉴权即需要验证用户身份,用户身份信息可以在Authorization,headers,body里面设置。
如果身份验证不通过,会报401错误。
1)Basic Auth
填写用户名和密码,点击 update request 后,headers 中自动添加 Authorization。图中用户名和密码均使用的 key 变量:
2)Digest Auth
要比 Basic Auth 复杂的多。使用当前填写的值生成 authorization header。所以在生成 header 之前要确保设置的正确性。如果当前的 header 已经存在,postman 会移除之前的 header。
3)OAuth 1.0
postman 的 OAuth helper 让你签署支持 OAuth 1.0 基于身份验证的请求。OAuth 不用获取 access token,你需要去 API 提供者获取的。OAuth 1.0 可以在 header 或者查询参数中设置 value。
4)OAuth 2.0
postman 支持获得 OAuth 2.0 token 并添加到 requests 中。
请求头(Headers)
Cookie登录
有些接口请求之前需要有前置条件,比如购买接口请求时就要先验证是否账户处于登录状态,是否安全之类的,这时我们就需要登录Cookie来登录,方法是在其他端登录之后,抓包获得登录Cookie,在header里新建一个参数Cookies,值为抓包获得的Cookie值
请求体(body)
①form-data
multipart/form-data是Web表单用于传输数据的默认编码。这模拟了在网站上填写表单(文件或图片)并提交它。表单数据编辑器允许我们为数据设置键-值对。我们也可以为文件设置一个键,文件本身作为值进行设置。
混合表单,支持上传文件 。
Content-Type:multipart/form-data
②x-www-form-urlencoded
该编码与URL参数中使用的编码相同。我们只需输入键-值对,Postman会正确编码键和值。请注意,我们无法通过此编码模式上传文件。
文本表单。
Content-Type:application/x-www-form-urlencoded
③raw
RAW请求可以包含任何内容。除了替换环境变量之外,Postman不触碰在编辑器中输入的字符串。无论你在编辑区输入什么内容,都会随请求一起发送到服务器。编辑器允许我们设置格式类型以及使用原始主体发送的正确请求头。我们也可以手动设置Content-Type标题,这将覆盖Postman定义的设置。
原始格式,支持JSON/XML格式(后面可选择) 。
Content-Type:application/json
Content-Type:text/plain
Content-Type:application/javascript
Content-Type:text/html
Content-Type:application/xml
④binary
二进制数据可让我们发送Postman中无法输入的内容,例如图像,音频或视频文件。当然了,我们也可以发送文本文件。正如前面在表单数据部分中提到的,如果通过历史记录或集合加载请求,则必须重新附加文件。
二进制格式,用于发送二进制数据流。
Content-Type:application/octrent-stream
预请求脚本(Pre-request Script)
一个请求在发送之前,会先去执行Pre Request Script(前置脚本)中的代码 。
对一些复杂的场景,都可以使用前置脚本生成一些动态数据或进行处理后再请求脚本。
后置脚本(Tests)
可以在Tests中,①编写断言;②当做后置处理器来编写一些后置处理代码
经常应用于:
-
获取当前接口的响应,传递给下一个接口
-
控制多个接口间的执行顺序。
响应区
- Body和Status是我们做接口测试的重点,一般来说我们都会验证响应体中的数据和响应状态码
- Test Results 是我们编写断言后,可以查看断言的执行结果 ,所以这个对我们也很有用 。
- Time 和Size 是我们做性能测试时,可以根据这两个参数来对所测接口的性能做一个简单的判断。
Status
100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
200~299:表示服务器成功接收请求并已完成整个处理过程。常用200(OK 请求成功)。
300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。
400~499:客户端的请求有错误,常用404(服务器无法找到被请求的页面)、403(服务器拒绝访问,权限不够)。
500~599:服务器端出现错误,常用500(请求未完成。服务器遇到不可预知的情况)
响应内容(body)
可以查看Pretty(美化格式),Raw(原始格式),Preview(HTML预览格式),Visualize(自定义展示)
响应头
响应头:Headers + Cookies,需要注意的是Cookies是包含在响应头中的,但是为了明显,工具会分开显示
测试结果(Test Results)
对应请求中Tests中设置的断言结果。
3.接口请求
3.1 表单类型的接口请求
在发送HTTP请求的时候,一个请求中一般包含三个部分,分别是请求行,请求头(Header),请求体 (Body)。不同的接口,Body的数据类型是不一样的,比较常见的一种就是表单类型,那么什么是表单类型呢 ?简单理解就是在请求头中查看Content-Type,它的值如果是:application/x-www-form-urlencoded,那么就说明客户端提交的数据是以表单(form)形式提交的 。见下图:
在Postman中进行表单类型的接口请求
- 请求方法:POST
- Request URL:根据实际项目情况
- Headers:Content-Type:application/x-www-form-urlencode
- Body:输入相应的键值对
3.2 上传文件的表单请求
在做接口测试时,我们经常会遇到需要上传文件的接口,这就需要用到:multipart/form-data。它也属于一种表单,但它既支持表单请求,也支持文件上传。
- 请求方法:POST
- Request URL:根据实际项目情况
- Headers:Content-Type: multipart/form-data
- Body:file=a1.jpg/.xlsx/.docx等文件
注意:在postman中设置Body类型,需要选择Body-> form-data 。file中要选择File类型(Key column最右边下拉选择File),然后上传本地的文件 。
怎样把要上传的文件存在Work Directory:
举例:
上传单个文件
Response
3.3 JSON类型的接口请求
接口测试中最常见的一种情况, 也就是请求体类型为json,在Swagger -> Request Body中查看Content-Type: application/json;
注意:在postman中设置请求体类型,需要选择body -> raw -JSON
关于表单和JSON:
- 参数都是放在Body
- 表单是键值对(Key-Value)字符串
- Json是Json对象
- Request Header不一样
4.Token鉴权(Authorizations)
接口按照是否需要鉴权分为:
- 不需鉴权,比如注册登录
- 需要token,比如增删改查
- 需要API Key,比如用户数据管理
举例
(1)获取token
在Authorization中添加token信息
当在Authorization里面设置了Token信息,会自动填充到Headers -> Authorization里面。Bearer + 空格 + Token
也可直接在Authorization选择Bearer Token,输入token即可。
(2)API Key
当在Authorization里面设置了API Key信息,会自动填充到Headers -> X-API-KEY里面,值即是token。
5.接口关联
token是有效期的,过一段时间会失效。怎么自动获取最新token?
接口关联:让A接口返回的值,成为B接口的请求参数。
- A接口把返回值放在某处
- B接口从该处读取数据
在Postman中通过变量的方式,实现接口关联。
关于Postman中的变量:
- 变量是一个标签,代表一个可以动态变化的值
- 通过双大括号使用变量 {{a}}, {{b}}, {{token}}
- 变量作用域:范围越大,优先级越低, 变量查找顺序:Environment 环境变量 > Collections 测试集变量 > Global 全局变量
举例:
6.自动化断言
断言(assert):预期与实际结果的判断,如果预期==实际:用例通过;如果预期!=实际:用例不通过。一般在HTTP响应里面进行断言,主要看status_code和body。 Postman断言是借助JavaScript (js) 语言编写代码,.
- Body和Status是我们做接口测试的重点,一般来说我们都会验证响应体中的数据和响应状态码
- Test Results 是我们编写断言后,可以查看断言的执行结果
- Time 和Size 是我们做性能测试时,可以根据这两个参数来对所测接口的性能做一个简单的判断。
脚本实现
- pm.test:创建测试用例
- pm.expect:创建断言,判断是否满足预期结果
Postman右侧封装的常用的断言
- 响应时长
举例:响应时长小于3秒
pm.test("Response time is less than 3000ms", function () {
pm.expect(pm.response.responseTime).to.be.below(3000);
});
- 响应字节
举例:响应字节小于10M
pm.test("Response body is less than 10MB", function () {
pm.expect(pm.response.responseSize).to.be.below(1024*1024*10);
});
断言的封装
大部分接口,拥有相似的断言,可以封装重复使用。
- 接口契约
返回内容要符合接口文档,包括状态码、数据格式、数据值等。
pm.sendRequest的作用就是发送一个请求,并获取其他的返回信息。
request URL,然后callbak 后面的函数。
() => {} 这也是一种function格式(重构function)。
断言举例:
常见返回值获取
案例1:多层json嵌套, 获取user_id的值
{
"code": 0,
"message": "请求成功!",
"data": {
"user_id": "1252163151781167104"
}
}
//获取json体数据
var jsonData = pm.response.json()
// 获取user_id的值,通过.获取
var user_id = jsonData.data.user_id
案例2:json中存在列表,获取points中的第二个元素
{
"code": 0,
"message": "请求成功!",
"data": {
"roles": {
"api": [
"API-USER-DELETE"
],
"points": [
"point-user-delete",
"POINT-USER-UPDATE",
"POINT-USER-ADD"
]
},
"authCache": null
}
}
//获取json体数据
var jsonData = pm.response.json()
// 获取user_id的值,通过下标获取列表中某个元素
var user_id = jsonData.data.roles.points[1]
案例3:列表中取最后一个元素
{
"code": 0,
"message": "请求成功!",
"data": {
"total": 24,
"rows": [
{
"id": "1066370498633486336",
"mobile": "15812340003",
"username": "zbz"
},
{
"id": "1071632760222810112",
"mobile": "16612094236",
"username": "llx"
},
...
{
"id": "1075383133106425856",
"mobile": "13523679872",
"username": "test001",
},
//获取json体数据
var jsonData = pm.response.json()
// 获取id的值,通过slice(-1)获取列表中最后一个元素。
var id = jsonData.data.rows.slice(-1)[0]
接口请求调试
可以通过控制台console调试
console.log()
- 记录请求、响应原始报文(日志)
- 完成js脚本、输出
搜索日志:输入URL或者打印的日志就能直接搜索出我们想要的请求和日志,这对我们在众多日志中查找某一条日志是非常方便的 。
按级别搜索:可以查询log,info,warning,error级别的日志 ,有助于我们更快定位到错误 。
查看原始报文(Show raw log):如果习惯看原始请求报文的话,这个功能可能更方便些 。
隐藏请求(Hide network):把请求都隐藏掉,只查看输出日志 。
7.数据驱动测试(DDT)
- 将测试用例和测试数据进行分离
- 添加、修改、删除测试数据
- 实现对测试用例的添加、修改、删除
(1)创建测试用例
(2)测试数据改为变量
(3)准备测试数据
csv格式
新建csv
也可以直接用记事本打开csv文件编辑,更便于修改维护。
json格式
计算机处理json格式更高效。
(4)使用数据文件执行用例
Run Clollection -> Select File -> 选择相应文件,然后可以批量执行。
8.用例备份和批量导入
导出:
- 测试用例(集合),Collection - 右键,Export
- 全局变量,Enviroments - Global - Export
- 环境变量,Enviroments - New Environment - 三点,Export
导入:
import,可以导入测试用例、全局变量、环境变量
9.测试报告
Newman是一款基于nodejs开发的可以运行postman脚本的工具,使用Newman,可以直接从命令运行和测试postman集合并自动生成测试报告。
(1)安装环境
- 安装nodejs,双击运行,查看是否安装成功,打开cmd输入node -v
- 安装Newman,Newman是nodejs运行的一个程序,可以直接执行命令安装
npm install -g newman newman-reporter-htmlextra
(2)执行用例
在存放测试用例及环境变量的文件夹中打开命令行,执行run命令
在命令中自动执行
同时在文件夹中也自动生成了html报告
(3)测试报告定制
可以在命令行中修改
进阶:更方便的,在文件夹中创建run.bat,把上面的脚本复制进去;然后在命令行中执行run.bat,即会自动执行并生成报告。