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

建设银行手机银行银行下载官方网站二维码网页制作免费网站制作

建设银行手机银行银行下载官方网站,二维码网页制作免费网站制作,北京搜索引擎关键词优化,wordpress主题regal 免费目录 前言 直接使用 优化 封装 小结 进阶 总结 资料获取方法 前言 记录Json断言在工作中的应用进阶。 直接使用 很早以前写过一篇博客#xff0c;记录当时获取一个多级json中指定key的数据#xff1a; #! /usr/bin/python # coding:utf-8 aut…目录 前言 直接使用 优化 封装 小结 进阶 总结 资料获取方法 前言 记录Json断言在工作中的应用进阶。 直接使用 很早以前写过一篇博客记录当时获取一个多级json中指定key的数据 #! /usr/bin/python # coding:utf-8 author:Bingo.he file: get_target_value.py time: 2017/12/22 def get_target_value(key, dic, tmp_list)::param key: 目标key值:param dic: JSON数据:param tmp_list: 用于存储获取的数据:return: listif not isinstance(dic, dict) or not isinstance(tmp_list, list): # 对传入数据进行格式校验return argv[1] not an dict or argv[-1] not an list if key in dic.keys():tmp_list.append(dic[key]) # 传入数据存在则存入tmp_listfor value in dic.values(): # 传入数据不符合则对其value值进行遍历if isinstance(value, dict):get_target_value(key, value, tmp_list) # 传入数据的value值是字典则直接调用自身elif isinstance(value, (list, tuple)):_get_value(key, value, tmp_list) # 传入数据的value值是列表或者元组则调用_get_valuereturn tmp_listdef _get_value(key, val, tmp_list):for val_ in val:if isinstance(val_, dict): get_target_value(key, val_, tmp_list) # 传入数据的value值是字典则调用get_target_valueelif isinstance(val_, (list, tuple)):_get_value(key, val_, tmp_list) # 传入数据的value值是列表或者元组则调用自身优化 后来在写用例生成过程中发现重复的断言描述信息较多大多数数据返回其实都是标准的json所以将整个返回的json放到断言数据中 continue_run_flag Truedef assert_json(base, juge, contain(), reg()):# 返回值不符合预期时会设置为Falseflag Truefor key, value in base.items():# 不进行断言的数据不进一步处理if key not in juge:continueif key in COMMON_RE_CHECK:if not re.match(COMMON_RE_CHECK[key], base[key]):flag Falselogger.error(字段[{}]使用通用的正则匹配不符合预期预期正则匹配【{}】 【{}】.format(key, COMMON_RE_CHECK[key], juge[key]))else:logger.warning(字段【{}】使用通用字段的正则匹配, 符合预期.format(key))continueif key in contain:if str(value) not in juge[key]:flag Falselogger.error(字段[{}]不符合预期预期【{}】包含 【{}】.format(key, juge[key], value))continuelogger.info(字段[{}]符合预期预期[{}] 包含 [{}].format(key, juge[key], value))continueif key in reg:if not re.match(juge[key], value):flag Falselogger.error(字段[{}]不符合预期预期正则匹配【{}】 【{}】.format(key, value, juge[key]))continuelogger.info(字段[{}]断言成功:预期[{}] 实际[{}].format(key, value, juge[key]))continueif isinstance(value, str) or isinstance(value, int):if juge[key] ! value:logger.error(字段[{}]不符合预期预期【{}】! 实际【{}】.format(key, value, juge[key]))flag Falsecontinueelif isinstance(value, dict):assert_json(value, juge[key], containcontain, regreg)elif isinstance(value, list):for i, v in enumerate(value):if isinstance(value, str) or isinstance(value, int):if v ! juge[key][i]:logger.error(字段[{}]不符合预期预期【{}】! 实际【{}】.format(key, value, juge[key]))else:logger.info(字段[{}]断言成功:预期[{}] 实际[{}].format(key, value, juge[key]))elif isinstance(value, dict):assert_json(value[i], juge[key][i], containcontain, regreg)else:assert_json(value[i], juge[key][i], containcontain, regreg)else:passlogger.info(字段[{}]符合预期: 预期[{}] 实际[{}].format(key, value, juge[key]))# 失败是否继续执行默认为TRUEif not continue_run_flag:assert flagreturn flag调用 rsp requests.get(http://localhost:8800/get, params{name: bingo, age: 18}).json() assert_json(rsp, {args: {name: bingo},headers: {Accept: */*,Accept-Encoding: gzip, deflate,Cache-Control: max-age259200,Host: httpbin.org,User-Agent: python-requests/2.27.1,X-Amzn-Trace-Id: rRoot\d-\w{8}-\w{24}},req_param: [{name: bingo,age: 18}],origin: r,url: http://httpbin.org/get?namebingo }, contain(), reg(X-Amzn-Trace-Id, origin,))日志效果 2022-05-05 14:25:49.967 | INFO | __main__:assert_json:173 - 字段[name]符合预期: 预期[bingo] 实际[bingo] 2022-05-05 14:25:49.968 | INFO | __main__:assert_json:173 - 字段[args]符合预期: 预期[{name: bingo}] 实际[{name: bingo}] 2022-05-05 14:25:49.968 | INFO | __main__:assert_json:173 - 字段[Accept]符合预期: 预期[*/*] 实际[*/*] 2022-05-05 14:25:49.968 | INFO | __main__:assert_json:173 - 字段[Accept-Encoding]符合预期: 预期[gzip, deflate] 实际[gzip, deflate] 2022-05-05 14:25:49.968 | INFO | __main__:assert_json:173 - 字段[Cache-Control]符合预期: 预期[max-age259200] 实际[max-age259200] 2022-05-05 14:25:49.968 | INFO | __main__:assert_json:173 - 字段[Host]符合预期: 预期[httpbin.org] 实际[httpbin.org] 2022-05-05 14:25:49.968 | INFO | __main__:assert_json:173 - 字段[User-Agent]符合预期: 预期[python-requests/2.27.1] 实际[python-requests/2.27.1] 2022-05-05 14:25:49.968 | INFO | __main__:assert_json:149 - 字段[X-Amzn-Trace-Id]断言成功:预期[Root1-62734553-430db0707e1a3656043cd165] 实际[Root\d-\w{8}-\w{24}] 2022-05-05 14:25:49.968 | INFO | __main__:assert_json:173 - 字段[headers]符合预期: 预期[{Accept: */*, Accept-Encoding: gzip, deflate, Cache-Control: max-age259200, Host: httpbin.org, User-Agent: python-requests/2.27.1, X-Amzn-Trace-Id: Root1-62734553-430db0707e1a3656043cd165}] 实际[{Accept: */*, Accept-Encoding: gzip, deflate, Cache-Control: max-age259200, Host: httpbin.org, User-Agent: python-requests/2.27.1, X-Amzn-Trace-Id: Root\\d-\\w{8}-\\w{24}}] 2022-05-05 14:25:49.969 | WARNING | __main__:assert_json:133 - 字段【origin】使用通用字段的正则匹配, 符合预期 2022-05-05 14:25:49.969 | INFO | __main__:assert_json:173 - 字段[age]符合预期: 预期[18] 实际[18] 2022-05-05 14:25:49.969 | INFO | __main__:assert_json:173 - 字段[name]符合预期: 预期[bingo] 实际[bingo] 2022-05-05 14:25:49.969 | INFO | __main__:assert_json:173 - 字段[req_param]符合预期: 预期[[{age: 18, name: bingo}]] 实际[[{name: bingo, age: 18}]] 2022-05-05 14:25:49.969 | INFO | __main__:assert_json:173 - 字段[url]符合预期: 预期[http://httpbin.org/get?namebingo] 实际[http://httpbin.org/get?namebingo]封装 将方法简单封装到调用类中 class HttpBin:def __init__(self):self.continue_run_flag True # 失败是否继续执行self.base_url http://localhost:8800self.base_param {local_class: self.__class__.__name__}def get(self, param):path /getparam.update(self.base_param)self.rsp requests.get(self.base_url path, paramsparam)self.ans self.rsp.json()logger.info(json.dumps(self.rsp.json(), indent4))return selfdef set(self, param):path /setparam.update(self.base_param)self.rsp requests.get(self.base_url path, paramsparam)self.ans self.rsp.json()logger.info(json.dumps(self.rsp.json(), indent4))return selfdef assert_statusCode(self, result_code)::param result_code: 包含关系断言:return: bool self.rsp.resultinfo# 返回值不符合预期时会设置为Falseflag Trueif int(result_code) ! self.rsp.status_code:logger.error(f返回状态码[result_code]不符合预期预期【{result_code}】! 实际【{self.rsp.status_code}】)flag Falseelse:logger.info(f返回状态码[result_code]符合预期预期【{result_code}】! 实际【{self.rsp.status_code}】)if not self.continue_run_flag:assert flagreturn selfdef assert_json_body(self, base, juge, contain(), reg()):... 用例调用 # 如果仅仅断言状态码 HttpBin().get({name: bingo, age: 18}).assert_statusCode(200)# 级连调用多个接口使用同一个初始化数据 HttpBin().get({name: bingo, age: 18}).assert_statusCode(200).\set({name: he, age: 18}).assert_statusCode(200).assert_json_body(juge{args: {name: bingo},headers: {Accept: */*,Accept-Encoding: gzip, deflate,Cache-Control: max-age259200,Host: httpbin.org,User-Agent: python-requests/2.27.1,X-Amzn-Trace-Id: rRoot\d-\w{8}-\w{24}},req_param: [{name: he,age: 18}],origin: r,url: http://httpbin.org/set?namebingo}, contain(), reg(X-Amzn-Trace-Id, origin,))运行效果 2022-05-05 19:39:36.951 | INFO | __main__:assert_statusCode:53 - 返回状态码[result_code]符合预期预期【200】! 实际【200】 2022-05-05 19:39:36.951 | INFO | __main__:assert_json_body:117 - 字段[name]符合预期: 预期[bingo] 实际[bingo] 2022-05-05 19:39:36.951 | INFO | __main__:assert_json_body:117 - 字段[args]符合预期: 预期[{name: bingo}] 实际[{name: bingo}] 2022-05-05 19:39:36.952 | INFO | __main__:assert_json_body:117 - 字段[Accept]符合预期: 预期[*/*] 实际[*/*] 2022-05-05 19:39:36.952 | INFO | __main__:assert_json_body:117 - 字段[Accept-Encoding]符合预期: 预期[gzip, deflate] 实际[gzip, deflate] 2022-05-05 19:39:36.952 | INFO | __main__:assert_json_body:117 - 字段[Cache-Control]符合预期: 预期[max-age259200] 实际[max-age259200] 2022-05-05 19:39:36.952 | INFO | __main__:assert_json_body:117 - 字段[Host]符合预期: 预期[httpbin.org] 实际[httpbin.org] 2022-05-05 19:39:36.952 | INFO | __main__:assert_json_body:117 - 字段[User-Agent]符合预期: 预期[python-requests/2.27.1] 实际[python-requests/2.27.1] 2022-05-05 19:39:36.952 | INFO | __main__:assert_json_body:93 - 字段[X-Amzn-Trace-Id]断言成功:预期[Root1-62734553-430db0707e1a3656043cd165] 实际[Root\d-\w{8}-\w{24}] 2022-05-05 19:39:36.952 | INFO | __main__:assert_json_body:117 - 字段[headers]符合预期: 预期[{Accept: */*, Accept-Encoding: gzip, deflate, Cache-Control: max-age259200, Host: httpbin.org, User-Agent: python-requests/2.27.1, X-Amzn-Trace-Id: Root1-62734553-430db0707e1a3656043cd165}] 实际[{Accept: */*, Accept-Encoding: gzip, deflate, Cache-Control: max-age259200, Host: httpbin.org, User-Agent: python-requests/2.27.1, X-Amzn-Trace-Id: Root\\d-\\w{8}-\\w{24}}] 2022-05-05 19:39:36.953 | WARNING | __main__:assert_json_body:77 - 字段【origin】使用通用字段的正则匹配, 符合预期 2022-05-05 19:39:36.953 | INFO | __main__:assert_json_body:117 - 字段[age]符合预期: 预期[18] 实际[18] 2022-05-05 19:39:36.953 | INFO | __main__:assert_json_body:117 - 字段[name]符合预期: 预期[he] 实际[he] 2022-05-05 19:39:36.953 | INFO | __main__:assert_json_body:117 - 字段[req_param]符合预期: 预期[[{age: 18, local_class: HttpBin, name: he}]] 实际[[{name: he, age: 18}]] 2022-05-05 19:39:36.953 | INFO | __main__:assert_json_body:117 - 字段[url]符合预期: 预期[http://httpbin.org/set?namebingo] 实际[http://httpbin.org/set?namebingo]小结 可以作为独立函数使用也可以和所有的接口一起封装灵活度、复用度高用例极简且逻辑清晰支持断言失败用例继续执行开关控制方便一次性发现所有的差异极易编写的统一断言从日志获取轻松获取 用例运行日志断言数据字段清晰明确可统一化处理新版本修改字段无需修改每个用例支持正则匹配支持**包含匹配 **支持错误码直接断言集中初始化原始常用数据不同业务适配简单重写初始化方法即可 进阶 上面的方法虽然使用日志的方法记录了所有的差异但是面对大json对比的时候很难直接标记出具体的差异位置。在做现网引流对比测试的时候就出现了这样的需求从现网拉取的账户数据可能存在几百个子账户每个子账户有20多个属性字段怎么准确标记他们在新旧系统的写操作后不一致的情况成为了一个小卡点。 话不多说思路利用列表可变特性和生成器关键字yield特性递归分解json生成一个固定的数组最终比较数组中的数据 代码 def recurse(d, prefixNone, sep.):if prefix is None:prefix []for key, value in d.items():if isinstance(value, dict):yield from recurse(value, prefix [key])elif isinstance(value, list):for i, v in enumerate(value):if isinstance(v, dict):yield from recurse(v, prefix [key, f${i}])# 兼容 包含数字的类型elif isinstance(v, int) or isinstance(v, str):yield sep.join(prefix [key, str(value)]) # 会嵌套上valueelse:# print(key)yield sep.join(prefix [key, str(value)]) # 会嵌套上value效果 print(json.dumps(list(recurse({args: {name: bingo},headers: {Accept: */*,Accept-Encoding: gzip, deflate,Cache-Control: max-age259200,Host: httpbin.org,User-Agent: python-requests/2.27.1,X-Amzn-Trace-Id: rRoot\d-\w{8}-\w{24}},req_param: [{name: bingo,age: 18},{name: he,age: 19},{name: detector,age: 20}],origin: r,url: http://httpbin.org/set?namebingo})), indent4)) # 输出 [args.name.bingo,headers.Accept.*/*,headers.Accept-Encoding.gzip, deflate,headers.Cache-Control.max-age259200,headers.Host.httpbin.org,headers.User-Agent.python-requests/2.27.1,headers.X-Amzn-Trace-Id.Root\\d-\\w{8}-\\w{24},req_param.$0.name.bingo,req_param.$0.age.18,req_param.$1.name.he,req_param.$1.age.19,req_param.$2.name.detector,req_param.$2.age.20,origin.,url.http://httpbin.org/set?namebingo ]总结 项目实践中总会遇到这样那样的需求每个方法都有适用的场景直接高效解决问题是第一要务。 json查找数据json数据用例封装对比json数据转化 资料获取方法 【留言777】 各位想获取源码等教程资料的朋友请点赞 评论 收藏三连 三连之后我会在评论区挨个私信发给你们~
http://www.hkea.cn/news/14533706/

