一、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'])
总结:实践出真知。