6.接口自动化之BaseAPI 基类封装(附代码)

1 封装baseAPI

  • 封装思路:
    1、为所有的业务模块提供基本的接口操作:增删改查+发送接口
    2、日志,截图都可以在基类中封装
    3、断言方法
  • 发送公共请求方法:
    def request_send(self,method,url):
    · 实际调用时,发送方法都需要传递两个参数
    · 每一个接口的数据都不一样
    · 反馈:很麻烦
    优化:
    · 思路:代码与配置分离
    · 实施:method url 可以放到一个配置文件中去--apiPathConfig.yml
    · 难点:代码如何识别对应模块、对应接口、接应参数
    · 场景分类:
    常规风格的接口格式:
    ·方法举例:增加数据接口:post,修改也是post
    ·url举例 : 增加接口 /sql 修改 /sq_admin/{id}
"""
封装思路:
    1- 为所有的业务模块提供的基本接口操作:增删改查+发送接口z
    2- 日志  截图都可以在基类里封装
    3- 断言方法
@log装饰器
def login():
    try:
        xxxxx
    except:
        log.error()
"""
#---------------封装的思路启发--------------
"""
发送公共请求方法:
    def request_send(self,method,url):
        - 实际调用发送方法必须传递2个参数,
        - 每一个接口的数据还不一样
        - 反馈:很麻烦
    优化:
        思路:代码与配置分离
        实施:method url 可以放到一个配置文件  apiPathConfig.yml
        难点:代码怎么可以识别到对应的模块、对应的接口、对应的参数
        场景分类:
            - 常规风格的接口格式
                - 方法举例: 增加数据接口: post  ;修改也是 post
                - url举例:增加接口 /sq    修改 /sq_xintian/{id}
                 
            - restful接口风格
                - 方法规则:get  post  delete  put
                - url规范: 一样的
"""
import requests
from utils.handle_yaml import get_yaml_data
import inspect
from configs.config import HOST
class BaseAPI:
    def __init__(self):
        #获取对应模块的接口信息
        self.data = get_yaml_data('../configs/apiPathConfig.yml')[self.__class__.__name__]#根据类名去获取
        print('类名是--->', self.__class__.__name__)
        print('类接口数据--->', self.data)
 
    #---------发送的公共方法-每一个接口都会调用他----------
    def request_send(self,data):
        try:
            #api_data == {'path': '/account/sLogin', 'method': 'POST'}
            api_data = self.data[inspect.stack()[1][3]]
            resp = requests.request(
                method=api_data['method'],#方法
                url=f'{HOST}{api_data["path"]}',#url
                data=data)
            return resp.json()
        except:
            pass

演示案例:

import inspect
def send():
  # inspect.stack()[1][3]  获取调用者的函数名字
  print(f---'{inspect.stack()[1][3]}调用了send()方法--')
def login():
  print('----函数login开始执行了---')
  send()

login()

执行结果:
image.png
image.png

2 封装优化思路:

1、在一个业务类里面,怎么使用token?

  • 场景:每一个接口都需要传递token,但是不希望每一个都去穿token--->可以使用---> def init() 做到(如果不用改方法,自己写,则需要每个都调用)
    2、在业务类中,怎么使用token?可以全部卸载baseAPI中,后续的类继承即可获取
    3、把一些常规的接口封装在基类中
    4、如果登录模块不需要token,怎么处理?

优化版本如下:

