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

  1. 需要填写request method、request URL(API path)、Response code\ Body 、mockServerName,会返回mock Server URL
  2. 在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":\"(.*?)\""));

var data2=responseBody.match(new RegExp("Unix-Time\":(.+?)}"));   //原始串 {"authorization": "H36ZErhV=", "Unix-Time": 1694084075}

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内置函数

pm.environment.get("variable_key");
pm.globals.get("variable_key");  //帮助我们在Pre-req前置\Tests后置脚本 获得全局变量,因为在Tests后置脚本不能通过{{parm}} 获取全局变量的值
pm.variables.get("variable_key");
pm.collectionVariables.get("variable_key");
pm.environment.set("variable_key", "variable_value");
pm.globals.set("variable_key", "variable_value");
pm.collectionVariables.set("variable_key", "variable_value");
pm.environment.unset("variable_key");
pm.globals.unset("variable_key");
pm.collectionVariables.unset("variable_key");

 

------------------

#接口业务闭环:指新增测试数据--测试业务功能--最后删除测试数据(恢复环境)

  •  2. 断言

增加程序的健壮:

若返回status 200才进行参数提取;

使用动态断言(断言业务关键字是动态参数化)

//断言
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);   //断言状态码为 200
});
pm.test("Body matches string", function () {
    pm.expect(pm.response.text()).to.include("string_you_want_to_search");  //断言返回的body中包含有字符串**
});
pm.test("Your test name", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.value).to.eql(100);    //断言JSON中 的其中的一个值 
});

pm.test("Body is correct", function () {
    pm.response.to.have.body("response_body_string");  //断言返回的body 正确
});
//动态断言
在Test页签里面不能通过{{}} 方式取得全局变量,可以通过以下方式获取:
1. pm.globals.get("token")
2. globals["token"]
3. globals.token
参数拼接:“testLable”+pm.globals.get("token")

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 密钥怎么生成

{
    "secretKey":"{{secretKey}}", // secretKey 密钥由 指定明文 用md5 加密获得 (因此需要先用接口生成 密钥)
    "type": "TRAVEL_test",
    "randomStr": "WUSNKDMCDSQEYOYW",
    "uniqCode": "{{autoClaimID}}"     //对业务的关键ID(例如claim id\ policyNO) 进行签名,有签名验证通过才能执行业务操作
}
A:目前解决方案1:调Md5 官网接口,接口response有 加密后的串,需要提取出来, 问题点 怎样在HTML 提取目标参数;
      目前解决方案2:用postman 对明文 进行md5 加密,获取密钥, postman有现成的方法
  • 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

var data4 = moment().add(8760,'H').format("YYYY-MM-DD"); //2023-09-08 +365天= 2024-09-07 
console.log(data4); 

 //获取当前时间 10分钟后的时间

var data5 = moment().add(10,'m').format("YYYY-MM-DD HH:mm:ss");
console.log(data5); 
 

-----------------------------------------------------------------------------------------------------

  • 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、敏感信息、业务逻辑(如:跳过某些关键步骤;未经验证操纵敏感数据)

posted @ 2023-08-22 10:57  幸福在今天  阅读(86)  评论(0编辑  收藏  举报