requests是用来发送http请求以及接收http响应的python第三方库,主要用于做接口自动化。今天我们来学习一下如何封装到pytest里。
1、安装requests
pip install requests
2、requests库常用方法。包括了http的几种常见请求和必填参数
requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.delete(url, **kwargs)
requests.request(method, url, **kwargs)
3、get请求的常用返回值,这里测试用的是我自己写的一个jira方法
import requests
class TestApi:
def test_get(self):
url = "http://172.19.1.34:8015/emanage/getissue"
datas = {
"issue":"PAY"
}
res = requests.get(url=url,params=datas)
print(res.text) #返回body的文本信息
print(res.json) #返回body的json格式
print(res.content) #返回body的byte类型
print(res.status_code) # 返回状态码
print(res.reason) # 返回状态信息
print(res.cookies) # 返回响应的cookie信息
print(res.encoding) # 返回编码格式
print(res.headers) # 返回响应头
print(res.request.method) # 返回请求的数据
4、post请求和get请求差不多,需要注意的是json和字符串之间的转换
json.loads() 把json字符串转化成dict
json.dumps() 把dict转化成json字符串
def test_post(self):
urls = "http://172.19.1.34:8016/hdj/s1/"
datas = {
"user": "wufan",
"sqlword": "select * from t_11"
}
res = requests.post(url=urls, data=datas)
print(res.json())
5、实际案例:
获取微信小程序的token接口并通过token去获取小程序标签
- 获取微信小程序appid和secret的方式,访问下面地址,微信登录即可
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
- 获取了appid和secret后就可以获取小程序的token了
import json
import re
import requests
class TestProductApi:
access_token = ""
session = requests.session() #通过session去关联,session默认情况下会自动关联cookie
def test_get_token(self):
print("获取token鉴权码")
urls = "https://api.weixin.qq.com/cgi-bin/token"
datas = {
"grant_type":"client_credential",
"appid":"wx8e8b67ced3c4b884",
"secret":"27c524bd9ca932e31e229be30b0a805b"
}
res = TestProductApi.session.request("get",url=urls,params=datas)
TestProductApi.access_token = res.json()['access_token']
print(TestProductApi.access_token)
6、上面的案例,data和url都是直接写在用例里,不便于后期维护。
下面我们对requests进行第一层封装,在yaml文件里读取参数。
在commons/yaml_util.py工具里新增方法:
#读取测试用例
def read_testcase_yaml(yaml_path):
with open(get_object_path()+yaml_path,encoding='utf-8') as f:
value = yaml.load(f,Loader=yaml.FullLoader)
return value
将get请求需要的参数写在pm_get_token.yaml文件里:
-
name: 获取token鉴权码
request:
method: get
url: https://api.weixin.qq.com/cgi-bin/token
params:
grant_type: client_credential
appid: wx8e8b67ced3c4b884
secret: 27c524bd9ca932e31e229be30b0a805b
validate: none
修改用例,参数从yaml文件里去读取:
# 测试类名必须以Test开头,并且不能有init方法
import pytest
import requests
from test6.commons.yaml_util import read_testcase_yaml
class TestProductApi:
#测试方法必须以test开头
@pytest.mark.parametrize("args_name", read_testcase_yaml('/testcase/pm_get_token.yaml'))
def test_get_token(self, args_name):
url = args_name['request']['url']
params = args_name['request']['params']
res = requests.get(url=url,params=params)
print(res.json()['access_token'])
接口调取成功,成功输出token
7、虽然参数都写到yaml文件里去了,但代码还是复杂了一点。
我们来进行第二次封装,新建一个/commons/request_util.py,
里面包含了校验yaml文件格式:
import re
import requests
class RequestUtil:
session = requests.session()
#规范YAML测试用例
def standard_yaml(self,caseinfo):
caseinfo_keys = caseinfo.keys()
# 判断关键词是否完整
if "name" in caseinfo_keys and "request" in caseinfo_keys and "validate" in caseinfo_keys:
cs_request = caseinfo['request']
cs_request_keys = cs_request.keys()
if "method" in cs_request_keys and "url" in cs_request_keys:
method = cs_request.pop("method") #pop-删除列表里最后一个并且返回这个值
url = cs_request.pop("url")
res = self.send_request(method,url,**cs_request)
# return_text = res.text
print(res.json()['access_token'])
return res
else:
print("二级关键字必须包含:method,url")
else:
print("一级关键字必须包含:name,request,validate")
#统一请求封装
def send_request(self, method, url, **kwargs):
method = str(method).lower()
res = RequestUtil.session.request(method,url,**kwargs)
return res
新建一个用例,调用request_util工具,
这次只要一句话就可以请求接口了:
@pytest.mark.parametrize("caseinfo", read_testcase_yaml('/testcase/pm_get_token.yaml'))
def test_get_token2(self, caseinfo):
RequestUtil().standard_yaml(caseinfo)
查看结果,也能成功获取token,但是代码简单了许多,两个用例都能获取token: