范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python接口自动化装饰器的大用处

  事情是这样,我们正在编写接口自动化用例。因为基本上都是复杂的场景测试。
  例如测试支付业务的过程: 用户登录 加入购物 下单 支付
  也就是说,如果你想测试支付业务,大概必须要调用前面三个接口。那么我们就需要把前面三个接口进行封装。以用户登录为例。 import json import requests   class UserLogin:      def __init__(self, username, password):         self.username = username         self.password = password      def get_token(self):         """获取用户登录token"""         url = "http://httpbin.org/post"          data = {             "username": self.username,             "password": self.password,             "token": "token123"  # 假装这是接口返回的toKen         }         r = requests.post(url, data=data)          if r.status_code != 200:             raise ValueError("接口请求失败")                  try:             r.json()         except json.decoder.JSONDecodeError:             raise ValueError("接口不是json格式")          if r.json()["headers"]["Host"] != "httpbin.org":             raise ValueError("接口返回必要参数错误")                  token = r.json()["form"]["token"]         return token   if __name__ == "__main__":     user_login = UserLogin("zhangsan", "mima123")     token = user_login.get_token()     print(token)
  单看接口这么封装,貌似没有问题~!但每个接口调用之后都需要经历以下过程: 判断状态码是否为  200  ,如果不是 200   说明接口不通。仅接着判断返回值格式是否为  JSON  ,如果不是,你就无法提取数据。检查接口返回的必要参数,例如: r.json()["headers"]["Host"]  。提取接口返回的数据。例如:  r.json()["form"]["token"]  。python装饰器
  装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他有助于让我们的代码更简短,也更Pythonic。
  这里就不领着大家一步步推演如何创建一个装饰器,直接看例子。 装饰器 def dec():     """     python装饰器     """     def decorator(func):                  def wrapper(*args, **kwargs):             func_name = func.__name__             print(f"被装饰的方法名: {func_name}")             print(f"方法的入参 args: {args}")             print(f"方法的入参 kwargs: {kwargs}")              r = func(*args, **kwargs)             print(f"方法的返回值 return: {r}")          return wrapper      return decorator
  装饰器的架子大概长这个样子,重点在装饰器的入参和返回值。 用法  @dec() def add(a, b):     c = a + b     return c   add(1, 2)
  调用 @dec()  装饰器来装饰一个add()   函数
  运行结果 被装饰的方法名: add 方法的入参 args: (1, 2) 方法的入参 kwargs: {} 方法的返回值 return: 3
  这个装饰器可以拿到被装饰函数的 名字  、入参  、返回值  ,是不是很有意思。接口检查装饰器check_response() 装饰器实现 import json from jmespath import search   def check_response(         describe: str = "",         status_code: int = 200,         ret: str = None,         check: dict = None,         debug: bool = False):     """     checkout response data     :param describe: interface describe     :param status_code: http status code     :param ret: return data     :param check: check data     :param debug: debug Ture/False     :return:     """     def decorator(func):         def wrapper(*args, **kwargs):             func_name = func.__name__             if debug is True:                 print(f"Execute {func_name} - args: {args}")                 print(f"Execute {func_name} - kwargs: {kwargs}")              r = func(*args, **kwargs)             flat = True             if r.status_code != status_code:                 print(f"Execute {func_name} - {describe} failed: {r.status_code}")                 flat = False              try:                 r.json()             except json.decoder.JSONDecodeError:                 print(f"Execute {func_name} - {describe} failed:Not in JSON format")                 flat = False              if debug is True:                 print(f"Execute {func_name} - response:  {r.json()}")              if flat is True:                 print(f"Execute {func_name} - {describe} success!")              if check is not None:                 for expr, value in check.items():                     data = search(expr, r.json())                     if data != value:                         print(f"Execute {func_name} - check data failed:{value}")                         raise ValueError(f"{data} != {value}")              if ret is not None:                 data = search(ret, r.json())                 if data is None:                     print(f"Execute {func_name} - return {ret} is None")                 return data             else:                 return r.json()          return wrapper      return decorator 核心就是在前面 @dec()   装饰器的架子上扩展,增加参数和返回值校验。代码引用了 jmespath   库,主要是为了提取数据。使用 import requests  class UserLogin:      def __init__(self, username, password):         self.username = username         self.password = password      @check_response("获取用户登录token", 200, ret="form.token", check={"headers.Host": "httpbin.org"}, debug=True)     def get_token(self):         """获取用户登录token"""         url = "http://httpbin.org/post"          data = {             "username": self.username,             "password": self.password,             "token": "token123"  # 假装是接口返回的toKen         }         r = requests.post(url, data=data)         return r   if __name__ == "__main__":     user_login = UserLogin("zhangsan", "mima123")     token = user_login.get_token()     print(token)
  通过 @check_response()   装饰被调用接口,可以极大的简化代码。参数说明:获取用户登录token  : 接口描述。200  : 检查接口返回值状态码是否为 200  。ret="form.token"  : 提取接口返回值中的token  ,通过jmespath  。check={"headers.Host": "httpbin.org"}  : 检查接口返回值中包含的参数。相当于对接口数据进行断言。debug=True  : 开启debug,打印详细信息,方便调试。
  运行信息 Execute get_token - args: (<__main__.UserLogin object at 0x000001EF4397E1C0>,) Execute get_token - kwargs: {} Execute get_token - response:  {"args": {}, "data": "", "files": {}, "form": {"password": "mima123", "token": "token123", "username": "zhangsan"}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "49", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.25.0", "X-Amzn-Trace-Id": "Root=1-62682337-2cd21bd0599368e54d2063bd"}, "json": None, "origin": "173.248.248.88", "url": "http://httpbin.org/post"} Execute get_token - 获取用户登录token success! token123
  有了这个小小的装饰器,我们减少了很多相同的样例代码。

理想汽车发布财报首次实现盈利,四季度营收增长65中国造车新势力之一理想汽车报告2020年第四季度净利润1。075亿人民币,其在中国市场的营收增长抵消了高昂的生产成本。理想汽车是三大造车新势力中第一个发布财报的公司,蔚来汽车和小鹏91十条新能源汽车行业的每日必读简报(210301)中国消费者协会公布2020年全国消协组织受理投诉情况分析,汽车及零部件在2020年以全年34897的投诉量排第二位,仅次于食品行业。2。特斯拉(上海)有限公司经营范围新增新能源汽车91十条新能源汽车行业的每日必读简报(210302)1戴姆勒卡车和沃尔沃集团宣布组建的合资公司正式组建完成,原本公司名为DaimlerTruckFuelCellGmbHCo。KG,现双方同意更改为cellcentricGmbHCo。全球最快的磁吸无线充电出自真我,这次realme走在所有大厂的前面对于realme这个品牌,给大家的印象一向都是不断推出一些性比价的手机,说白了就是跟小米一样,都是以性价比的产品而为人熟知。但realme只会做性比价吗?显然不是,不久前realmJ。D。POWER最佳认证的车企翻车,起亚召回38万辆汽车韩系车在国内越来越没有存在感。不过不得不承认,韩系车在全球的表现仍然可圈可点,尤其是在质量稳定性方面,一直受到业界与消费者认可。根据J。D。POWER发布的2019年美国新车质量研91十条新能源汽车行业简报大众纯电汽车明年销量或超特斯拉1美系车电动化动作加快,福特推出了纯电动版MustangMachE车型,GT版本最大功率为342kW,峰值扭矩830Nm,百公里加速仅为3。5秒。2芜湖奇瑞信息技术有限公司宣布,奇大众汽车全面停止燃油车研发,2025年称霸全球电动车市场作为电动汽车时代的开启者,特斯拉在全球拥有品牌和市场先发优势,这一点已经充分体现在了销量上。与此同时,作为燃油车时代的霸主,大众汽车在电动汽车时代动作迟缓。如今,大众汽车也已经开始关于2020年注册亚马逊全球开店的非官方消息据亚马逊非官方的消息,亚马逊已经暂停贸易商下发注册链接,也就是说,现在想拿到注册链接,必须至少有商标注册。不过,注册链接也会越来越少,门槛越来越高,已经8月31号了哦,哥哥9月份想91十条新能源汽车行业的每日必读简报(210311)1五菱汽车官方宣布,演员任敏马伯骞将出任宏光MINIEV代言人,新车官图也一同公布。2大众集团首席战略官MichaelJost将离职,他给出的理由是现在智能化变革已经轮到轮船领域,91十条中国出口澳大利亚汽车暴涨,创维表示将再投入300亿造车1长安汽车计划加大新能源领域的布局,未来将有26款纯电动车型陆续推出,其中内部代号分别为E11和C385的两款主打智能化的车型有望在年内亮相。这26款新车包括长安品牌8款插电混动车91十条高通汽车订单超80亿美元,博世在华年收入达888亿元1高通表示,目前全球有超过1。5亿辆汽车采用高通汽车解决方案,25家顶级车企有20家用了高通骁龙数字座舱平台。高通汽车解决方案订单总估值超80亿美元,包括车载网联信息娱乐和车内连接
浙大团队科学再发文!解密如何利用电场控制氧化物界面超导铝酸镧(LaAlO3)和钽酸钾(KTaO3)是两种绝缘体,但当它们组合在一起时,界面就能导电甚至出现超导现象。这种刚刚问世的界面超导引发了科学家强烈的兴趣,来自浙江大学物理学系中科马斯克疯狂割韭菜,特斯拉刹车失灵事故频发,细数特斯拉三大阴谋美国时间5月12日,特斯拉CEO马斯克突然在社交媒体宣布,特斯拉已经叫停用比特币购车。他甚至还担心比特币挖矿会造成环境污染。What?我满脸问号好不啦!力挺比特币的是你,赚得盆满钵Concept设想了一种全新的iPhone缺口方法我们预计今年iPhone的缺口会更小,但一位设计师将这一概念与全新的缺口整合在一起。设计师安东尼奥德罗莎(AntonioDeRosa)不想将中央槽口容纳诸如前置摄像头和FaceID微信加入全新状态,QQ加入绿色狗头等多款全新表情近期,微信QQ都进行了更新,只不过这次并非版本上的更新。比如微信只是在状态中加入了冲的状态,而QQ只是加入了十款最新的黄脸表情。根据微信官方的描述,微信的新状态冲是根据吴亦凡在舞台微信新增冲状态QQ上线菜狗等新表情微信新增状态冲微信新版本V8。0中,上线了微信状态功能,用户可以通过设置状态来时时分享目前的心情,可以上传图片,音乐,视频,但是每一条状态的保留时间为24小时,超过时间后就自动消失在线教育产品如何让用户主动分享?在线教育产品要想高效实现引流变现,一定要让用户产生主动分享的欲望,才能快速达到产品裂变传播的效果。那么,如何激发用户主动分享呢?下面,通过分析用户分享行为背后的逻辑,并且结合创客匠小米新空调产品再一次击穿行业低价,这是不给同行活路?在如今的手机市场,由于智能手机科技达到了十分成熟的地步,以至于很多国内主流的手机品牌都往其他领域发展,尤其是家电领域,其中就包括电视冰箱空调等。而就在前些日子,小米就发布了一款空调国际观察美国标榜言论自由的耻辱与尴尬来源人民网国际频道原创稿近日,据英国卫报网站报道,美国社交媒体巨头脸书的监督委员会宣布,将继续维持美国前总统特朗普脸书账号的封禁状态。这对有意在四年后东山再起的特朗普而言,又是一记爆料iPadmini6会有2个版本?苹果产品线料重新规划,你选哪个?前言在阅读这篇文章之前,请大家关注订阅我的频道。我的写作动力,完全来自于大家的支持!好内容天天有,关注不迷路!iPadmini6概念图文江湖事务所浆糊狼中上一代iPadmini5是数字人民币接入支付宝,多家上市公司秀产品5月10日,数字人民币接入支付宝的新闻带给投资者无限遐想,近期多只概念股走强,不少上市公司也通过交易所互动平台回复了投资者关于数字人民币的问题,内容不仅涉及和银行的合作,更有公司已瞄准固态激光雷达市场!这家扬州公司的OPA芯片取得新突破第一代产品有望年内推出科创板日报(上海,记者吴凡)讯,近年随着自动驾驶需求的不断提升,以摄像头主导的纯视觉方案在精度稳定性和视野上逐渐暴露出局限性,无法满足L4L5级自动驾驶需要的安全级别,而激光雷达相