基于Postman 6.1.4 Mac Native版 演示结合user_api_demo实现git
PS 最近接到任务, 要把几种基本下单接口调试和持续集成一下, 作个常规功能验证, 研究了下发现, 不一样的下单途径, 有的须要登陆(Session依赖), 有的须要验签(使用数字签名的微服务), 接口中依赖不少动态数据, 如用户id, 地址id, 工单id, 当前时间等等, 并且最重要的一点, 下单接口是异步的, 只返回事件流event_key, 特别在测试环境上, 订单处理比较慢, 须要对结果进行一个较长时间的轮询, 在选型时候, 最开始以为, 异步接口结果轮询只能用Jmeter的定时器实现, 然而我的实在不太习惯Jmeter的元件组织逻辑(拆分过碎). 遂尝试用JS + Postman进行实现.github
可行性 新版Postman 增长了Pre-request Script和Test, 使用Javascript, 而且支持Collection(测试集合)/Folder(子测试集) 级别(以下图), 功能相似与其余测框架的setUp和tearDown, 至关于具备了Fixtures功能, 能够针对不一样的Scope(范围)来进行准备和断言及清理. 算法
Postman支持的JS脚本库json
[Postman Sandbox Api参考] (https://www.getpostman.com/docs/v6/postman/scripts/postman_sandbox_api_reference)api
同时, Postman的脚本中能够读取, 设置变量, 环境变量, 全局变量, 能够读取request对象(只读)和response对象(只读)的信息, 另外, 重要的是Postman的脚本中也能够组装发送接口请求(能够实现接口依赖/接口结果验证问题)微信
实现原理: 请求中埋好参数{{sign}}->Pre-request Script生成sign, 并设置环境变量-> 发送请求 通常的延签接口都是开发给打好jar包扔给你, 本身使用Java或Jmeter调用就行, 可是, 有代码素养的测试能够本身实现签名, 这样能够更灵活.app
首先, 作一下参数化, 埋一下变量, 环境中设置了appsercret的环境变量共加密脚本使用 框架
用js实现签名算法异步
签名算法请参考user_api_demo中delUser接口文档微服务
Pre-request Script
// 链接参数 function con_params(params){ if(typeof(params) == "string") return params; else { var sort_keys = Object.keys(params).sort(); var s = ''; for(var i in sort_keys) { var k = sort_keys[i]; s += k + "=" + con_params(params[k]) + "&"; } return s; } } // 生成签名 function cal_sign(appsecret,params){ var s = con_params(params); console.log(s + "appsecret=" + appsecret); return CryptoJS.MD5(s+"appsecret="+appsecret).toString(); } var appsecret= pm.environment.get("appsecret"); // 从环境变量中获取appsecret params = JSON.parse(request.data); // 获取请求数据 delete params.sign; // 去掉sign, 获得元素请求参数 sign = cal_sign(appsecret, params); // 计算签名 pm.environment.set("sign", sign); // 添加为环境变量sign
实现原理: Session依赖: 在Pre-request Script请求登陆接口, 再发送请求时会保持Session 接口依赖: 在Pre-request Script请求依赖接口, 从接口相应中拿到须要的参数->设置为环境变量-> 请求中使用动态参数
Session依赖(须要登陆) 在须要登陆的接口的Pre-request Script中添加发送登陆请求脚本:
base_url = pm.environment.get("base_url"); // 登陆请求, Postman脚本发送表单类(urlencoded)请求方法(Baidu不到的, 官网也没有哦!) const loginRequest = { url: base_url + '/api/user/login/', method: "POST", body: { mode: 'urlencoded', urlencoded: 'name=张三&password=123456' } }; pm.sendRequest(loginRequest, function (err, res) { console.log(err ? err : res.text()); });
接口依赖 接口依赖token, 先在请求中设置动态参数token, 在Pre-request Script中请求getToken接口, 获取token并设置环境变量 Pre-request Script
appid = pm.environment.get("appid"); base_url = pm.environment.get("base_url"); pm.sendRequest(base_url+'/api/user/getToken/?appid='+appid, function (err, res) { if (err) { console.log(err); } else { token = res.text().split("=")[1]; pm.environment.set("token", token); } });
异步接口验证是接口测试中的难点之一, 一种是带获取结果状态接口的, 这里的实现原理是, 发送接口后, 在Test中用JS的setInterval实现轮询结果
Tests
event_key = pm.response.json().data.event_key; // 从响应中获取event_key base_url = pm.environment.get("admin"); // getOrderResult接口 const getOrderResult = { url: base_url + '/customer/COrder/getOrderResult', method: 'POST', body: { mode: 'urlencoded', urlencoded: 'event_key='+event_key } }; var i = 0; // 计数 // 封装一个发送请求方法,用于计数器调用 function getResult(){ pm.sendRequest(getOrderResult, function (err, res) { i += 1; if(err){ console.log(err); } else{ msg = res.json().data.msg; if(msg == 'finish' || i > 10){ // 直到msg字段由working变为finish, 设置最多轮询20次, 最多轮询一分钟 clearInterval(timer); } } }); } timer = setInterval(getResult, 3000); // 每s秒请求一次接口获取结果状态
更多学习资料请加添加做者微信:lockingfree获取