赞
踩
目录
(2)Response body:Contains string
postman是一个接口测试工具,在做接口测试的时候,postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。
它主要是用来模拟各种HTTP请求的(如:get/post/delete/put…等等),postman与浏览器的区别在于有的浏览器不能输出json格式,而postman可以更直观看到接口返回的结果。
直接在官网下载即可
Download Postman | Get Started for Free
双击打开安装包直接进行安装
刚打开时,需要注册新用户,点击【Create Acount】进行注册
输入邮箱、用户名、密码,点击注册
如图所示,即登录成功
postman如果需要卸载的话,右键图标打开文件所在位置,退回到AppData文件夹,删除local、Roaming文件夹下的postman文件夹即可
由于界面纯英文显示,第一次接触postman的小伙伴可能不太熟悉,这里以主界面的图做注解,来说明下各个元素的含义(后面会详细介绍到)
第一次使用postman时,这里以一个百度翻译接口为例:发起一个get类型的请求
注意:如果没有特别的要求,只需要创建一次即可
collection是postman管理接口请求的基本单位,首先就是把他创建出来,我们在自己的工程下,点击【+】号,再点击【Blank collection】创建空集合后,可进行重命名
在新建的空集合下右键点击【Add request】,新建一个接口请求,即接口用例,新建后也可重命名
对于一个接口请求来说,需要三部分内容:
- 入参示例:
- q=apple
- from=auto
- to=zh
- appid=20190630000313415
- salt=888888
- sign=a9adc2d687fbacecc3b5059b9ccedc95
点击url地址栏后面的send按钮发送请求
返回结果如下:
- {
- "from": "en",
- "to": "zh",
- "trans_result": [
- {
- "src": "apple",
- "dst": "苹果"
- }
- ]
- }
是被测系统和外部系统之间的接口(一般只需要正常调用即可)
是被测系统内部各个模块之间的接口
测试接口参数传递的正确性,接口功能的正确性以及各种异常情况下系统的容错能力、接口的权限控制、接口的兼容性
(1)拿到api接口文档(可以找开发拿,也可以抓包自己创建,也可以录制后自己创建),熟悉接口文档业务、接口地址、接口鉴权(鉴定是否有访问接口的权限)方式、接口入参、出参、是否有完善的错误码机制
(2)编写接口测试用例
正例:输入正常的入参,接口能够正常返回(get/post)
反例:
(3)使用接口测试工具postman/jmeter/apifox执行接口测试,提供bug以及bug验证
(4)Postman+Newman+Jenkins+git实现持续集成并且生成报告
以上图为例,对各个元素进行拆解
请求有四大块组成:请求方式、请求路径、请求头、请求参数
请求方式和请求路径这里就不多做解释了
Params:get请求传参
Authorization:鉴权
Headers:请求头
Body:post请求传参
Pre-request Script:请求之前的脚本
Tests:请求之后的脚本
Settings:设置
Cookies:Postman用于自动管理Cookie的功能
Body:返回的值
Cookies:响应的Cookie
Headers:响应头
Test Results:断言的结果
Console:控制台,用于调试,位于界面左下角
这里的实例在后续的内容描述中都会用到
- grant_type=client_credential
- appid=wx74a8627810cfa308
- secret=e40a02f9d79a8097df497e6aaf93ab80
如图所示,点击send发起请求,下边为响应,即接口返回了一个token
access_token=ACCESS_TOKEN
参数【access_token】取值需要从“获取鉴权码access token接口”中接口返回的值获取
注意:因为接口2用到了接口1返回的结果,因此存在接口关联的情况,也就是需要把接口1的值提取出来放在接口2的参数值中,具体内容见第五章
- json格式
- {"tag":{"name":"陕西西安"}}
media=文件附件
返回格式如下,这里可以根据返回地址查看浏览器中上传的图片
{"url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/GXkibaAlg9h9tgVicG4UrkHUyDAvgicOPfbGkTcytsfQUsgfgh2L9jAEN8X8qEnvjOOcKRgsxoEMwH4FPWPY4y0nw\/0"}
{"tag":{"id":15475}}
这里的id取值也可以直接使用全局变量【tag_id】,删除新建的标签,使接口形成一个业务闭环案例
- {
- "tag": {
- "id": {{tag_id}},
- "name": "陕西西安{{$timestamp}}"
- }
- }
这里的id直接使用全局变量【tag_id】,要修改标签信息,则需要先获取到目标标签的id,这里的目标标签则是新建的标签,因此在新建标签接口请求后获取其返回结果的id作为全局变量,在编辑标签接口中调用即可
首先获取到目标接口中的token值,将其设置为全局变量,以便别的接口能调用到该值
注意:接口返回值设置为全局变量时可以点击右边的【Set a global variable】按钮功能直接调用方法
- //打印用于调试
- console.log(responseBody);
- //把返回的字符串转成JSON对象
- var jsobj = JSON.parse(responseBody);
- //取值并设置为全局变量
- pm.globals.set("token", jsobj.access_token);
- //console.log(jsobj.access_token);
在需要的接口里面通过{{token}}取得全局变量的值
{{token}}
根据正则表达式获取到接口中的token值,将其设置为全局变量,其他步骤同方式1一致
- //正则表达式提取器
- console.log(responseBody);
- //通过正则表达式匹配值(match匹配)
- var datas = responseBody.match(new RegExp('"access_token":"(.*?)"'));
- console.log(datas[1]);
- //设置成全局变量
- pm.globals.set("token",datas[1] );
全局变量:在所有的接口里面都可以访问的变量
环境变量:在当前环境里面可以访问的变量
把所有请求中的ip地址改成获取环境变量的方式,如下图所示
{{ip}}
在postman右上角选择不同的环境即可,这里环境可选项就是在【Environments】中新建的环境
注意:不同环境中的变量必须是一致的,变量值不一致
【Environments】中的Globals即为全局变量统称,点击它就会看到全局变量了,具体构建全局变量可参考第五章
- {{$timestamp}} //动态时间戳
-
- {{$randomInt}} //动态0-100的整型
-
- {{$guid}} //动态的guid字符串
- //自定义动态参数生成随机数
- var times = Date.now();
- pm.globals.set("times", times);
-
- //定时5秒再执行
- const sleep = (milliseconds) => {
- const start = Date.now();
- while(Date.now() <= start + milliseconds) {}
- };
- sleep(5000);
我们以第四章的实例来做讲解
一个完整的接口业务闭环案例如下步骤:
拿到鉴权码,新建标签后,获取新建的标签id,根据该id对标签进行修改,修改后全量查询标签,接着再根据id删除该标签,这样就形成了一个完整的闭环
各个接口详图展示如下,仅作参考(与第四章的实例构建差别不大,这里不清晰的话可以返回上面根据请求路径自己创建)
所谓断言,就是对返回的响应结果,做正误判断,如果结果符合设定的预期则判定为pass,如果结果与预期不符则判定为fail。
断言主要是在Test操作框内进行设置,使用JavaScript语言编写,断言的结果在下方响应内容的TestResult内。
有背景底色的为常用断言
- //--------------------断言---获取鉴权码access token接口---
- pm.test("检查返回状态码为200", function () {
- pm.response.to.have.status(200);
- });
-
- pm.test("检查返回的结果中包含指令字符串", function () {
- pm.expect(pm.response.text()).to.include("access_token");
- });
-
- pm.test("检查json中其中一个字段的值", function () {
- var jsonData = pm.response.json();
- pm.expect(jsonData.字段名).to.eql(7200);
- });
-
- //-----------在编辑标签接口中加的断言-----------------------------
- pm.test("检查返回的值等于一个指定的字符串", function () {
- pm.response.to.have.body('{"errcode":0,"errmsg":"ok"}');
- });
- //--------------------------------------------------------------
-
-
- 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("检查返回的状态码是否在数组中", function () {
- pm.expect(pm.response.code).to.be.oneOf([200, 202]);
- });
-
- pm.test("检查状态信息是指定的字符串", function () {
- pm.response.to.have.status("OK");
- });
在创建标签接口中加检查返回的状态码的断言,断言即在请求之后,如下图所示:
- //状态断言
- pm.test("Status code is 200", function () {
- pm.response.to.have.status(200);
- });
检查返回的数据中是否包含指定的字符串,创建标签接口返回的结果中包含id和name,其中name为字符串格式,因此我们可以给该接口加断言
- //检查返回结果是否包含指定字符串
- pm.test("Body matches string", function () {
- pm.expect(pm.response.text()).to.include("陕西西安"+pm.globals.get("times"));
- });
注意:这里获取到的随机数【times】是因为设置了前置脚本-自定义动态参数,因此断言中可以获取到接口返回结果中文后的随机数
- //自定义动态参数生成随机数
- var times = Date.now();
- pm.globals.set("times", times);
一旦需要断言随机数,那么必须使用自定义动态参数
注意事项:
在自己创建的collection集合右上角点击【Run collection】,打开批量执行窗口,设置执行次数以及间隔时长,点击执行
当一个接口需要测试多个场景用例:正向用例、反向异常用例,可以使用数据驱动的形式实现
以【获取鉴权码access token接口】为例,该接口有三个必传参数:grant_type、appid、secret
正向用例 | 反向用例 |
grant_type、appid、secret必填 | grant_type无值,appid、secret必填 |
grant_type、secret必填,appid无值 | |
grant_type、appid必填,secret无值 |
grant_type | appid | secret |
client_credential | wx74a8627810cfa308 | e40a02f9d79a8097df497e6aaf93ab80 |
wx74a8627810cfa308 | e40a02f9d79a8097df497e6aaf93ab80 | |
client_credential | e40a02f9d79a8097df497e6aaf93ab80 | |
client_credential | wx74a8627810cfa308 |
- [
- {"grant_type":"client_credential","appid":"wx74a8627810cfa308","secret":"e40a02f9d79a8097df497e6aaf93ab80"},
- {"grant_type":"","appid":"wx74a8627810cfa308","secret":"e40a02f9d79a8097df497e6aaf93ab80"},
- {"grant_type":"client_credential","appid":"","secret":"e40a02f9d79a8097df497e6aaf93ab80"},
- {"grant_type":"client_credential","appid":"wx74a8627810cfa308","secret":""},
- ]
变量名与文件中的变量名一致,变量值直接调用全局变量(文件中的变量都默认为全局变量)
在自己创建的collection集合右上角点击【Run collection】,打开批量执行窗口,选择csv或者json文件,选择后会自动带入执行次数,再勾选要测试的接口,点击执行
正例测试通过,反例发送请求时报错
存储在客户端的一小段文本信息,格式为键值对的形式
以下面的网页为例,打开谷歌浏览器,右键点击检查【F12】,查看界面cookie
保存在内存,当浏览器关闭之后会自动删除cookie
保存在磁盘,当浏览器关闭之后不会清除,只有在失效时间到了之后才会清除
注意:Cookie的值是在服务端设置,在客户端存储,可以设置Cookie的失效时间
(1)当客户端第一次访问服务器的时候,服务器就会生成Cookie信息,并且通过响应里的Set-Cookie将Cookie值传输给客户端,客户端接收并自动存储Cookie值。
(2)当客户端第二次访问服务器的时候,客户端就会自动读取本地的cookie,然后根据主机IP或者域名添加对应的cookie,从而实现鉴权
Postman会自动完成cookie鉴权,无需手动完成。
获取cookie以后,postman发请求不用自己手动添加cookie,他会自动帮我们填写cookie在请求头上
Mock是一种比较特殊的测试技巧,可以在没有依赖项的情况下进行接口或单元测试,通常情况下,Mock与其他方法的区别是,用于模拟代码依赖对象,并允许设置对应的期望值
因项目中任务的不同分工,会出现每个人的任务进度不一样的情况,就会出现模块A开发完成,但其依赖项模块B还未完成,这时候如果进行集成测试时,就会出现两个模块无法有效完成工作。针对这种情况,Mock服务便应运而生。Postman中的Mock服务器可以减轻团队开发中这种不同步的情况。
在API开发的前期,构建Mock集合可以帮助团队之间进行清晰有效沟通,并尽快就预期结果达成一致,在实际开发过程中,所有人员可以同步并行工作,减少因相互依赖而导致延期的风险
Mock不是一个真实的服务,仅是一个被伪装成真实服务的假服务,通过Mock,可以测试我们API并检验结果是否正确。
Postman可以创建两种类型的Mock服务
(1)点击左侧图标【Mock Servers】,点击【Create Mock Server】,在右侧填写相应的Mock服务器参数,并点击【Next】,如下所示
(2)填写Mock服务器的相关信息并点击【Create Mock Server】
(3)在创建Mock Server成功后,会出现如下界面
不需要做任何配置,创建Mock服务后,postman会自动创建集合以及环境变量,直接发送请求即可(切换至Collections,发送请求)
(1)对称式加密:DES,AES,Base64加密
(2)非对称式加密:RSA加密 (BEJSON网址可用)
非对称式加密也叫双钥加密(公钥和私钥【公钥加密,私钥解密】/【私钥加密,公钥解密】)
(3)只加密不解密:MD5,SHA1,SHA3
(4)混合加密(自定义加密方式):使用多种加密方式
(5)接口签名Sign
这里以一个简单的用户登录接口为例,讲解如何测试加/解密,接口文档中有描述用哪种加密技术(这里是我的本地接口,想要实操的小伙伴可以自己搭建)
在前置脚本中使用Base64位进行加密,分别对入参【user_name和passwd】取值进行加密
- //Base64位加密
- //把需要加密的值转换成utf-8的编码格式
- var us = CryptoJS.enc.Utf8.parse("test01");
- var pw = CryptoJS.enc.Utf8.parse("admin123");
- //对转换后的值做Base64加密
- var bs64_us = CryptoJS.enc.Base64.stringify(us);
- var bs64_pw = CryptoJS.enc.Base64.stringify(pw);
- //设置为全局变量
- pm.globals.set("bs64_us", bs64_us.toString().toUpperCase());
- pm.globals.set("bs64_pw", bs64_us.toString().toUpperCase());
如图所示,用户登录成功
Newman 是一款基于Node.js开发的,专为 postman 而生的命令行工具,通过命令行执行
通过 Newman 执行脚本,可以在 Jenkins 上实现 postman 接口测试持续集成,是一种非常简单方便进行接口测试的方法
下载地址:下载 | Node.js 中文网 (nodejs.cn)
下载后一路next ,安装后,打开cmd,输入node -v ,看到输出node的版本信息,即代表安装成功,环境变量设置也正确
注意:安装的时候多等待一会,不要着急点击取消
点击【win+R】,输入cmd打开命令行,直接在命令行输入安装命令即可安装
- //安装命令
- npm install -g newman
验证是否安装成功
- //验证命令
- newman -v
安装newman时如果遇到了如下报错,CERT_HAS_EXPIRED是一个由Node.js和npm抛出的错误,表示你正在尝试访问的服务器的SSL证书已经过期
解决办法:
1、清除npm缓存
npm cache clean --force
2、取消ssl验证:
npm config set strict-ssl false
3、再进行安装(1)正常安装:
npm install -g newman
(2)npm镜像源安装:
npm install -g newman --registry=https://registry.npm.taobao.org
如果上面的步骤还是安装失败的话,再试试更换镜像源
npm config set registry http://registry.cnpmjs.org
npm config set registry http://registry.npm.taobao.org
使用命令安装 html 报告模板,方便查看测试用例执行结果
- //安装html报告模板
- npm install -g newman-reporter-html
这里需要导出接口用例、环境变量以及全局变量三部分内容
导出文件都为json格式,这里要注意的是,文件命名不要用中文命名
参数 | 用法 |
-e | – environment 后面跟环境变量文件 |
-g | – global 后面跟全局变量文件 |
-n | – iteration-count 后面跟迭代次数 |
-d | – iteration-data 指定用于迭代的数据源文件 |
-r | – reporters 后面跟数据结果 |
html | 将结果生成为html文件,指定生成到具体目录需要配合 --reporter-html-export 文件名 使用 |
使用指令newman run xxx.postman_collection.json 即可启动测试,我这里以上边的导出文件做示例,输入指令:
newman run "e:\\newmans\\yongli.json" -e "e:\\newmans\\huanjing.json" -g "e:\\newmans\\quanju.json"
输入指令后生成测试报告【report.html】
newman run "e:\\newmans\\yongli.json" -e "e:\\newmans\\huanjing.json" -g "e:\\newmans\\quanju.json" -r cli,html,json,junit --reporter-html-export "e:\\newmans\\report.html"
1、GET请求和POST请求的区别是什么?
答:
(1)GET请求一般用于获取数据,POST请求一般用于提交数据
(2)传参的方式不一样
# GET请求在接口地址里面以【?】的方式传参,多个参数之间用【&】分隔
# POST是在body当中传参
(3)POST请求比GET请求安全
(4)GET请求只发一个数据报文,POST请求发送两个数据报文
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。