接口自动化测试介绍
1、概念
接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,
以及相互逻辑依赖关系。
自动化测试:是把以人为驱动的测试行为转化为机器执行的一种过程。
接口自动化测试:是让程序或工具代替人工自动的完成对接口进行测试的一种过程。
2、 实现方式
- 使用接口测试工具来实现,比如:JMeter、Postman等
- 通过编写代码来实现(使用requests、session)
3、接口测试工具的不足
- 测试数据不好控制
- 不方便测试加密接口
- 拓展性差
Requests库
1、什么是 requests 库
1.1 介绍
Requests库是用Python编写的,基于urllib,采用Apache2 Licensed开源协议的HTTP库; 相比urllib库,Requests库更加方便,可以节约我们大量的工作,完全满足HTTP测试需求;
2.2 安装
pip install requests
2、发送请求
使用 requests 发送网络请求非常简单,只需要调用HTTP请求类型所对应的方法即可。
常见的HTTP请求方式:GET、POST、PUT、DELETE、HEAD、OPTIONS
2.1 GET请求
import requests
response = requests.get("http://www.baidu.com")
请求方法的返回值response为 Response 对象,我们可以从这个对象中获取所有我们想要的响应 信息。
2.2 POST请求
response = requests.post(url, data=None, json=None)
"""
:param url: 请求的URL
:param data: (可选) 要发送到请求体中的字典、元组、字节或文件对象
:param json: (可选) 要发送到请求体中的JSON数据
:rtype: requests.Response
"""
import requests
response = requests.post("http://www.baidu.com", data={"key": "value"})
扩展data与json区别:
data:字典对象
json:json字符串
提示:
1. 在python中字典对象和json字符串长的一样,但是后台格式是有区别的
如何将字典对象转为json字符串?
1. 导入 json
2. json.dumps(字典对象) # 转换json字符串
响应数据 json()与text区别:
json():返回类型字典,可以通过键名来获取响应的值
text:返回的类型为字符串,无法通过键名来获取响应的值
提示:共同点长得都像字典
2.3 其他请求类型
其他 HTTP 请求类型,比如:PUT、DELETE、HEAD 以及 OPTIONS。
import requests
response = requests.put("http://www.baidu.com", data={"key": "value"})
response = requests.delete("http://www.baidu.com")
response = requests.head("http://www.baidu.com")
response = requests.options("http://www.baidu.com")
3、传递URL参数
如果需要在URL的查询字符串中传递数据,可以使用params参数来定义,params传递的参数可以 是字符串或字典。
import requests
response = requests.get("http://www.baidu.com", params="kw=python")
print(response.url) # http://www.baidu.com/?kw=python
params = {"k1": "v1", "k2": ["v2", "v3"]}
response = requests.get("http://www.baidu.com", params=params)
print(response.url) # http://www.baidu.com/?k1=v1&k2=v2&k2=v3
4、响应内容
请求方法的返回值response为 Response 对象,我们可以从这个对象中获取所有我们想要的响应 信息。
response.status_code 状态码
response.url 请求url
response.encoding 查看响应头部字符编码
response.headers 头信息
response.cookies cookie信息
response.text 文本形式的响应内容
response.content 字节形式的响应内容
response.json() JSON形式的响应内容
JSON响应内容
如果请求响应的内容为JSON格式的数据,则可以直接调用response.json()方法获取数据,因为 requests中内置了JSON解码器,帮助我们处理JSON数据。
response = requests.get("http://www.baidu.com")
json_data = response.json()
如果 JSON 解码失败,response.json() 就会抛出一个异常
5、定制请求头
如果需要为请求添加请求头数据,只需要传递一个字典类型的数据给 headers 参数就可以了。
headers = {"key": "value"}
response = requests.get("http://www.baidu.com", headers=headers)
6、Cookie
作用:区分同一请求客户端
获取响应信息中cookie数据:
response = requests.get("http://www.baidu.com")
print(response.cookies)
发送请求时添加cookie数据,可以使用 cookies 参数:
requests.get("http://www.baidu.com", cookies={"c1": "v1"})
原理:
7、Session
作用:session可以自动保存服务器产生的cookies信息,并且自动在下一条请求时附加。
在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览 器连接服务器开始,到客户端浏览器与服务器断开。
创建session对象
session = requests.Session()
得到session对象后,就可以调用该对象中的方法来发送请求
session.get()
session.post()
session.delete()
session.put()
集成UnitTest
将接口测试脚本集成到UnitTest单元测试框架中,利用UnitTest的功能来运行接口测试用例。
框架搭建:
import unittest
import requests
# 新建类 继承unittest.TestCase
class TPShopLogin(unittest.TestCase):
# setUp
def setUp(self):
pass
# tearDown
def tearDown(self):
pass
# 测试方法
def test(self):
pass
if __name__ == '__main__':
unittest.main()
案例分析:
需求:使用人力资源管理项目完成对登录功能的接口测试
网址:http://ihrm2-test.itheima.net
用例设计:
代码实现:
# 导包 unittest_test requests
import unittest
import requests
# 新建类 继承unittest.TestCase
class TPShopLogin(unittest.TestCase):
def setUp(self):
# 获取session对象
self.session = requests.session()
# 登陆url
self.url_login = "http://ihrm2-test.itheima.net/api/sys/login"
def tearDown(self):
# 关闭session
self.session.close()
# 测试方法 登陆成功
def test_login_success(self):
# 请求头
headers = {"Content-Type": "application/json"}
# 请求登陆(为了过审把password加了s)
json_data = {"mobile": "13800000002", "passwords": "123456"}
r = self.session.post(self.url_login, json=json_data, headers=headers)
# 断言判断是否登录成功
try:
self.assertEqual(r.json()["message"], "操作成功!")
except AssertionError as e:
print(e)
# 测试方法,用户名错误
def test_login_error_mobile_err(self):
# 请求头
headers = {"Content-Type": "application/json"}
# 请求登陆(为了过审把password加了s)
json_data = {"mobile": "", "passwords": "123456"}
r = self.session.post(self.url_login, json=json_data, headers=headers)
# 断言判断是否登录失败
try:
self.assertEqual(r.json()["message"], "用户名或密码错误")
except AssertionError as e:
print(e)
# 测试方法,密码错误
def test_login_error_password_err(self):
# 请求头
headers = {"Content-Type": "application/json"}
# 请求登陆(为了过审把password加了s)
json_data = {"mobile": "13800000002", "passwords": ""}
r = self.session.post(self.url_login, json=json_data, headers=headers)
# 断言判断是否登录失败
try:
self.assertEqual(r.json()["message"], "用户名或密码错误")
except AssertionError as e:
print(e)
if __name__ == '__main__':
unittest.main()