【pytest】开始-接口自动化:Requests库的基础操作
自动化测试框架:python+requests+pytest+allure+yaml+logging+Jenkins框架
接口测试框架
- 基于:python+requests+pytest+allure+yaml+logging+Jenkins框架
1、认识Requests以及常用的方法和底层调用逻辑
1.1:导入requests第三方库
- requests是第三方库,用于发送Http请求以及接收http响应
- 使用前需先安装,命令为
pip install requests
# 导包-自动导包:Alt+Enter
import requests
1.2:最常用的6个方法
# requests.get() # **kwargs:可变长度的字典
def get(url, params=None, **kwargs):
# requests.post()
def post(url, data=None, json=None, **kwargs):
# requests.put()
def put(url, data=None, **kwargs):
# requests.delete()
def delete(url, **kwargs):
# requests.request()
def request(method, url, **kwargs): 这是前面4个方法统一调用的方法
# requests.session() # session:会话,web项目中从登录到退出是一个会话
def session():
session对象里的request方法
def request(self, method, url,
params=None, data=None, headers=None, cookies=None, files=None,
auth=None, timeout=None, allow_redirects=True, proxies=None,
hooks=None, stream=None, verify=None, cert=None, json=None):
1.3:底层逻辑
总共有四层调用,get/post/put/delete会调用requests.request()的方法,再进一步调用session.request()方法,最终调用的是request() 方法
-
第一层调用:
def get(url, params=None, **kwargs)
url:接口地址
params:参数,在get请求的url后面传的参数
**kwargs:可变长度的字典
def post(url, data=None, json=None, **kwargs)
url:接口地址
data:参数(表单/表格参数,对应postman的 x-www-form-urlencode)
简单的键值对dict类型的参数,默认情况下用form表单方式传参
str类型的参数,默认情况下用text/plain方式传参(如果是嵌套dict字典格式的参数,
需要先转换成str格式,见文末的扩展)
json:参数(raw,application/json),支持dict和str类型
**kwargs:可变长度的字典
(扩展)postman的四种传参方式:
1.纯表单:Content-Type:application/x-www-form-urlencode (data)
2.文件上传:Content-Type:multipart/form-data(既有表单也有文件上传) (files)
3.文本:
Content-Type:application/json(传json格式的参数) (json)
Content-Type:text/plain (data)
Content-Type:application/javascript (data)
Content-Type:text/html (data)
Content-Type:application/xml (data)
4.二进制binary:Content-Type:application/octrent-stream (files)
def put(url, data=None, **kwargs):
url:接口地址
data:参数
**kwargs:可变长度的字典
def delete(url, **kwargs):
url:接口地址
**kwargs:可变长度的字典
-
第二层调用:
- 上面的4个方法其实都是调用的request方法,requests.request()
def request(method, url, **kwargs):
-
第三层调用:
- requests.request()调用的是session.request方法
session.request(method=method, url=url, **kwargs)
-
第四层调用:
- session.request方法最终调用的是request()
def request(self,
method, 请求方式
url, 请求路径
params=None, params参数
data=None, data参数
json=None, json参数
headers=None, 请求头
cookies=None, cookies信息
files=None, 文件上传
auth=None, 鉴权
timeout=None, 超时
allow_redirects=True, 是否允许重定向
proxies=None, 设置代理
hooks=None, 钩子
stream=None, 文件下载
verify=None, 证书验证
cert=None, CA证书
1.4:Requests响应部分response对象介绍:
res.text:返回字符串形式的结果
res.json():返回字典形式的结果
res.content:返回字节类型的结果
res.status_code:返回状态码
res.reason:返回状态信息
res.cookies:返回cookie信息
res.encoding:返回编码格式
res.headers:返回响应头
res.request.xxx:得到请求数据
2、requests.request() 和 session.request() 的区别:
我们实际工作中,一般都是用 session.request() 去进行接口测试。这2者的区别:
- 前者requests.request()的每个请求都是独立的,每调用一次requests.request(),会初始化新生成一个会话,导致跟其它接口请求没有cookie的关联,会话是不连续的。
- 后者会自动去关联所有请求的cookie信息,通过sess = requests.session()封装,则能让所有的请求都在同一个session会话里。
- 第2个区别,通过封装之后,可以进行统一处理---
class TestRequestApi():
Authorization=""
sess = requests.session()
def test_login(self):
url= "https://xxxx/wzlApp/usersLogin/login"
headers ={"App-Version":"3.6.9"}
data = {
"phone":"RwP%2BH9D9DTgD1Qf0j7J%2B3A==",
"password":"kKe2zs5e7SF%2BuzDkBeFLLQ=="
}
# 通过session的方法调用
res = TestRequestApi.sess.request("post",url=url,data=data,headers=headers)
print(res.json())
TestRequestApi.Authorization = res.json()['data']['token']
3、requests接口自动化测试实战
2.1:接口关联的三个层次:
- 通过类变量保存中间变量实现接口关联 ----不建议用这个方式
- 通过单独的文件保存中间变量实现接口关联
- 极限封装成零代码的方式实现接口关联
2.2:接口关联的两种方式:
- 1)正则提取
# ---- re 需要先导包,再引入
re.search() 通过正则匹配一个值,用下标[1]取值,如没有匹配到则返回None
re.findall() 通过正则匹配多个值,返回的是list,用下标取值,如没有匹配到则返回None
一般在text文本中,用正则提取:
第一个是正则:'token': '(.*?)',
第二个是字符串对象:res.json()
通过下标[1]提取对应的值
import re token = re.search("'token': '(.+?)'",res.text).group(1) print("这是正则提取出来的:"+token)
- 2)JsonPath提取
# --- jsonpath需要先导包,再引入
jsonpath.jsonpath() 返回的是list,用下标取值,如没有匹配到则返回None
$ 表示根目录
如:就在根目录下,则直接用.名称提取:res.json(),"$.data"
到前面的res.json()对象中,通过表达式:"$.data"取值
如:有嵌套的话:res.json(),"$.[data][token]"通过下标提取对应的值
import jsonpath data = jsonpath.jsonpath(res.json(),"$.data[token]") print(data[0])
data = jsonpath.jsonpath(res.json(),"$.data[token]")
# $ 表示根目录
# 就在根目录下,则直接用.名称提取:res.json(),"$.data"
# 到前面的res.json()对象中,通过表达式:"$.data"取值
# 有嵌套的话:res.json(),"$.[data][token]"
# 通过下标提取对应的值
print(data[0])
import requests
import jsonpath
class TestRequestApi():
# 类变量
Authorization=""
def test_login(self):
# self,代表当前类的对象
# 方法通过对象调用 TestRequestApi().test_login()
# method: post
url= "https://xxxx/wzlApp/usersLogin/login"
headers ={"App-Version":"3.6.9"}
data = {
"phone":"RwP%2BH9D9DTgD1Qf0j7J%2B3A==",
"password":"kKe2zs5e7SF%2BuzDkBeFLLQ=="
}
res = requests.post(url=url,data=data,headers=headers)
print(res.json())
TestRequestApi.Authorization = res.json()['data']['token']
# $ 表示根目录;到前面的res.json()对象中,通过表达式:"$.data"取值
# 如果要提取的参数就在根目录下,则直接用.名称提取:res.json(),"$.data"
# 有嵌套的话,提取表达式:res.json(),"$.[data][token]"
data = jsonpath.jsonpath(res.json(),"$.data[token]")
print("-----登录-----")
print("这是直接获取的token:" + TestRequestApi.Authorization)
print(data[0])
def test_notice(self):
url= "https://xxxx/wzlApp/users/insertUserFeedback"
headers ={
"App-Version":"3.6.9",
"Authorization": TestRequestApi.Authorization
}
data = {
"feedback":"通过接口自动化脚本提交的意见反馈,数字符--xxxx---测试。。通过接口自动化脚本提交的意见反馈,数字字符--xxxxx---测试。。"
}
res = requests.post(url=url,data=data,headers=headers)
print("-----意见反馈-----")
print(res.json())
def test_upload(self):
url = "https://xxxx/commonApi/upload/uploadPrivate"
headers = {
"App-Version": "3.6.9",
"Authorization": TestRequestApi.Authorization
}
data = {
"file":open("D:/Scripts/workspace/demo/results/image/logo.png","rb")
}
res = requests.post(url=url, files=data, headers=headers)
print("-----上传文件接口-----")
print(res.json())
扩展:
底层逻辑1.2中,data和json格式的进一步说明
1)json.dumps(data):序列化, 把字典格式的数据转换成str格式;
2)json.loads(data):反序列化,把str格式转换成字典格式。
def test_login(self):
url = "https://xxxx/wzlApp/users/insertUserFeedback"
headers = {
"App-Version": "3.6.9",
"Authorization": TestRequestApi.Authorization
}
data = {
"feedback": {"content":"通过接口自动化脚本提交的意见反馈,
数字符--xxxx---测试。。
通过接口自动化脚本提交的意见反馈,数字字符--xxxxx---测试。。"}
}
res = requests.post(url=url, data=json.dumps(data), headers=headers)
PS:
目前软件测试对测试人员的能力要求
- 业务测试能力:占比5-6成
- 接口、自动化、性能测试能力:占比4-5成
- 流程规范:1成
(需要综合型的测试人才):业务能力、代码能力、开发思维(封装)
实现接口自动化测试工具:
- 主流接口测试工具实现接口自动化(适用于中小型的公司或项目)50% 10-15
Postman+Newman+git/SVN+Jenkins(基于JavaScript语言)
Jmeter+Ant+git/SVN+Jenkins(基于Java和BeanShell语言)
- 基于代码的接口自动化(适用于大中型公司或一线互联网公司)40% 15-30
Python+Requests+Yaml+Pytest+Allure+Logging+热加载+Jenkins
- 基于平台的接口自动化(适用于特大型或外包型公司)10% 30以上
测试开发
更多推荐
所有评论(0)