1. 接口自动化
1.1 概念
接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互逻辑依赖关系
自动化测试:是把以人为驱动的测试行为转化为机器执行的一种过程
接口自动化测试:是让程序或者工具代替人工自动完成对接口进行测试的一种过程
1.2 流程
- 需求分析
- 请求(请求url、请求方法、请求参数)
- 响应 (响应数据、状态码)
-
挑选需要做自动化测试的接口
-
设计自动化测试用例
-
搭建自动化测试环境(如:python+pycharm)
-
设计自动化测试项目的架构(参数化、用例执行框架)
-
编写代码
-
执行测试用例(unitest、pytest)
-
生成测试报告(htmltestrunner\allure)并分析结果
2. Requests库
2.1 什么是Requests库
2.1.1 介绍
Requests库是用Python编写的,基于urllib,采用Apache2 Licensed 开源协议的HTTP库,相比urllib库,Requests库更加方便,可以节约我们大量的工作,完全满足HTTP测试需求
2.1.2 安装
pip3 install requests //python3.8
输入pip3 show requests如下图即安装成功
如下图:
2.2 发送请求
常见的HTTP请求方式:GET、POST、PUT、DELETE、HEAD、OPTIONS
使用requests发送网络请求很简单,只需要调用HTTP请求类型所对应的方法即可
2.2.1 GET请求
import requests
response = requests.get("http://www.baidu.com")
请求方法的返回值response为Response对象,我们可以从这个对象中获取我们想要的响应信息
1、获取请求url:响应对象.url
2、获取响应状态码:响应对象.status_code
3、获取响应内容:响应对象.text
"""
目标:GET请求方法演练
案例:http://www.baidu.com
请求:1、请求方法:GET
响应:1、响应对象.url #获取请求url2、响应对象.status_code #获取响应状态码3、响应对象.text #以文本形式显示响应内容
"""# 1、导包
import requests# 2、调用get
url = "http://www.baidu.com"
r = requests.get(url)
# 3、获取请求url
print("请求url:",r.url)
# 4、获取响应状态码
print("状态码:",r.status_code)
# 5、获取响应信息
print("响应内容",r.text)
请求带参(动态传参)
-
http://www.baidu.com?id=1001
-
http://www.baidu.com?id=1001,1002
-
http://www.baidu.com?id=1001&kw=北京
2.2.2 POST请求
步骤:
- 导包 import requests
- 调用post方法 requests.post(url,json,headers,data)
data与json区别
- data:字段对象
- json:json字符串
- 在python中字典对象和json字符串长得一样,但是后台格式是有区别的
- 如何将字段对象转为json字符串?
- 1、导入json
- 2、json.dumps(字典对象)#转换json字符串
- 如何将字段对象转为json字符串?
响应数据.text和.json区别
- json方式返回类型为字典,可以通过键名来获取响应的值
- text:返回的类型为字符串,无法通过键名来获取响应的值
- 共同点:长得都像字典
import requests
import time
# 2、调用post#请求url# 设置cookies变量
cookies = {"PHPSESSID":"mcu190hl4685pjrru96t4t7g17"}url = "http://106.54.9.13/index.php/admin/User/add_user"
#请求headers
headers = {"Content-Type":"application/json"}
#请求json
data = {"nickname": "hello","password": "123456","mobile": "12345678910","sex": 0
}time.sleep(4)
r=requests.post(url,json=data,headers=headers,cookies=cookies)# 3、获取响应对象
print(r.json)
# 4、获取响应状态码
print("状态码:", r.status_code)
# 5、获取响应数据
print("响应数据", r.text)'''
:params url:请求的url
:params data:(可选)要发送到请求体中的字典、元组、字节或文件对象
:params json:(可选)要发送到请求体中的JSON数据
:rtype:requests.Response
'''
2.2.3 PUT请求
作用:更新资源
应用:
- 导包 import requests
- 调用put方法 r = requests.put(url,json,heders) 返回对象为response对象
2.2.4 DELETE请求
作用:删除资源
应用:
- 导包 import requests
- 调用put方法 requests.delete(url)
响应:
- 响应状态码:204
2.3 响应内容
请求方法的返回值response为Response对象,我们可以从这个对象中获取所有我们想要的响应内容
response.satus_code 状态码: 查询 200 新增 201 删除 204 更新 201/200
response.url
response.encoding 查看默认请求编码格式,设置响应编码格式
response.headers
response.cookies
response.text 以文本形式解析响应内容
response.content 以字节码形式解析响应内容
response.json 以json字符串形式解析响应内容
2.4 案例
需求
使用requests库调用TPshop登陆功能的相关接口,完成登陆操作,登陆成功后获取“我的订单”页面的数据
相关数据
1、获取验证码:http://106.54.9.13/index.php?m=Home&c=User&a=verify
2、登陆接口:http://106.54.9.13/index.php?m=Home&c=User&a=do_login
3、订单: http://106.54.9.13/index.php/Home/Order/order_list.html
4、登陆数据
data = {“username”:" 18184761327",
“password”: “123456”,
“verify_code”: 8888}
操作步骤
1、请求登陆url+登陆数据
cookie
来源:由服务器生成
作用:区分同一请求客户端
获取:响应对象.cookies
设置:cookies={key:value}z
直接使用获取验证码成功返回的cookies也可以成功登陆
# 1、导包
import requests# 请求验证码
url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify"
r = requests.get(url_verify_code)# 获取cookies
r_cookies = r.cookies
print("浏览器生成的cookies:", r_cookies)
# 设置cookies变量
cookies = {"PHPSESSID": r_cookies["PHPSESSID"]}
print("我们生成的cookies", cookies)
# 2、调用post + 添加cookies
url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login"
data = {"username": " 18184761327","password": "123456","verify_code": 8888}
r = requests.post(url=url_login, data=data, cookies=r_cookies)# 3.验证是否登陆成功
print(r.json())
# 4. 查询我的订单url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html"
r = requests.get(url=url_order, cookies=r_cookies)
print(r.text)
2.5 Session
在requests中,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览服务器连接服务器开始,到客户端浏览器与服务器断开
会话能让我们在跨请求时候保持某些参数,比如在同一个session实例发出的所有请求之间保持cookies
创建session对象
session = requests.session()
得到session对象后,就可以调用该对象中的方法来发送请求
session案例
需求
使用requests库调用TPshop登陆功能的相关接口,完成登陆操作,登陆成功后获取“我的订单”页面的数据
相关数据
1、获取验证码:http://106.54.9.13/index.php?m=Home&c=User&a=verify
2、登陆接口:http://106.54.9.13/index.php?m=Home&c=User&a=do_login
3、订单: http://106.54.9.13/index.php/Home/Order/order_list.html
4、登陆数据
data = {“username”:" 18184761327",
“password”: “123456”,
“verify_code”: 8888}
# 1、导包
import requests
# 2、获取session对象
session = requests.session()
# 3、请求验证码,让session对象记录cookies信息
url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify"
session.get(url_verify_code)# 4、请求登陆
url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login"
data = {"username": " 18184761327","password": "123456","verify_code": 8888}
r = session.post(url=url_login,data=data)
# 5.验证是否登陆成功
print(r.json())
# 6. 查询我的订单url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html"
r = session.get(url=url_order)
print(r.text)
3. 集成UnitTest
3.1 集成UnitTest
将接口测试脚本集成到UnitTest单元测试框架中,利用UnitTest的功能来运行接口测试用例
3.1.1 需求
使用TPShop项目完成对登陆功能的接口测试
3.3.2 用例设计
用例编号 | 模块 | 用例名称 | 接口名称 | 请求URL | 请求方法 | 请求参数类型 | 请求参数 | 预期结果 | 测试结果 | 备注 |
---|---|---|---|---|---|---|---|---|---|---|
tpshop_login_001 | 登陆 | 登陆成功 | 获取验证码 登陆 | http://106.54.9.13/index.php?m=Home&c=User&a=verify http://106.54.9.13/index.php?m=Home&c=User&a=do_login | GET POST | form | data = { “username”: " 18184761327", “password”: “123456”, “verify_code”: 8888 } | 获取到验证码图片 登陆成功 | ||
tpshop_login_002 | 登陆 | 账号不存在 | 获取验证码 登陆 | http://106.54.9.13/index.php?m=Home&c=User&a=verify http://106.54.9.13/index.php?m=Home&c=User&a=do_login | GET POST | form | data = { “username”: " 18184761327", “password”: “123456”, “verify_code”: 8888 } | 获取到验证码图片 账号不存在 | ||
tpshop_login_003 | 登陆 | 密码错误 | 获取验证码 登陆 | http://106.54.9.13/index.php?m=Home&c=User&a=verify http://106.54.9.13/index.php?m=Home&c=User&a=do_login | GET POST | form | data = { “username”: " 18184761327", “password”: “123456”, “verify_code”: 8888 } | 获取到验证码图片 密码错误 |
结构:
- setUp
- 作用:test开始执行方法之前,首先被执行
- 应用:
- 获取session对象
- 登陆URL
- 验证码URL
- tearDown
- 作用:test开始执行方法之后,会被执行
- 应用:
- 关闭session对象
- test_login_success
- 作用:登陆成功用例
- 应用
- 请求验证码–>让session对象获取并记录cookies信息
- 请求登陆
- 断言验证测试结果
- test_username_not_exist:
- 作用:登陆失败,用户名不存在
- 应用
- 请求验证码–>让session对象获取并记录cookies信息
- 请求登陆
- 断言验证测试结果
- test_password_error
- 作用:登陆失败,密码错误
- 应用
- 请求验证码–>让session对象获取并记录cookies信息
- 请求登陆
- 断言验证测试结果
# 1、导包
import requests
import unittest# 2、新建测试类
class TPShopLogin(unittest.TestCase):# 3、setUpdef setUp(self):# 获取session对象self.session = requests.session()# 登陆URLself.url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login"# 验证码URLself.url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify"# url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html"# 4、tearDowndef tearDown(self):# 关闭sessionself.session.close()# 5.登陆成功def test_login_success(self):# 请求验证码--获取cookiesself.session.get(self.url_verify_code)# 请求登陆data = {"username": " 18184761327","password": "123456","verify_code": 8888}r = self.session.post(self.url_login, data=data)# 断言try:self.assertEqual("登陆成功", r.json()['msg'])except AssertionError as e:print(e)# 6. 登陆失败,用户名不存在def test_username_not_exist(self):# 请求验证码--获取cookiesself.session.get(self.url_verify_code)# 请求登陆data = {"username": " 18111111111","password": "123456","verify_code": 8888}r = self.session.post(self.url_login, data=data)# 断言try:self.assertEqual("账号不存在!", r.json()['msg'])except AssertionError as e:print(e)# 7. 登陆失败,密码错误def test_password_error(self):# 请求验证码--获取cookiesself.session.get(self.url_verify_code)# 请求登陆data = {"username": " 18184761327","password": "111111","verify_code": 8888}r = self.session.post(self.url_login, data=data)# 断言try:self.assertEqual("密码错误", r.json()['msg'])except AssertionError as e:print(e)if __name__ == '__main__':unittest.main()