当前位置: 首页 > wzjs >正文

上海企业建站推荐ASP.NET实用网站开发答案

上海企业建站推荐,ASP.NET实用网站开发答案,白河网站制作,wordpress帖子增强文章目录 背景要求思路具体实现步骤:一、请求服务地址相同的情况二、请求服务地址不同的情况 针对重构项目,如何利用Postman快速对比出新旧接口之间的差异? 背景 因为Pytho语言的本身执行速度不够快,随着平台的活跃用户越来越多&a…

文章目录

  • 背景
  • 要求
  • 思路
  • 具体实现步骤:
    • 一、请求服务地址相同的情况
    • 二、请求服务地址不同的情况

针对重构项目,如何利用Postman快速对比出新旧接口之间的差异?

背景

因为Pytho语言的本身执行速度不够快,随着平台的活跃用户越来越多,用户体量突然暴增,对系统的要求就更高,这个业务代码已经迭代和维护了4年左右的时间,决定启动重构项目,公司上层决定将整个支付中台从Python语言转换成Go语言来实现。

要求

对外提供的接口要保持原样输出,接口入参格式和请求路径均与原来保持一致,请求服务地址不一样。尽可能的做到对下游无感知。设计到的接口改动比较多 ,大概有好几百个的样子吧。如果接口返回结构不一致,需要人工去确认是否对下游造成影响。

思路

由于接口数量比较多,如果自己写脚本去录入用例的话,效率估计也没这么快。swagger上面虽然支持单个接口直接调试调用,但毕竟不支持对比,而且也不好做批量执行,万一开发改了脚本之后,再回归的话,这么多接口要回归,时间上都是个问题。
于是,决定采用postman工具去实现新旧接口的对比功能。

具体实现步骤:

接口入参格式和请求路径均与原来保持一致的情况下,有下面两种情况:

一、请求服务地址相同的情况

  1. 将微服务下的所有接口导入postman中
    postman是支持导入swagger-ui的json文件的,但是可能存在版本的兼容性问题导致导入报解析错误,可以间接的借助apifox工具,先将swagger的数据导入apifox,再从apifox导出文件,然后再导入postman
  2. 在postman的前置脚本Pre-request Script中写脚本先调用旧服务的接口发送请求,然后新接口直接在postman中发送请求
    Pre request Script中的脚本参考:
var old_request = pm.request.clone();
const host = pm.environment.get("oldHost");
const port = pm.environment.get('oldPort');
old_request.update(old_request.url.host=host);
old_request.update(old_request.url.port=port);pm.sendRequest(old_request,function (error, old_response){if (error) {console.log(error);}else {if(old_response.responseSize==0) {pm.environment.set("old_response",{});} else {console.log('old_response',old_response.json()) ;pm.environment.set("old_response", old_response.json());}}
});
  1. 然后在Postman的Tests中加入断言脚本,对比新旧接口的返回结果是否一致。
    说明:
    由于重构过程中,可能部分接口没办法完全做到数据返回一致,再加上对js的用法不太熟练,这里可以采用Python脚本编写断言的脚本,思路就是:
    用python写一个后端服务,启动服务之后,对外提供几个断言的接口,然后在postman中写js发请求调用http请求去请求自己封装的python断言接口即可。
    Python服务封装接口如下:
from flask import Flask, redirect, url_for, request
import json
import deepdiffapp = Flask(__name__)@app.route('/assert_json', methods=['POST'])
def assert_json():if request.method == 'POST':# 默认返回内容return_dict = {'status_code': '200', 'message': '处理成功', 'data': None}# 判断传入的json数据是否为空if len(request.get_data()) == 0:return_dict['status_code'] = '500'return_dict['message'] = '请求参数为空'return json.dumps(return_dict, ensure_ascii=False)old_response = request.json.get("old_response")new_response = request.json.get("new_response")compare_result = deepdiff.DeepDiff(old_response, new_response, ignore_order=True)return_dict['data'] = compare_resultprint('compare_result', compare_result)# 对参数进行操作return json.dumps(return_dict, ensure_ascii=False)@app.route('/assert_array', methods=['POST'])
def assert_array():if request.method == 'POST':# 默认返回内容return_dict = {'status_code': '200', 'message': '暂不支持该格式断言,后续扩展', 'data': None}return json.dumps(return_dict, ensure_ascii=False)if __name__ == '__main__':app.run(debug=True)

