unitest的基本概念
1. test case. 测试用例
# 被测函数
def Add (a,b):
return a+b
"""
1、导包,是python的内置函数,因此不需要下载,可直接导入
2、编写一个类,继承unittest.TestCase类
3、编写测试逻辑
4、调用TestCase已经实现的断言,实现单元测试的判断
5、运行(直接运行py文件,运行类,运行测试方法,运行main函数)都可以
"""
import unittest
class TestAdd(unittest.TestCase):
def test_add_ture(self):
res =Add(3,4)
expr =7
self.assertTrue(res,expr)
if __name__ == '__main__':
unittest.main()
2. test suite 测试套件
3. test loader 测试加载
4. test runner 测试执行
import unittest
# 初始化测试套件,存储所有的测试用例
from unittestreport import TestRunner
suite=unittest.TestSuite()
# 加载并发现所有的测试用列,目录下文件名称以test开头,测试函数以test开头的所有测试方法
cases=unittest.TestLoader().discover(r"/Users/zhouna/PycharmProjects/pythonProject/study/")
# 将用例添加到suite中
suite.addTest(cases)
# 第二种方式
suite=unittest.defaultTestLoader.discover(r"/Users/zhouna/PycharmProjects/pythonProject/study/")
# 运行用例
# unittest.TextTestRunner().run(suite)
# 测试报告
import unittestreport
runner=TestRunner(suite).run()
5. fixture 夹具
'''
1、以下的方法是定义在class类的下面,类需要继承unnittest
2、后面的-> None 是指方法的返回值。说明这些方法都没有返回值
3、可以将这些方法好好利用,用作测试用例前的造数据啊等等,或者测试用例用关闭浏览器啊 清理数据的工作,避免冗余代码
'''
def setUp(self) -> None:
print("每个测试方法执前 执行")
def tearDown(self) -> None:
print("每个测试方法执后 执行")
@classmethod
def setUpClass(cls) -> None:
print("每个测试类前执行 执行")
@classmethod
def tearDownClass(cls) -> None:
print("每个测试类后执行 执行")
练习
def login(username=None, password=None):
if username is None or password is None:
return {“code”: “400”, “msg”: “用户名或密码为空”}
if username == ‘yuz’ and password == ‘123’:
return {“code”: “200”, “msg”: “登录成功”}
return {“code”: “300”, “msg”: “用户名或密码错误”}
- 1,使用 unittest 对上面的函数进行测试
- 2, 在 login.py 文件中保存上面的函数
- 3,在 test_login.py 文件中编写测试用例函数,根据需求设计多个用例函数。
- 4,在 run_test.py 文件中收集用例,并使用 unittestreport 或者 beautifulreport 完成测试报告生成。
# login文件
# 被测函数 --login.py
def login(username=None, password=None):
if username is None or password is None:
return {"code": "400", "msg": "用户名或密码为空"}
if username == 'yuz' and password == '123':
return {"code": "200", "msg": "登录成功"}
return {"code": "300", "msg": "用户名或密码错误"}
# 测试用例文件 test_login.py
import unittest
import unittestreport
from study.login import login
ture_data = [{"username": "yuz", "password": "123"}]
# 未对长度做控制,暂不测试
false_data = [{"username": "yuz", "password": "1234"}, # 用户名正确,密码不正确
{"username": "yuzz", "password": "1234"}, # 用户名不正确,密码正确
{"username": "", "password": "123"}, # 用户名为空,密码正确
{"username": "yuz", "password": ""}, # 用户名正确,密码为空
{"username": "", "password": ""}, # 用户名为空,密码为空
{"username": "zz", "password": "qaz"}, # 输入不存在的用户名密码
{"username": "!!~", "password": "123"}, # 验证用户名是否支持特殊字符,
{"username": "yuz", "password": "!!!"}, # 验证密码是否支持特殊字符
]
exspr_data = [{"code": "300", "msg": "用户名或密码错误"},
{"code": "400", "msg": "用户名或密码为空"},
{"code": "200", "msg": "登录成功"}]
class TestLogin(unittest.TestCase):
def test_login_ture(self):
res = login(ture_data[0]["username"], ture_data[0]["password"])
self.assertEqual(exspr_data[2], res)
def test_login_false(self):
for i in false_data:
if i['username'] is None or i['password'] is None:
res = login(i["username"], i["password"])
self.assertEqual(exspr_data[1], res)
else:
res = login(i["username"], i["password"])
self.assertEqual(exspr_data[0], res)
# test_suite.py
import unittest
from unittestreport import TestRunner
suite=unittest.defaultTestLoader.discover(r"/Users/zhouna/PycharmProjects/pythonProject/study/")
runner=TestRunner(suite,templates=2).run()