postman学习
接口测试的简介和分类
- 接口测试就是测试系统组件接口之间的一种测试
- 分类
- 测试外部接口:测试被测系统和外部系统之间的接口(只需要测试正例即可)
- 测试内部接口:
- 1)内部接口只提供给内部系统使用。(比如说是预算系统或者是承保系统)(只需要测试正例即可)
- 2)内部接口提供给外部系统使用。(测试必须非常全面,正例,各种异常场景,权限控制等等)
接口测试的流程以及用例的设计
- 1)拿到接口API文档(或者通过抓包工具获取),熟悉接口业务,接口地址,鉴权方式,入参,出参,错误码。
- 2)编写接口用例以及评审
- 思路
- 正例:输入正常入参,接口能够成功返回数据
- 反例:
-
鉴权反例:
- 鉴权的意思:鉴定它是否有访问接口的权限
- 鉴权码:token,key,appkey
- postman中的authorization是用来做鉴权的
- 测试鉴权码为空,鉴权码错误,鉴权码过期等等情况下能够访问成功
-
参数反例:参数为空,参数类型异常,参数长度异常等等情况
-
错误码覆盖:根据业务而定
-
其他错误场景:
- 接口黑名单,接口调用次数闲置,分页场景
-
- 思路
- 3)使用接口测试工具(如postman)执行接口测试。
- 4)postman+newman+Jenkins实现持续集成,并且输出测试报告并且发送邮件
postman的界面介绍
- workspaces:工作空间
- connection:集合,项目结合
- APIs:api文档
- enviroments:环境变量,全局变量
- mock server:虚拟服务器
- monitors:监听器
- history:历史记录
postman执行接口测试
-
请求页签
- params:get请求传参
- authorization:鉴权
- headers:请求头
- body:post请求传参
- none:没有参数
- form-data:既可以传键值对参数也可以传文件
- x-www-from-urlencoded:只能够传键值对参数
- raw:可以传json,text,xml,html,javascript
- binary:将文件以二进制的方式传参
- Pre-request Script:请求之前的脚本
- tests:请求之后的断言
- cookies:用于管理cookie信息
-
响应页签
-
Body:接口返回的数据
- pretty:以json,html.xml,text,auto不同格式查看返回的数据
- raw:以文本的方式查看返回的数据
- preview:以网页的方式查看返回的数据
-
cookies:响应的cookie信息
-
headers:响应头
-
test results:断言的结果
-
status:200 ok:200是状态码,ok是状态信息
-
time:223ms:是接口响应的时间
-
size:373B:响应的字节数
-
-
get和post的区别
- 区别1):get请求一般是获取数据,post请求一般是提交数据
- 区别2):post请求要比get请求安全
- 区别3):本质区别是传参的方式不一样
- get请求在地址栏后面以?的方式传参,多个参数之间用&分隔
- post请求是在body中以表单的方式传参
-
问题:
- 多种环境:开发环境、测试环境、生产环境
- 接口关联:需要手动关联
- 参数需要手动修改
postman的环境变量以及全局变量
- 解决问题:多种环境:开发环境、测试环境、生产环境
- 环境变量:环境变量就是全局变量
- 全局变量:全局变量是能够在任何接口里面访问的变量
- 获取环境变量和全局变量的值通过:{{变量名}}的方式获取
处理接口关联问题
- 两种方式
- JSON提取器实现接口关联
- 使用正则表达式提取器实现接口关联
Postman之JSON提取器实现接口关联
-
解决问题:接口关联:需要手动关联
-
实现方式:
- 第一步:在被调用的接口的tests中写入如下类似内容
console.log(responseBody); // 使用json提取器提取access_token值 // 把返回的字符串格式的数据转换成对象的形式 var result = JSON.parse(responseBody); console.log(result.access_token); // 把access_token设置为全局变量 pm.globals.set("access_token", result.access_token);
- 第二步:在所用的接口中参数值使用这个方式填充:{{access_token}}
Postman之正则表达式提取器实现接口关联
-
解决问题:接口关联:需要手动关联
-
实现方式:
- 第一步:在被调用的接口的tests中写入如下类似内容
// 使用正则表达式提取器实现接口关联,matcg表示匹配 var resuslt = responseBody.match(new RegExp('"access_token":"(.*?)"')); console.log(resuslt[1]) // 设置为全局变量 pm.globals.set("access_token", resuslt[1]);
- 第二步:在所用的接口中参数值使用这个方式填充:{{access_token}}
Postman之内置动态参数和自定义动态参数
- 解决问题:参数需要手动修改
- Postman内置动态参数
- 参数固定格式:{{$xxxx}}
- {{$timestamp}}:生成当前时间的时间戳
- {{$randomInt}}:生成0-1000之间的随机数
- {{$guid}}:生成速记GUID字符串
- 参数固定格式:{{$xxxx}}
- 自定义动态参数
-
实现方式:
- 第一步:在调用的接口的Pre-request Script中写入如下类似内容
// 手动的获得时间戳 var times =Date.now(); // 设置为全局变量 pm.globals.set("time_now",times);
- 第二步:在所用的接口中参数值使用这个方式填充:““标签时间{{time_now}}””
-
Postman断言
- 目的:之前看结果都是通过人的肉眼判断是否通过,针对这个问题进行改进。
- 常见的断言:
- status code:code is 200 检查返回的状态码是否为200
- response body:contains string 检查响应中包括指定字符串
- response body:json value check 检查响应中其中json的值
- response body:is equal to a string 检查响应等于一个字符串
- response headers:Content-Type header check: 检查是否包含响应头Content-Type
- response time is less than 200ms:检查请求耗时小于200ms
- 示例
- 在Tests中一般要写状态断言和业务断言两种,如下所示
// 使用正则表达式提取器实现接口关联,matcg表示匹配 var resuslt = responseBody.match(new RegExp('"access_token":"(.*?)"')); console.log(resuslt[1]) // 设置为全局变量 pm.globals.set("access_token", resuslt[1]); // 断言 // 状态断言 pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); // 业务断言 pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("access_token"); });
-
在输出的结果页签的 Test Results中查看结果
-
在断言中使用自定义动态参数不能使用这种{{xxx}}方式,要使用+号拼接,动态参数使用get a global variable方式获取
-
可以将接口中的状态断言代码挪动到集合的test中去,接口中的断言只留下业务断言
- 方法:在集合的三个点中点edit,然后将状态断言cut 到test中去,update即可。实现了全局断言。
Postman批量运行测试用例
- 操作方法:点击集合右边的->选择run
Postman之CSV或JSON文件实现数据驱动
- csv方式
- 在接口中参数的参数值均设置为对应的csv表中的列名{{xxx}}
- 在接口中的业务断言做修改,以微信公众平台的token接口为例子介绍:
- 1)接口中的test进行如下修改
if (responseBody.search("access_token")!=-1){ // 使用正则表达式提取器实现接口关联,matcg表示匹配 var resuslt = responseBody.match(new RegExp('"access_token":"(.*?)"')); console.log(resuslt[1]) // 设置为全局变量 pm.globals.set("access_token", resuslt[1]); } // 断言 // 业务断言 pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include(data.access_token); //data为表名,access_token为列名 });
- 2)在批量测试中导入csv测试数据文件
- json方式
- 与csv类似,只是原始的文件格式不一样而已
必须带请求头的接口测试和常见请求头详解
- pass
Postman接口Mock Servier服务器
- mock :模拟的意思
- 解决的问题:后端的接口还没有开发完成,前端的业务需要调用后端的接口,这时候可以使用模拟服务器
- 使用的方式
- 在Mock Servers中选择新建集合,在其中选择是使用post还是get方式,然后添加子页面url,添加接口的模拟返回值。所有工作做完之后,可以测试接口,此时会自动生成集合名称的环境变量在其中自动添加了默认值,我们可以选取相应集合中的接口进行测试,想要修改默认的返回值如下所示。
- 如何修改返回的数据:
- 在调用mock server的接口中的Default中进行修改,在Body 下的pretty中进行修改
- 如何修改返回的数据:
- 在Mock Servers中选择新建集合,在其中选择是使用post还是get方式,然后添加子页面url,添加接口的模拟返回值。所有工作做完之后,可以测试接口,此时会自动生成集合名称的环境变量在其中自动添加了默认值,我们可以选取相应集合中的接口进行测试,想要修改默认的返回值如下所示。
Postman的Cookie鉴权
- 鉴权:鉴定它是否有访问接口的权限
- cookie:cookie是一小段文本,格式key=value
- cookie鉴权的原理
- 1.当客户端第一次访问服务器的时候,那么服务器就会生成cookie信息,并且在响应头的set-cookie里面把生成的cookie信息发送给客户端
- 2.当客户端第2-N次访问服务器的时候,那么客户端就会在请求头的cookie带上cooKie信息,从而实现鉴权
- cookie的分类
- 会话cookie:保存在内存,当浏览器关闭之后就会自动化清除cookie
- 持久cookie:保存在硬盘,浏览器关闭后不会清除,只有当失效时间到了才会自动清除
Postman的Newman命令以及常见的参数
- Postman是专为接口测试而生,newman是专为postman而生。
- newman可以让Postman脚本通过非GUI(命令行)的方式运行。
- 运行命令:newman run xxx任务
- 常见参数:
- -e:引用环境变量
- -g:引用全局变量
- -d:引用数据文件
- -n:执行测试用例迭代的次数
- -r cli,html,json,junit --reporter-html-export 报告名称.html :指定生成HTML的报告
- 执行命令:
- 1)首先是在所在的文件夹中执行cmd
- 2)执行如下命令:
- 命令:newman run testcase.json -e enviroment.json -g globals.json -d data.json -r cli,html,json,junit --reporter-html-export report.html
- testcase.json为测试接口
- enviroment.json为环境变量
- globals.json为全局变量
- data.json为输入的测试用例
- report.html为输出的测试报告
- 命令:newman run testcase.json -e enviroment.json -g globals.json -d data.json -r cli,html,json,junit --reporter-html-export report.html
Postman+Newman+Jenkins实现接口测试持续集成
- 实现步骤
- 1)新建一个项目
- 2)设置自定义工作空间
- 3)构建可执行批处理命令:execute windows batch command
- 4)执行系统Groovy脚本:execute system Groovy script
- 在groovy script中写入如下内容
- System.setProperty(“hudson.model.DirectoryBrowserSupport.CSP”,“”)
- 在groovy script中写入如下内容
- 5)生成的HTML的报告集成到Jenkins
详细篇
什么是接口?
- 电脑:USB,投影仪(数据传输)
- 软件:统称API,Application Program Interface(鉴权码:token,key,appkey)
- 接口分为内部接口和外部接口
- 内部接口:开发人员自己开发的对自身系统提供的接口
- 外部接口:开发人员调用外部的,比如微信、支付宝等其他的接口
- summary:接口就是软件提供给外部的一种服务,用于做数据传输。
- 接口分为内部接口和外部接口
软件为什么需要接口?
- 因为接口能够让内部的数据被外部进行修改
为什么要做接口测试?
- 现在很多系统都是前后端分离,开发的进度不一样,需要把一开始开发出来的接口进行测试。
- 基于安全考虑,前端有验证很容易绕过,直接请求接口,特别:身份证信息,银行卡,金钱交易
- 测试推崇的是测试左移,测试尽早的介入
- 接口测试的本质:就是测试接口能否正常的交互数据,权限控制以及异常场景
接口返回的数据格式
- Json格式
- 一般会返回三组数据
- {error_code:0,msg:“提现成功”,data:[]}
- 一般会返回三组数据
- Html格式
<html> <head> </head> <body> <error_code>0</error_code> <msg>提现成功</msg> .... </body> </html>
- Xml格式
-主体内容同html格式
接口测试协议
- webservice协议:接口地址:http://…?wsdl 这种格式
- soap协议,wsdl
- restful规则
- get获取数据,post提交数据,put修改数据,delete删除数据
- 地址一样,例如:http://123.12.32.2:8080/user
- dubbo协议:接口地址: dubbo://…这种格式
- 适用于少量数据的传输,大并发
- 不适合传输大量的文件,如文件或者视频
- http协议:
- 1)接口地址1:http://…
-
- 接口地址2:https://…
- https=http+ssl安全传输协议 端口:443
- http协议的端口是80
- 什么是http协议?
- http是超文本传输协议,主要用于浏览器和服务器之间的交互数据,交互有两个部分:
-
请求:get,post,put.delete
-
响应:1xx信息,2xx成功,3xx重定向(跳转不传值),4xx客户端错误,5xx服务器错误
-
请求部分包含:
- 请求行
- 请求头
- Accept:客户端可以接收的数据格式
- X-Request-With:异步请求
- User-Agent:客户端的用户
- Host:请求的主机
- Accept-Encoding:压缩方式
- Connection:连接方式(比如保持活跃)
- Cookie:请求的cookie信息
- Content-Length:内容的长度
-
响应部分包含:
- 响应行:协议 响应码 响应信息
- 响应头:
-
- http是超文本传输协议,主要用于浏览器和服务器之间的交互数据,交互有两个部分:
企业接口测试的流程和方案
- 拿到api接口文档,熟悉接口的业务,接口地址,鉴权,入参,出参,错误码
- 接口计划和方案
- 思路
- 正例:输入正常的入参,查看接口是否返回成功
- 反例:
- 鉴权反例:鉴权为空,鉴权码错误,鉴权码已过期…
- 参数反例:参数为空,参数类型异常,参数长度异常,错误码覆盖
- 其他场景:分页
- 编写用例和评审
- 执行接口测试
- 输出接口测试报告
- 思路