在python中对比接口的话 ,采用的是deepdiff,可以很轻松的对比出返回结果为json格式的两个json的差异。
然后在Postman中的Tests脚本中调用自己的断言方法的脚本如下:

var old_response = pm.environment.get("old_response");
//console.log('old_response',old_response) ;var new_response = pm.response;if(new_response.responseSize==0) {new_response = {}} else {new_response = new_response.json();}
console.log('new_response',new_response) ;url = ''
// 判断返回结果是数组还是json,调用不同的方法去断言(转成字符串,判断是以[还是{开头)
if (JSON.stringify(new_response).toString().startsWith('{'))  {url = 'http://127.0.0.1:5000/assert_json'
} else if(JSON.stringify(new_response).toString().startsWith('[')){url = 'http://127.0.0.1:5000/assert_array'
}const compareRequest = {url: url,method: "POST",header: 'Content-Type: application/json',body: {mode: 'raw',  // 使用raw(原始)格式raw:    {"old_response": old_response,"new_response": new_response} //要将JSON对象转为文本发送}
};// 发送请求
pm.sendRequest(compareRequest, function (err, res) {compare_result = res.json().datapm.environment.set("compare_result",compare_result);
});
compare_result = pm.environment.get("compare_result")
pm.test("对比两个接口返回结果", function () {console.log("对比result:",compare_result);pm.expect(compare_result).to.eql({});
});

以上只是对比的大概思路,可以将这些脚本放置在Collections级别的Pre-requests Script和Tests中,做通用的断言。如果针对不同的接口有不同的断言的话,可以针对Collections下的接口再进行个性化的断言。按照以上的思路,可以在postman中扩展很多原本不支持的功能哟。

二、请求服务地址不同的情况

在Postman中引入jsondiffpatch
Postman 支持js语法, 本身就有封装node环境. 所以可以引入第三方js库.

具体方法如下:

  1. 在请求之前, 获取jsondiffpatch代码, 然后放入环境变量.
// 当运行多个测试用例时, 会导致文件拉去多次. // 这里做个判断, 先检查环境变量中有没有, 若有就不重新拉取var code = pm.environment.get("jsondiffpatch_code")if(!code){// 引入jsondiffpatch.jspm.sendRequest("https://cdn.jsdelivr.net/npm/jsondiffpatch/dist/jsondiffpatch.umd.min.js", (err, res)=>{if(err){console.log("error: " + err);}else{pm.environment.set("jsondiffpatch_code", res.text());}})}
  1. 执行jsondiffpatch代码
    在这里插入图片描述
 // 引入let code = pm.environment.get("jsondiffpatch_code");if(code){(new Function(code))() }

引入之后, 就可以使用jsondiffpatch了.

环境变量

*host: 新服务host
*old_host: 老服务host
jsondiffpatch_code: 用来存储jsondiffpatch代码.
old_data: 存放就接口数据.

完整代码
Pre-request-script

// 当运行多个测试用例时, 会导致文件拉去多次. 
// 这里做个判断, 先检查环境变量中有没有, 若有就不重新拉去
var code = pm.environment.get("jsondiffpatch_code")
if(!code){// 引入jsondiffpatch.jspm.sendRequest("https://cdn.jsdelivr.net/npm/jsondiffpatch/dist/jsondiffpatch.umd.min.js", (err, res)=>{// (new Function(res.text()))()pm.environment.set("jsondiffpatch_code", res.text());})
}console.log("当前url: " + pm.request.url)
// 1. 拉去旧数据, 然后进行缓存.
// 将原来的host 缓存
let host = pm.environment.get("host");
// 获取host, 为旧服务器
let oldHost = pm.environment.get("old_host");
let url = pm.request.url;
let oldUrl = url.toString().replace("{{host}}", oldHost)
let method = pm.request.method;// 发送请求
let requestParam = {url: oldUrl,method: pm.request.method,header: {...pm.request.headers},body: {...pm.request.body}
}pm.sendRequest(requestParam, (error, response) => {if(error){console.log(`request url: [${oldUrl}], error: ${error}`)}else{// 放入环境变量pm.environment.set("old_data", response.json()) }
});

Test:

// 引入
(new Function(pm.environment.get("jsondiffpatch_code")))()// 2. 对比结果集是否一致
// 旧数据
let oldData = pm.environment.get("old_data")// 如果没有拉取到旧数据, 就不进行对比. 不影响后面的逻辑
if(oldData){// 新数据let data = pm.response.json();// 数据对比var delta = jsondiffpatch.diff(oldData, data);pm.test("data diff", ()=>{if(delta){console.log(`数据不一致, 差异数据: ${JSON.stringify(delta)}`)pm.expect("数据不一致").throw();}})
}
// 删除旧数据
pm.environment.unset("old_data")

注意: 只需要在最外层引入即可.
在这里插入图片描述


文章转载自:

http://NA0ivUsC.wfbnp.cn
http://arZrxofn.wfbnp.cn
http://zPatez3H.wfbnp.cn
http://GLcQT4xi.wfbnp.cn
http://82mrJwmk.wfbnp.cn
http://qtazk015.wfbnp.cn
http://SRkMqL7T.wfbnp.cn
http://ndguuLpI.wfbnp.cn
http://ndL0UXLe.wfbnp.cn
http://boo9K2uH.wfbnp.cn
http://uVYaHjOP.wfbnp.cn
http://pH04qH6v.wfbnp.cn
http://XC8BakA1.wfbnp.cn
http://r9Uyy0gm.wfbnp.cn
http://e1Q18tuE.wfbnp.cn
http://1jLM1tSg.wfbnp.cn
http://UnnD1Vr7.wfbnp.cn
http://wGMvK0Nv.wfbnp.cn
http://cZ7vKxtg.wfbnp.cn
http://HAAxuv4e.wfbnp.cn
http://DhW6Qcb9.wfbnp.cn
http://jDfG6Yaq.wfbnp.cn
http://XqieGMBp.wfbnp.cn
http://IYh5iuUp.wfbnp.cn
http://JEiMCP9X.wfbnp.cn
http://2iI4DkQm.wfbnp.cn
http://Vq4yZZv3.wfbnp.cn
http://234gBuqi.wfbnp.cn
http://RHjRa9Ic.wfbnp.cn
http://Llh1UCYk.wfbnp.cn
http://www.dtcms.com/wzjs/715340.html

相关文章:

  • 国外特效网站邢台一天seo
  • 新乡网站开发的公司电话网站建设大概需要多少钱
  • 做ppt的素材免费网站wordpress微信公众号采集
  • 金华建设工程网站编一个公司网址
  • 系统数据库与建设网站吉安微信网站
  • 鄂州网站建设哪家专业上海企业信用网查询
  • 亳州市网站建设中企动力做的网站山西太原
  • 建设部建造师网站聊城定制化网站建设
  • 职业教育专业建设验收网站ztjs登录
  • 网站如何让百度收录做图软件官方网站
  • 兴义网站建设建筑网校排行榜
  • 长沙 汽车 网站建设什么是网络营销调研?它有什么特点?
  • 建设网站页面wordpress主题后门代码检测
  • 静态网站开发的目的如何分析网站关键词
  • 镇海建设交通局网站网站建设主流编程软件
  • 简述网站设计的原则网网站建设与设计
  • django 做的网站国内国际时事写实记录2024
  • 中国的网站做欧美风免费微信小程序模板
  • 淘宝客做连接网站吗360推广开户
  • 网站内容上传要求江西中慧城乡建设开发公司网站
  • 成都有什么好玩的吗牡丹江关键词优化
  • 网站实现多语言简洁大气企业网站
  • 论坛网站建设源码下载广东专业做网站
  • 建设网站的协议范本杭州做商业地产开什么网站好
  • 建设网站要多久的时间在线磁力搜索神器
  • wordpress网站主修改密码品牌建设经费指哪些
  • 河南省做网站的企业新手网站建设
  • 网站建设要考虑哪些方面安徽做手机网站
  • 唐山网站建设那家性价比高徐州关键词优化公司
  • 免费的网站推广怎么做效果好?qq网页版直接登录手机版