postman的基础使用 以及接口测试基础
目前:jmeter做接口测试,实现了参数关联 和动态传参,批量执行,但local QA不熟悉jmeter,需要梳理postman脚本
------------------------------------------------------------------------------------------------------------------
一、接口分类,流程,用例设计
【接口分类】
外部接口:与三方(或保司等下游 或 上游服务间)的接口
内部接口:同一个系统 各个子模块间的接口
【接口测试重点】
检查接口参数的正确性,接口功能的正确性,输出结果的正确性,以及异常场景的容错处理、权限控制。
参数校验:允许参数类型、必填校验、长度限制
功能:查询结果正确 或业务功能实现ok
异常场景:SQL注入、跨站脚本等
权限:数据权限(加role 校验 或账号登陆校验),操作权限限制(release payment不是所有账号都能操作)
【接口测试流程】
1. 拿到API 接口文档 (或抓包获取)熟悉接口业务,接口地址,鉴权方式,错误码
2. 编写接口的测试用例 以及评审
3. 使用postman 和 jmeter执行接口测试
4. 持续集成(生成报告、发送邮件) postman+newman+jenkins+git
Jmeter+ant+jenkins+git 持续集成
【用例设计】
和功能测试用例 编写相似
编写思路:
正例:输入正确的入参,接口正常返回
反例:
鉴权反例:鉴权码为空,错误,或过期……
参数反例:必填,参数类型异常,参数长度异常,错误码覆盖
其他场景:接口黑名单,接口调用次数限制,分页场景测试(负数、0,>max page)
refer to: https://www.bilibili.com/video/BV1r14y1A7MQ/?p=1
------------------------------------------------------------------------------------------------------------------
token鉴权 或 cookie 对于接口测试来说有啥区别
目前大部分项目都会有登陆鉴权:
a.服务端会话session机制(web端)
b.服务端分发token机制(app端)
服务端会话session,相当于一个容器,一种缓存技术,用户登陆网站后,服务端创建session,浏览器保存用户登陆信息,并缓存,缓存形式为cookie,用户再访问其他页面时 请求头要带上这个cookie中的这个信息,用作服务端校验,
校验通过则可以正常访问,一旦不通过或session过期,视为校验失败,从而重定向到登陆页面。
app登陆后,服务器端响应一串唯一的信息作为这个token,客户端获取token缓存到手机本地,在后续访问app时会带上这个token去服务端做校验,校验通过可继续使用,否则退回到登陆页面。
接口测试时,我们通过登陆获取token、或session,然后设置为全局变量,再后续请求在header中传入token值、或session值,用于接口鉴权。
------------------------------------------------------------------------------------------------------------------
二、Poatman 基础介绍
collection--相当于项目名
collection--add Folder--相当于模块名
【请求页签】
Body 传参类型:
form-data:可以传输key=value 表单参数 还可传输文件,
x-www-form-urlencoded: 只能传输key=value 表单参数
ra:Tex, javascript, Json, html, XML
Binary: 把文件当成二进制的方式传输
GraphQL:?
Pre-request Script:请求之前的脚本(参数定义)
Tests:请求后的断言(响应参数的提取,用于接口关联)
【response 页签】
Body 返回的信息
pretty 各种格式查看返回数据
Raw 文本格式
Preview 网页预览
mock server
背景:前端已经开发完成,后端的接口没有完成,前端走流程必须依赖 后端(例如联调,)
对接三方 或下游接口 不可用,上游走流程必须依赖 下游接口 (例如调保司接口,获取保司的保单号A,再用A创建理赔)
因此,需要测试 自己去mock接口 (开发接口(postman提供mock server服务)) 来进行流程验证。
refer to: https://www.bilibili.com/video/BV1r14y1A7MQ?p=13&vd_source=8c511af054d2d9daf9ba0c04e53137c8
- 需要填写request method、request URL(API path)、Response code\ Body 、mockServerName,会返回mock Server URL
- 在collection 可查看到mock API,可以调用 它:mock Server URL+request URL
------------------------------------------------------------------------------------------------------------------
三、接口参数化
通过postman做接口测试,脚本要实现:
1.参数关联、动态传参
2. 断言
批量执行(premium mapping,接口功能用例(测试数据放于csv文件))、MD5加密。
1.参数关联 或动态传参
在Tests 编写JavaScript脚本,提取响应结果的目标参数,并设置为全局变量(变量名: token),再用到该参数时使用该变量{{token}}
第一种方式:JSON 提取器
第二种方式:正则表达式提取器
//打印响应结果 javaScript
console.log(responseBody);
//JSON提取器
//把返回的结果转化成JSON对象
var jsdata=JSON.parse(responseBody);
//提取指定key的value
console.log(jsdata.key);
token=jsdata.key;
//把获取到的token设置为全局变量
pm.globals.set('token',token);
//正则表达式提取
//原始字符串{"token":"adklklksddaddf"}
//新建正则表达式
var data2=responseBody.match(new RegExp("token":\"(.*?)\""));
console.log(data2);
token2=data2[1];
//把获取到的token设置为全局变量
pm.globals.set('token2',token2);
-----------------------------------------------------------------------------------------------------
全局变量 和 环境变量
//全局变量的使用 双{}加变量名 {{token}}
//而环境变量作用:可以让接口在多种环境中测试,环境变量的使用 也是双{}加变量名 {{token}}
----------------
postman内置动态参数的使用
{{$timestamp}} 自动生成当前时间的时间戳
{{$randomint}} 生成0-1000的随机数(很少用,1000次可能会重复)
{{$guid}} 生成一个guid长字符串随机数(长度很长)
#很多时候不用内置的,自定义动态参数才能满足使用
#自定义时间戳
var times=Date.now();
//把时间设置为全局变量
pm.globals.set('time',times);
====================== postman内置函数
------------------
#接口业务闭环:指新增测试数据--测试业务功能--最后删除测试数据(恢复环境)
- 2. 断言
增加程序的健壮:
若返回status 200才进行参数提取;
使用动态断言(断言业务关键字是动态参数化)
refer to : https://www.bilibili.com/video/BV1r14y1A7MQ?p=9&spm_id_from=pageDriver&vd_source=8c511af054d2d9daf9ba0c04e53137c8
- Postman数据驱动 或 批量执行: TXT\ CSV\ Json文件
说明 :上传文件的表头就是变量名,request body 需要 设置取值为动态参数传值
postman 批量执行测试用例 关于文件上传接口 在批量运行时报错的解决方案:
1. 改变设置
2. 把上传的文件复制到postman files目录下
step1 选择 run colletion 或 run folder 可以打开run 批量运行配置
step2 上传文件 可以是txt 或csv文件
step3 可以预览 文件(若有乱码,需要调整txt保存格式),设置间隔时间 1s , 然后点击Run
说明 :上传文件的表头就是变量名,request body 需要 设置取值为动态参数传值
- Postman md5加密
-----------------------------------------------------------------------------------------------------
Q: 接口签名的测试, secretKey 密钥怎么生成
- postman接口测试加密 和解密
目前市面上有哪些加密和解密
1.对称加密(私钥加密): DES AES BASE64加密算法-->可以直接解密
“输入要加密的字符串”-->得到密文--》可直接解密
2.非对称加密(双钥加密): RSA加密算法,有公钥加密就用私钥解密, 或用私钥加密就用公钥解密 (所以说有两把钥匙)
用1个秘钥密码,获得公钥和私钥
之后“输入要加密的字符串”+“公钥”---》得到密文--》“输入私钥”对密文 可以解密。
3.只加密不解密: MD5加密, SHA1系列,SH256……
4.很多系统会把以上算法进行组合形成新的自定义算法。
------------------
- 场景1:登陆接口 传参用加密串
登陆接口 account 和 password,要求md5 加密后的字符串传输,增强数据传输安全
1、用约定的私钥,前端调接口先获取私钥,前端用私钥+ account--》加密, 后端用私钥进行解密 AES
2、用约定的私钥,前端调接口先获取私钥 ,前端用生成的公钥+ account-->加密,后端用生成的私钥进行解密 RSA
- 场景2:接口调用简单校验,才可调用
用约定的密文格式(例如MAchine-YY-MM-DD)加密,MD5加密 后端对比 加密串是否匹配(because它不支持解密),匹配可继续使用
//postman的MD5加密 获取32为 大写的密文
var screteKey = CryptoJS.MD5("admin").toString().toUpperCase();
//设置为全局变量
pm.globals.set('screteKey',screteKey);
refer to :https://www.bilibili.com/video/BV1r14y1A7MQ?p=14&vd_source=8c511af054d2d9daf9ba0c04e53137c8
-----------------------------------
另外一个思路 写代码测试,可以引用开发的jar包
接口加密如何处理的?
首先要确认使用的是什么类型的加密方式?摘要算法:MD5、SHA1 对称加密对称加密算法:AES、DES,非对称加密算法:RSA
1、找开发确认加密的算法
2、让开发打一个jar包
3、测试代码工程中引入,如果是Jmeter这样的工具也可以通过引入Jar包的方式
-
postman获取当前时间\日期格式化
方法一
var myDate=new Date(); # 获取当前时间戳 13位
var timestamp=new Date().toString().subStr(0,10); # 获取当前时间戳 10位
var year = myDate.getFullYear(); # 获取年份
var month = myDate.getMonth() + 1; # 获取月份
var date = myDate.getDate(); # 获取日期
方法二
var moment = require('moment'); # 获取时间
var data = moment().format("YYYY-MM-DD HH:mm:ss"); # 定义时间格式
console.log(data);
var moment = require('moment');
var data1 = moment().format("YYYY-MM-DD HH:mm:ss");
console.log(data1); //2023-09-08 15:48:39
var data2 = moment().format("YYYY/MM/DD HH:mm:ss");
console.log(data2); //2023/09/08 15:50:08
var data3= moment().format("DD/MM/YYYY");
console.log(data3); //08/09/2023
https://www.cnblogs.com/A-101301300518/p/15719201.html
- postman获取未来时间 时间移位
//获取当前时间 1年后 365天的日期 ==8760 hours
//获取当前时间 10分钟后的时间
-----------------------------------------------------------------------------------------------------
-
postman 常用的操作汇总
//获取时间戳 自定义时间戳
var times=Date.now(); //13位
var timestamp=new Date().toString().subStr(0,10); # 获取当前时间戳 10位
//获取日期格式化
var moment = require('moment');
var data1 = moment().format("YYYY-MM-DD HH:mm:ss");
console.log(data1); //2023-09-08 15:48:39
//获取当前时间 1年后 365天的日期 ==8760 hours
var data4 = moment().add(8760,'H').format("YYYY-MM-DD"); //2023-09-08 +365天= 2024-09-07
------------------
//JSON提取器
var jsdata=JSON.parse(responseBody);
console.log(jsdata.key);
token=jsdata.key;
pm.globals.set('token',token);
//正则表达式提取
//新建正则表达式
var data2=responseBody.match(new RegExp("token":\"(.*?)\""));
var data2=responseBody.match(new RegExp("Unix-Time\":(.+?)}"));
console.log(data2);
token2=data2[1];
//把获取到的token设置为全局变量
pm.globals.set('token2',token2);
-----------------------
pm.globals.get("variable_key"); //帮助我们在Pre-req前置\Tests后置脚本 获得全局变量,因为在Tests后置脚本不能通过{{parm}} 获取全局变量的值
-------------
//postman的MD5加密 获取32为 大写的密文
var screteKey = CryptoJS.MD5("admin").toString().toUpperCase();
//设置为全局变量
pm.globals.set('screteKey',screteKey);
------------------
参数拼接
//在Pre-req 或 Test 参数拼接 parm1=参数名+'string'
var test1 = moment().format("YYYY-MM-DD"); //定义时间格式
var test2 = test1+'123'; // 可行
在header 或 Body 参数拼接 直接引用{{parm}}
"protection_id": "20231{{currentTime2}}",
"invoice_number": "INV{{currentTime2}}",
-----------------------------------------------------
接口自动化如何上传文件?
只需要使用RESTAssured提供的multiPart方法,参数指定对应文件即可。
接口测试考虑方向
必填字段:请求参数必填项、可选项
合法性:输入输出合法、非法参数
边界:请求参数边界值等
容错能力:大容量数据、频繁请求、重复请求(如:订单)、异常网络等的处理
响应数据校验:断言、数据提取传递到下一级接口…
逻辑校验:如两个请求的接口有严格的先后顺序,需要测试调转顺序的情况
性能:对接口模拟并发测试,逐步加压,分析瓶颈点
安全性:构造恶意的字符请求,如:SQL注入、XSS、敏感信息、业务逻辑(如:跳过某些关键步骤;未经验证操纵敏感数据)