• python3+requests库框架设计03-请求重新封装


    在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个Common文件夹,在文件夹下新建Base_test.py文件,项目结构如下。

    具体怎么封装还是要看被测接口需要什么,只能提供一个大致思路,我项目能用的封装,你项目并不一定能用

    首先是get请求,第一个肯定是url,实际项目api接口都需要请求字段,那肯定要params参数,基本需要使用请求头来告诉接口是哪个用户做的操作,那就需要headers参数。可能还需要下载文件,那需要files参数。需要把请求的内容,返回的状态,响应内容的日志打印出来,如果请求失败,需要打印错误日志。

    请求的接口url也是要打印出来的,等到配置文件的时候再讲。基本代码如下。

    import unittest
    import requests
    from Logs.log import log1
    class webrequests(unittest.TestCase):
    
        def get(self,url,params=None,headers=None,files=None):
            '''封装get方法,return响应码和响应内容'''
            try:
                r = requests.get(url,params = params,headers = headers,files=files)
                log1.info("请求的内容:%s" % params)
                status_code = r.status_code  # 获取返回的状态码
                log1.info("获取返回的状态码:%d" % status_code)
                response_json = r.json()  # 响应内容,json类型转化成python数据类型
                log1.info("响应内容:%s" % response_json)
                return status_code,response_json    # 返回响应码,响应内容
            except BaseException as e:
                log1.error("请求失败!",exc_info=1)

    来测试一下封装的get请求,使用之前文章中查询天气的get请求接口

    from Common.Base_test import webrequests
    url = 'https://www.sojson.com/open/api/weather/json.shtml'
    payloda = {'city':'上海'}
    s = webrequests()
    s.get(url,payloda)

    可以看到结果正确

    因为项目接口响应内容基本都是json格式,所以在请求封装中,直接做了数据转换。

    接下来是post请求,post请求有时候需要提交json格式的数据,有时候不需要,那这就要封装两个方法,剩下的跟get差不多

    一般post请求上传文件都不会是带json格式的数据

    代码如下。

        def post(self, url, data=None, headers=None,files=None):
            '''封装post请求,return响应码和响应内容'''
            try:
                r = requests.post(url, data=data, headers=headers,files=files)
                log1.info("请求的内容:%s" % data)
                status_code = r.status_code  # 获取返回的状态码
                log1.info("获取返回的状态码:%d" % status_code)
                response_json = r.json()  # 响应内容,json类型转化成python数据类型
                log1.info("响应内容:%s" % response_json)
                return status_code,response_json    # 返回响应码,响应内容
            except BaseException as e:
                log1.error("请求失败!",exc_info=1)
                
    
        def post_json(self,url,data=None,headers=None):
            '''封装post方法,并用json格式传值,return响应码和响应内容'''
            try:
                data = json.dumps(data).encode('utf-8')  # python数据类型转化为json数据类型
                r = requests.post(url, data=data, headers=headers)
                log1.info("请求的内容:%s" % data)
                status_code = r.status_code   # 获取返回的状态码
                log1.info("获取返回的状态码:%d" % status_code)
                response = r.json()   # 响应内容,json类型转化成python数据类型
                log1.info("响应内容:%s" % response)
                return status_code,response    # 返回响应码,响应内容
            except BaseException as e:
                log1.error("请求失败!",exc_info=1)

    需要impost json

    因为找不到好的post接口做测试,所以就不试了

    有时候很多响应内容中某个字段会是一个嵌套字典,而我们需要和某个字段进行断言,那我们可以封装一个这样的方法,遍历字典,通过传入的键。返回嵌套字典中的对应的值

     def getdict(self,dict1,obj,default=None):
            ''' 遍历嵌套字典,得到想要的value
                dict1所需遍历的字典
                obj 所需value的键'''
            for k,v in dict1.items():
                if k == obj:
                    return v
                else:
                    if type(v) is dict:#如果是字典
                        re = self.getdict(v,obj,default)    # 递归
                        if re is not default:
                            return re

    那现在来测试一下是否能拿到自己想要的值,通过封装的getdict(),获取在嵌套三层字典中failAction的值

    from Common.Base_test import webrequests
    response = {'errno': 0, 'msg': 'success', 'result': {'id': '5b4dc7111c0ab20001c3c481', 'cname': '测试001', 'desc': '测试机器人', 'type': 0, 'settings': {'failAction': ['偶母鸡啊', '我不告诉你']}, 'lastView': '2018-07-17T18:38:09.250849551+08:00', 'nickname': '小可爱', 'age': 0, 'gender': 'male', 'hometown': '北京', 'speciality': '打游戏'}}
    s = webrequests()
    failAction = s.getdict(response,'failAction')
    print(failAction)

    可以看到打印的值是正确的

    还可以封装一些比如json格式美化显示的方法,可以让日志打印的json更加美观可视化。有兴趣的可以自己去实现下

    补充:如果使用https请求时,可以使用verify = false参数来跳过SLL证书认证,发布到生产的代码都应该加上timeout参数,防止请求无响应,程序一直等待响应卡着不继续往下执行。

  • 相关阅读:
    [Swift]LeetCode823. 带因子的二叉树 | Binary Trees With Factors
    [Swift]LeetCode822. 翻转卡片游戏 | Card Flipping Game
    [Swift]LeetCode821. 字符的最短距离 | Shortest Distance to a Character
    [Swift]LeetCode818. 赛车 | Race Car
    [Swift]LeetCode817. 链表组件 | Linked List Components
    [Swift]LeetCode816. 模糊坐标 | Ambiguous Coordinates
    [Swift]LeetCode815. 公交路线 | Bus Routes
    [Swift]LeetCode814. 二叉树剪枝 | Binary Tree Pruning
    [Objective-C语言教程]指针(15)
    转 : net use的使用
  • 原文地址:https://www.cnblogs.com/myal/p/9337375.html
Copyright © 2020-2023  润新知