四、封装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})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架