unittest框架学习及实践
前言
该篇主要介绍unittest框架并使用unittest框架对学员管理系统进行测试
一、unittest框架学习
1、定义
unittest是python单元测试框架,官方库。
unittest中有4个重要的概念:test fixture(前置和后置,特殊函数), test case(测试用例), test suite(套
件), test runner(执行器)
test fixture
Fixture是一个概述,对一个测试用例环境的初始化(前置条件)和销毁(后置条件)就是一个Fixture。
Fixture控制级别分为:方法级别和类级别
1、方法级别:运行一次测试方法(测试用例)就会运行一次setUp和tearDown
def setUp(self) -> None:
# 这里是为每条测试用例做的前置动作
stu = Student('7', '哈哈', 78326262)
res = StuOperate.add_stu(stu)
print('方法级别的前置动作')
def tearDown(self) -> None:
# 这里是为每条测试用例做的后置动作
StuOperate.delete_stu('7')
print('方法级别的后置动作')
2、类级别:每个测试类只会运行一次setUpClass和tearDownClass,在写类级别的前后置动作是必须加上@classmethod装饰器。
# 测试用例前置动作,数据准备
@classmethod
def setUpClass(cls) -> None:
# 这里为当前测试类下的用例准备测试数据
stu = Student('7', '哈哈', 78326262)
res = StuOperate.add_stu(stu)
print('类级别的前置动作')
@classmethod
def tearDownClass(cls) -> None:
# 这里是在当前类下所有测试用例执行完成之后,要做的后置动作
# 执行完成后将测试数据清掉
StuOperate.delete_stu('7')
print('类级别的后置动作')
testcase(测试用例)
1、测试类必须继承unittest.TestCase
2、一个测试方法就是一个测试用例,测试方法必须以test开头。
testsuite(测试套件)
testsuite测试套件是把多条测试用例集合到一起,通过一系列代码去控制要执行哪些测试方法、测试类或测试用例。
第一种方法:创建suite对象,把测试用例依次加入suite套件
- 实例化: suite = unittest.TestSuite() (suite:为TestSuite实例化的名称)
- 添加用例:suite.addTest(ClassName(“MethodName”)) (ClassName:为类名;MethodName:为方法名)
# 在这里完成测试用例的组织
suite = unittest.TestSuite()
# 只执行TestStudent的test_add_stu测试用例
suite.addTest(TestStudent('test_add_stu'))
第二种方法:从文件中加载测试用例,然后形成测试套件
# 通常我们测试脚本会有很多个,存放在某个目录下,那么我们可以批量加载
suite = unittest.defaultTestLoader.discover('guanlixitong','test*.py')
第三种方法:从测试类中加载用例,形成suite套件
suite = unittest.defaultTestLoader.loadTestsFromTestCase(Add)
执行器runner
1、普通文本执行器
# 加一个执行,右键执行才会出现
runner = unittest.TextTestRunner()
runner.run(suite)
2、能生成测试报告的执行器
from guanlixitong.HTMLTestRunner import HTMLTestRunner
suite = unittest.defaultTestLoader.discover('guanlixitong','test*.py')
with open('testreport.html',mode='wb') as f:
HTMLTestRunner(f,title='测试报告',description='这是个测试报告').run(suite)
生成测试报告
生成测试报告需借助第三方工具HTMLTestRunner
二、使用unittest框架对学员管理系统进行测试
1.数据驱动
数据驱动是将数据存在一个对象中,只写一条测试用例根据数据的多少去执行,需要安装第三方库ddt。
1)将数据存储在test_data列表中
test_data = [
['7', {'name': '张三', 'phone': '1773663', 'qq': '364646'}, '修改成功'],
['67', {}, '学员id:67不存在']
]
2)如何将测试用例传给测试数据呢?
a:在用ddt的类上方加上ddt装饰器 @ddt.ddt()
b:在方法上方增加相关数据读取@ddt.data(*test_data)
c:在方法中用data接收数据
@ddt.ddt()
class TestChangeStudentDDT(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
stu = Student('7', '哈哈', 78326262)
res = StuOperate.add_stu(stu)
#清楚id为67的学员
StuOperate.delete_stu('67')
print("这是类前置动作")
@classmethod
def tearDownClass(cls) -> None:
StuOperate.delete_stu('7')
print("这是类后置动作")
test_data = [
['7', {'name': '张三', 'phone': '1773663', 'qq': '364646'}, '修改成功'],
['67', {}, '学员id:67不存在']
]
@ddt.data(*test_data)
def test_change(self,data):
print(data)
#data是个列表
id=data[0]
kwargs=data[1]
expect_value=data[2]
#将数据使用到用例中
#**kwarg表示把name=张三, phone=1773663, qq=364646
res = StuOperate.change_stu(id,**kwargs)
assert res == expect_value
2.执行用例
测试用例编写完成后,执行测试用例。(数据驱动方法只编写了两条用例)
import unittest
from guanlixitong.HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
# 在这里完成测试用例的组织
# suite = unittest.TestSuite()
# # 只执行TestStudent的test_add_stu测试用例
# suite.addTest(TestStudent('test_add_stu'))
# 通常我们测试脚本会有很多个,存放在某个目录下,那么我们可以批量加载
suite = unittest.defaultTestLoader.discover('guanlixitong','test*.py')
# 加一个执行,右键执行才会出现
# runner = unittest.TextTestRunner()
# runner.run(suite)
# 对于测试来说,最终我们需要一个比较直观的测试报告
# 借助一个第三方的工具,来实现执行器,并生成测试报告
# 重新创建一个执行器
with open('testreport.html',mode='wb') as f:
HTMLTestRunner(f,title='测试报告',description='这是个测试报告').run(suite)