python接口自动化实现--基于requests库的统一请求封装

一、requests库请求原理

1、requests库常用请求方法(get/post/put/delete)

requests.get(url,**kwargs)
requests.post(url,**kwargs)
requests.put(url,**kwargs)
requests.delete(url,**kwargs)

2、requests库请求方法表象(将请求方法作为参数来发送接口请求)

requests.request(method,url,**kwargs)

 3、requests库请求方法本质

s = requests.session()

s.request(**kwargs)

本质是将requests.session()对象实例化,再通过实例化对象(s.request(**kwargs))发送请求。优势:可以自动关联所有请求的cookies信息。

 **kwargs 表示可变长度的字典

 **kwargs 可以代表的参数类型:

        method:请求方法

        url:请求地址

        params:请求头参数

        data:请求体参数

        json:请求json参数

        headers:请求头

        cookies:请求cookies信息

        files:文件上传

        auth:鉴权

        timeout:超时

        allow_redirects=True:请求重定向

        proxies:设置代理

        hooks:钩子

        stream:文件下载

        verify:证书验证

        cert:CA证书

 4、requests响应信息

res.text        #返回字符串格式的结果

res.json        #返回字段

res.content        #返回字节类型

res.status_code        #返回状态码

res.reason        #返回状态信息

res.cookie        #返回cookie信息

 二、requests统一请求封装

1、requests统一请求封装

#创建请求工具类
class requestUtil():
    def __init__(self):
        #通过读取配置文件获取请求头headers的useragent和cookies信息,减少代码的改动
        self.cookies = readConfig().conf_get_cookies_info('keyword')
        self.userAgent = readConfig().conf_get_userAgent_info('keyword')
        #读取extract.yaml文件内容用于二次请求封装中做接口关联
        self.extractinfo = self.get_extractinfo_extract()

    def send_all_request(self,**kwargs):
        '''
        # 统一请求封装
        '''
        #实例化请求session对象,通过session对象发送request请求
        sess = requests.session()
        self.res = sess.request(**kwargs)
        return self.res

    def request_case(self, caseinfo):
        '''
        请求二次封装,将重复代码以变量的形式存放在yaml文件中)
        :param caseinfo:测试用例
        :return:
        '''
        #请求头
        headers = {
            'User-Agent': f'{self.userAgent}',
            'Cookie': f'{self.cookies}'
        }
        #请求地址
        url = caseinfo['request']['url']
        #请求方法
        method = caseinfo['request']['method']
        request = caseinfo['request']
        variableinfo = caseinfo['variable']
        if "jsons" in request.keys():
            jsons = caseinfo['request']['jsons']
            logger.info(f"原请求体内容:{jsons}")
            if variableinfo:
                jsons[variableinfo[0]] = self.extractinfo[variableinfo[1]]
                logger.info(f"更新后请求体内容:{jsons}")
                res = requestUtil().send_all_request(url=url, method=method, json=jsons, headers=headers)
                self.write_resinfo_extract(res, caseinfo)
            else:
                res = requestUtil().send_all_request(url=url, method=method, json=jsons, headers=headers)
                self.write_resinfo_extract(res, caseinfo)
        elif "params" in request.keys():
            params = caseinfo['request']['params']
         
            if variableinfo:
                params[variableinfo[0]] = self.extractinfo[variableinfo[1]]
                logger.info(f"更新后请求体内容:{params}")
                res = requestUtil().send_all_request(url=url, method=method, params=params, headers=headers)
                self.write_resinfo_extract(res, caseinfo)
         
            else:
                res = requestUtil().send_all_request(url=url, method=method, params=params, headers=headers)
                self.write_resinfo_extract(res, caseinfo)

2、requests统一请求封装达到简化用例执行的效果

class TestCase():

    @pytest.mark.parametrize('caseinfo',[caseinfo for caseinfo in yamlUtil().read_all_testcase()])
    def test_case(self,caseinfo):
        #修改allure报告的展示样式
        allure.dynamic.suite(caseinfo['features'])
        allure.dynamic.sub_suite(caseinfo['storys'])
        allure.dynamic.title(caseinfo['titles'])
        #发送请求
        requestUtil().request_case(caseinfo)
        #获取响应内容
        requestUtil().get_resinfo_extract()
        #断言
        AssertUtil().assert_code(caseinfo['vilidate']['codes'])
        AssertUtil().assert_success(caseinfo['vilidate']['success'])

总结:实践出真知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值