对于接口的自动化测试而言,仅仅有requests库是肯定不够的,毕竟仅使用requests是一种面向过程的编程,如需扩展相关功能的话,还是需要走面向对象的路才可以,本文分享使用unittest框架来辅助requests完成自动化测试并增加断言。
*本文主讲unittest框架使用,相当于requests的进阶版,如果想了解requests请点击下方链接查看我的另一篇文章↓使用python发送Http请求(requests)https://blog.csdn.net/Liu_GuoXing/article/details/127507843?spm=1001.2014.3001.5501
UnitTest优势:
- 方便管理、维护测试用例
- 提供了丰富的断言方法
- 支持生成测试报告
UnitTest语法框架(必须写在一个新的py文件中,不允许在现有文件修改 ):
import unittest
import requests
# 导包
class TestDemo(unittest.TestCase):
# 开头必须大写,且需要继承unittest.TestCase
my_session = None
# 定义类属性
def setUp(self) -> None:
# 方法级别Fixture,最先执行的部分
self.verify_url = 'xxx'
self.login_url = 'xxx'
self.headers = 'xxx'
# 初始化多个测试用例公用的值
def tearDown(self) -> None:
# 方法级别Fixture,最后执行的部分
pass
# 用不上teardown的情况下可以不用
@classmethod
# 类装饰器
def setUpClass(cls) -> None:
# 类级别Fixture,最先执行的部分
cls.my_session = requests.session()
@classmethod
# 类装饰器
def tearDownClass(cls) -> None:
# 级别Fixture,最后执行的部分
cls.my_session.close()
def test01_login_ok(self):
# 普通方法
# 登陆成功用例
# 测试用例-必须以test开头,01、02、03决定了执行的先后顺序
resp1 = self.my_session.get(url=self.verify_url)
self.assertEqual(200, resp1.status_code)
# 断言:响应状态码为200
self.assertIn(1, resp1.json().get('status'))
# 断言:’status‘的值包含1
def test02_username_not_exits(self):
# 普通方法
# 账号不存在
resp2 = self.my_session.post(url=self.login_url, data='xxxx', headers=self.headers)
self.assertEqual(200, resp2.status_code)
# 断言:响应状态码为200
self.assertIn(1, resp2.json().get('status'))
# 断言:’status‘的值包含1
def test03_pwd_error(self):
# 普通方法
# 密码错误
resp3 = self.my_session.post(url=self.login_url, data='xxxx', headers=self.headers)
self.assertEqual(200, resp3.status_code)
# 断言:响应状态码为200
self.assertIn(1, resp3.json().get('status'))
# 断言:’status‘的值包含1
执行顺序:类级setup-方法级setup-用例1-方法级teardown-方法级setup-用例2-方法级teardown方法级setup-用例3-方法级teardown-类级teardown(必须在类定义之前运行)
断言主要方法:
assertEqual(参1,参2)
参数1:预期结果
参数2:实际结果
判断两个参数是否相等,如果相等则无任何提示,如果不相等则报错
assertIn(参1,参2)
参数1:预期结果
参数2:实际结果
判断实际结果中是否包含预期结果,若包含则断言通过无提示,若不包含则报错
实现过程:
- 准备UnitTest框架(setUp、tearDown、setUpClass、tearDownClass)
- 将使用requests框架请求的接口代码放入test开头的普通方法中
- 将所有导包类信息放至文件起始位置
- 将cls.my_session = requests.session()放至setUpClass中
- 将cls.my_session.close()放至tearDownClass(cls)中
- 添加类属性my_session = None
- 修改普通方法中requests.get/post为self.my_session.post/get('xxxx')
- 将普通方法中公共的部分如URL、HEADERS放入setUp中
- 修改普通方法中原本的URL和HEADERS,替换为setUp中的变量
- 在类的最上方右键-运行
❤关注我,不迷路❤
******我的本文相关专栏******
******我的其它作品专栏******