"""
封装思路:
    1- 为所有的业务模块提供的基本接口操作:增删改查+发送接口
    2- 日志  截图都可以在基类里封装
    3- 断言方法
@log装饰器
def login():
    try:
        xxxxx
    except:
        log.error()
 
"""
#---------------封装的思路启发--------------
"""
发送公共请求方法:
    def request_send(self,method,url):
        - 实际调用发送方法必须传递2个参数,
        - 每一个接口的数据还不一样
        - 反馈:很麻烦
    优化:
        思路:代码与配置分离
        实施:method url 可以放到一个配置文件  apiPathConfig.yml
        难点:代码怎么可以识别到对应的模块、对应的接口、对应的参数
        场景分类:
            - 常规风格的接口格式
                - 方法举例: 增加数据接口: post  ;修改也是 post
                - url举例:增加接口 /sq    修改 /sq_xintian/{id}
                 
            - restful接口风格
                - 方法规则:get  post  delete  put
                - url规范: 一样的
"""
import requests
from utils.handle_yaml import get_yaml_data
import inspect
from configs.config import HOST
class BaseAPI:
    def __init__(self,token=None):
        if token:#需要token业务
            self.header = {'Authorization': token}
        else:#登录业务
            self.header = None
        #获取对应模块的接口信息
        self.data = get_yaml_data('../configs/apiPathConfig.yml')[self.__class__.__name__]#根据类名去获取
        #print('类名是--->', self.__class__.__name__)
        #print('类接口数据--->', self.data)
 
    #---------发送的公共方法-每一个接口都会调用他----------
    def request_send(self,data=None,params=None,files=None,id=''):
        try:
            #api_data == {'path': '/account/sLogin', 'method': 'POST'}
            api_data = self.data[inspect.stack()[1][3]]
            resp = requests.request(
                method=api_data['method'],#方法
                url=f'{HOST}{api_data["path"]}{id}',#url
                data=data,
                params=params,
                files=files,
                headers=self.header)
            return resp.json()
        except:
            pass
    # 此处的放松方法包含了多种方式,如:
    #方法为post ,put,使用data,--新增/修改/更新
    #方法为get,使用params,--查询
    #方法为delete ,使用id--删除
    
    #------增删改查----------------------------
    def query(self,data):
        return self.request_send(params=data)
 
    #---增加数据接口---
    def add(self,data):
        return self.request_send(data=data)
 
    #---更新数据接口---
    def update(self,data):
        return self.request_send(data=data)
 
    #---删除数据接口---通过id
    def delete(self,id):
        return self.request_send(id=id)
    """
    第一种写法  shop/xt?id=100
    常见用法 shop/100
    """
    #------文件上传-----
    """
    Content-Disposition: form-data; name="file"; filename="QQ截图20200724100920.png"
Content-Type: image/png
     
    文件上传格式: 文件路径、文件名、文件类型
    路径: xx/123.png
    {‘file’:(文件名,文件对象本身,文件类型)}---转化
    {‘file’:('123.png',open('xx/123.png','rb'),'png')}
    """
    def file_upload(self,file_path:str):
        #1-获取文件名
        file_name = file_path.split('/')[-1]
        #2-文件类型
        file_type = file_path.split('.')[-1]
        file = {'file':(file_name,open(file_path,'rb'),file_type)}
        #3-发送请求
        return self.request_send(files=file)
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,208评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,502评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,496评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,176评论 1 302
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,185评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,630评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,992评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,973评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,510评论 1 325
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,546评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,659评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,250评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,990评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,421评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,569评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,238评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,732评论 2 366

推荐阅读更多精彩内容

  • 为什么学习Python? 通过什么途径学习的Python? 上网收集视频,资料 关注公证号 买教程,书籍 Pyth...
    130920阅读 1,231评论 0 0
  • 1、谈谈对http协议的认识流程:1.域名解析域名解析检查顺序为:浏览器自身DNS缓存---》OS自身的DNS缓存...
    Zzmi阅读 721评论 0 0
  • 转自 李英俊小朋友千锋Django学习笔记[https://www.cnblogs.com/lyjun/p/158...
    米不开朗基罗阅读 307评论 0 0
  • 基于类的视图 Django中的视图是一个可调用对象,它接收一个请求然后返回一个响应。这个可调用对象不仅仅限于函数,...
    兰山小亭阅读 4,583评论 1 13
  • 1.Difference between shallow copy and deep copy?浅复制和深复制的区...
    小枫123阅读 357评论 1 0