相关文章:

  • 大连城市建设网站广东品牌网站建设服务机构
  • 软工毕设做网站风云榜百度
  • 企业营销网站制作北京商场关闭通知
  • 如何利用网站开发客户工商登记信息查询平台
  • 上蔡网站建设什么网站免费做简历模板
  • 海口小学网站建设为什么做电影网站没有流量
  • 有了页游源代码如何做网站做面包有哪些网站知乎
  • 一个虚拟主机绑定2个网站专业营销网站开发
  • 网站开发概要设计模板注册营业执照名字查询系统
  • 网站说服力营销型网站策划公司宣传片如何制作
  • 马达加工东莞网站建设网站建设公司怎么开拓业务
  • 手机网站地址天水网站建设惠普
  • 广州机械网站开发建网站的公司大全
  • 游戏网站seo怎么做你做的网站可视区域多少钱
  • 小米路由可以做网站吗怎么看网站是什么程序
  • 张店制作网站app开发公司的联系方式
  • 网站建设平台价格网站建设二级菜单
  • 成都网站建设07fly网站开发周期表
  • 红河州建设局门户网站自适应wordpress博客
  • 自己做的网站怎么取sql数据青岛一点两区救治医院
  • 盐城网站建设app我的页面设计
  • 企业建设网站有什么作用软件开发图片
  • 安徽一方建设招标网站给企业做免费的推广
  • 中国铁路监理建设协会网站wordpress移动端加底部导航栏
  • 哈尔滨的网站建设公司网站建设方案总结语
  • 高碑店网站建设文化建设方面的建议
  • 国家职业技能培训平台企业网站建设与优化
  • 东营网站建设价钱表用爱奇艺会员做视频网站违法吗
  • 郑州 网站建设:微信网站制作系统
  • 一个网站的成功企业解决方案有哪些