四、封装requests接口请求(sendRequest.py)

实现功能:调用python中的requests方法,发起https的请求,并获取接口返回值
1、类设计
sendRequests类:用于封装 HTTP 请求的发送逻辑

  • _text_encode 方法:处理接口返回值中的 Unicode 编码问题,将类似
    \u767b 的 Unicode 编码转换为可读的中文。
  • send_request 方法:创建一个 HTTP 会话,调用requests模块中的request函数,入参为可变化,不限定参数个数和类型,发送请求并处理异常。
  • execute_api_request 方法:执行接口测试,调用 send_request 方法,入参包括请求方法、URL、请求头、Cookie等,返回接口响应值。

2、测试用例

  • 提供了两种测试用例:
  • 静态数据测试,直接在代码中定义请求参数。
  • YAML 文件测试:从 YAML 文件中读取请求参数。

3、代码实现

点击查看代码
import re  # 用于导入Python的标准库之一——正则表达式
import requests
from requests import utils
# 引入读、写、清空yaml文件的方法
from unit_tools.handle_data.yaml_handler import read_yaml, write_yaml, clear_yaml


class SendRequests:
    def __init__(self):
        pass

    @classmethod
    def _text_encode(cls, res_text):
        """
        处理接口返回值出现不识别中文,如:\\u767b
        :param res_text:
        :return:
        """
        match = re.search(r"\\u[0-9a-fA-F]{4}", res_text)
        if match:
            result = res_text.encode().decode('unicode_escape')
        else:
            result = res_text
        return result

    def send_request(self, **kwargs):
        # 创建一个会话
        session = requests.Session()
        response = None

        try:
            response = session.request(**kwargs)
            set_cookie = requests.utils.dict_from_cookiejar(response.cookies)
            if set_cookie:
                print(f'获取到cookie:{set_cookie}')
            res = self._text_encode(response.text)

        except requests.exceptions.ConnectionError:
            print("接口请求异常,可能是request的链接数过多或者速度过快导致程序报错")
        except requests.exceptions.RequestException as e:
            print(f"系统异常,请检查系统或者数据是否正常!{e}")

        return response

    def execute_api_request(self, api_name, url, method, headers, case_name, cookies=None, files=None, **kwargs):
        """
        发起接口请求
        :param api_name:接口名称
        :param url: 接口地址
        :param method: 请求方法
        :param header: 请求头
        :param case_name: 测试用例名称
        :param cookies: cookie
        :param files: 文件上传 注意非file
        :param kwargs: 未知数量的关键字参数
        :return:
        """
        response = self.send_request(method=method,
                                     url=url,
                                     headers=headers,
                                     cookies=cookies,
                                     files=files,
                                     timeout=10,
                                     verify=False,
                                     **kwargs)

        return response


if __name__ == '__main__':
    """
    方法一:通过静态数据发送request请求
    # 测试发送get请求
    url_login = 'https://www.httpbin.org/cookies/set/test/test12345'
    header_login = {
        'accept':'text/plain'
    }

    # 测试发送post请求,请求头-python格式,请求参数
    url_login1 = 'https://www.httpbin.org/post'
    header_login1={
        'content-type': 'application/json'
    }
    data_login = {
        "user_name": "test01",
        "passwd": "admin123"
    }

    send = SendRequests()
    res_get = send.execute_api_request(api_name=None,url=url_login,header=header_login,method='get',case_name=None)
    # 查看返回状态、打印返回信息
    print(res_get.status_code)
    print(res_get.text)

    res_post = send.execute_api_request(api_name=None,url=url_login1,header=header_login1,method='post',case_name=None,data=data_login)
    print(res_post.status_code)
    print(res_post.text)
    """

    # 方式二:读取yaml文件发起request请求
    # 获取config.ini配置文件中的host地址
    from unit_tools.handle_data.configParse import ConfigParse

    host = ConfigParse().get_host('host')

    # 相对路径:./1个点代表取当前文件同级目录文件下,../2个点代码取当前文件上一级目路。../取unit_tools,data和unit_tools同级,所以用./
    data = read_yaml('../testcase/login/login.yaml')[0]
    # 读取的data为字典结构
    # print(type(data))

    # 读取yaml文件中的字段,通过字典关键字获取
    url = host + data['baseInfo']['url']
    # print(url)
    method = data['baseInfo']['method']
    header = data['baseInfo']['header']
    # 入参注意层级
    req_data = data['testCase'][0]['data']
    # print(req_data)

    send = SendRequests()
    res = send.execute_api_request(api_name=None, url=url, header=header, method=method, case_name=None, data=req_data)
    # 查看返回状态、打印返回信息
    # print(res.status_code)
    # print(res.text)

    # 通过json提取返回值,写入变量文件extract中。如提取返回的token、userid等信息
    res_json = res.json()
    data = res_json['data']
    origin = res_json['origin']
    write_yaml({'data': data, 'origin': origin})
posted @   测试三思  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示