接口自动化测试学习笔记1
接口自动化测试
概念
接口自动化测试:让程序代替人为对接口进行自动验证测试的过程
实现方式
- 工具:jmeter、postman
- 代码:python-requests
测试工具的缺点
- 测试数据不好控制(无法直接读取或存储json格式)
- 测试数据加密不方便
- 扩展性不足(复杂业务逻辑、复杂断言)
Requests库
Requests
是用Python语言编写,基于 urllib
,采用 Apache2 Licensed 开源协议的 HTTP
库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。
Requests介绍
- 使用python语言编写
- 使用开源协议,基于
urllib
库做的二次封装 Requests
库中封装了相应接口测试方法
Requests库安装和验证
- 安装:
pip install requests
- 验证:
pip show requests
(显示版本信息)
Requests库的使用
请求方式(6个)
GET
: 获取HEAD
: 类似于get
,但是返回的信息没有请求体,只有信息头,可以用于查看某资源是否存在POST
: 新增PUT
: 更新DELETE
: 删除OPTIONS
: 查看服务器支持哪些方法
GET请求
- 方法
requests.get(url,params = None,**kwargs)
url : 拟获取页面的url链接
params : url中的额外参数,字典或字节流格式(可选)
**kwargs : 12个控制访问的参数(与request方法相比少了一个proxies参数)
- 用例
"""
功能:get请求测试
url:www.baidu.com
响应:
1、相应对象 .url #获取请求url
2、相应对象 .status_code #获取响应状态码
3、相应对象 .text #以文本形式显示响应内容
"""
# 1、导包
import requests
# 2、调用get
url = "http://www.baidu.com"
r = requests.get(url) #r : 响应的数据对象
# 3、获取请求url地址
print("请求url地址 : ", r.url)
# 4、获取响应状态码
print("响应状态码 : ", r.status_code)
# 5、获取响应信息 以文本的形式
print("文本响应内容 : ", r.text)
请求带参数
"""
不同带参数的方式
1、http://www.baidu.com?id=1001
2、http://www.baidu.com?id=1001,1002
3、http://www.baidu.com?id=1001&kw=北京
参数:
requests.get(url,params) params:字典或字符串(推荐使用字典)
"""
params = {"id":1001}
params = {"id":"1001,1002"}
params = {"id":"1001","kw":"北京"} # 多个键值使用方式
# 请求带参数params
r = requests.get(url,params=params)
POST请求
- 方法
requests.post(url,data = None,json = None,**kwargs)
url : 拟获取页面的url链接
data : 字典、字节序列或文件,Request的内容
json : JSON格式的数据,Request的内容
**kwargs : 控制访问的参数,共11个
-
PS:
- 在python中字典对象和json字符串长的一样,但是格式是不同的
- 可以通过
json.dumps(字典对象)
将字典转为json字符串
-
用例1:data和params传参的区别
"""
功能:post请求使用
参数:
1、json : 传入json字符串
2、headers : 传入请求信息头内容
响应:
1、响应对象.json
2、响应对象.status_code
"""
# 导包
import requests
import json
# 调用 post
url = "xxxxx" # 请求 url
headers = { "Content-Type":"application/json" } # 请求 headers
# 请求json
data = {
"account":"xxxxx",
"password":"xxxxx",
"nonce":xxxxx,
"machine":"xxxxx"
}
# 传json参数
r = requests.post(url, json=data,headers=headers)
# 传data参数,需要用json.dumps转换数据格式
r = requests.post(url, data=json.dumps(data),headers=headers)
# 获取响应对象
print(r.json())
# 获取响应状态码
print(r.status_code)
- 用例2:响应对象.text 和 响应对象.json 的区别
- json():返回字典类型,可以通过键名来获取相应的值
- text:返回字符串类型,无法通过键名来获取相应的值
# 获取响应对象
print("r_json : ", r.json())
print("r_json_type : ", type(r.json()))
print("r_json_key : ", r.json()['time'])
print("r_text : ",r.text)
print("r_text_type : ", type(r.text))
# print("r_text_key : ", r.json['time']) # 报错
# 输出内容
# r_json : {'data': 'XXXXX', 'success': True, 'time': TTT}
# r_json_type : <class 'dict'> 字典类型,可以通过键名获取相对应的值
# r_json_key : TTT
# r_text : {"data":"XXXXX","success":true,"time":TTT}
# r_text_type : <class 'str'> string类型,无法通过键名获取相对应的值
PUT请求
- 方法
requests.put(url,data = None,**kwargs)
url:拟获取页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:控制访问的参数,共12个
- 用例
# 导包
import requests
# 调用 put
# 请求 url
url = "XXXXXXXXX"
# 请求 headers
headers = {
"Content-Type":"application/json",
"X-Token":"XXXX"
}
# 请求json
data = {
"extraInfo": [
{
"XXXX": "XX",
"XXXX": "XXXXX",
"XXX": "XXXXX"
}
],
"AAAAAA": "XXXXX",
}
r= requests.put(url, data = data , headers=headers)
# 获取响应对象
print("r_json : ", r.json())
DELETE请求
- 方法
requests.delete(url,**kwargs)
url:拟获取页面的url链接
**kwargs:控制访问的参数,共13个(与request方法参数完全一样)
- 用例
# 导包
import requests
# 调用 post
# 请求 url
url = "XXXXX"
# 请求delete
r= requests.delete(url)
# 获取响应状态码 delete无相应数据,只有状态码
print(r.status_code)
Response响应内容
response.status_code
: HTTP请求返回的状态码response.text
: HTTP相应内容的字符串状态,即url对应的页面内容response.encoding
: 查看或设置响应的编码格式(如果header中不存在charset,则认为编码为ISO-8859-1)response.headers
: 获取服务器响应信息头,一般服务器返回的token或者session信息都在其中response.cookies
: 获取服务器产生的响应cookie信息response.text
: 文本形式的响应内容response.content
: 字节(二进制)形式的响应内容response.json()
: JSON形式的响应内容
用例
- 获取请求编码
# 导包
import requests
# 调用 post
# 请求 url
url = "http://www.baidu.com"
r= requests.get(url)
# 获取默认请求编码
print(r.encoding)
print(r.text)
PS:默认编码下中文可能会乱码
- 设置请求编码
# 导包
import requests
# 调用 post
# 请求 url
url = "http://www.baidu.com"
r= requests.get(url)
# 设置请求编码
r.encoding = "utf-8"
# 获取默认请求编码
print(r.encoding)
cookie
- 来源:由服务器生成
- 作用:区分同一请求客户
- 获取:
response.cookies
- 设置
- 设置 :
cookie = {"获取的cookie键名":"获取出的值"}
- 应用 :
request.请求方法(url,cookies=cookie)
- 设置 :
- 验证码cookie产生及应用
session对象
-
为什么使用session对象
session
可以自动保存服务器产生的cookies信息,并且自动在下一条请求时附加上 -
什么是session
一次会话:从客户端和服务器创建连接开始,直到客户端和服务器断开连接结束 -
使用
- 创建session对象:
session = requests.Session()
- 创建session对象:
unitest框架
unitest和requests结合
- 结构
setUp
:test
开始方法执行之前,首先会被执行- 获取
session
对象 - 设置登陆
url
- 设置验证码
url
- 获取
tesrDown
:test
开始方法执行之后,会被执行- 关闭
session
对象
- 关闭
test_login_success
: 登陆成功用例- 请求验证码(让
session
获取并记录cookie
信息) - 请求登陆
- 断言
- 请求验证码(让
test_username_not_exist
: 登陆失败,账号不存在test_password_error
: 登陆失败,密码错误
- 注意
- 测试类必须继承
unittest.Testcast
- 测试用例方法必须以
test
开头
- 测试类必须继承