UnitTest:python自带的一个单元测试框架,用它来进行单元测试
UnitTes核心要素
TestCase(测试用例):
第一步:导入unittets模块
第二步:实现一个类,类必须继承unittest.TestCase类
第三步:类中每个方法代表一个测试用例,方法名必须以test开头
案例:
import unittest
# 测试用例1
def sum(a,b):
return a+b
# 创建测试合集,继承unittest.TestCase
class my_test(unittest.TestCase):
# 测试用例1
def test001(self):
# 断言是否相同
self.assertEqual(sum(5,6),11)
# 测试用例1
def test002(self):
# 断言是否相同
self.assertEqual(sum(4,4),10)
if __name__ == '__main__':
unittest.main()
TestSuite(测试套件,把多个TestCase集成到一个测试TestSuite):
使用场景:将所有测试用例进行集合为测试套件(包括不同py文件下的测试合集与测试用例)
使用方式:
注意先导入需要集合的py文件
比如 from test_001 import *
1.实例化:suite=unittest.TestSuite()
2.添加用例:suite.addTest(ClassName(“MethodName”))
(ClassName:为类名;MethodName:为方法名)
3.添加测试合集:
python2写法:suite.addTest(unittest.makeSuite(ClassName))
python3写法:suite.addTest(unittest.TestLoader().loadTestsFromTestCase(ClassName))
4.执行在suite中的用例:
实例化TextTestRunner对象runner=unittest.TextTestRunner()
调用run方法runner.run(suite)
(suite:为suite测试套件)
案例:
import unittest
from 杂项.test_unittest import *
suite=unittest.TestSuite()
# 添加用例-用于添加单个用例
suite.addTest(my_test('test001'))
suite.addTest(my_test('test002'))
# 添加扩展-用于添加多个用例
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(my_test))
# 实例化TextTestRunner对象
runner=unittest.TextTestRunner()
# 调用对象的run方法
runner.run(suite)
unittest 断言:
assertEqual(a, b) # 判断a和b是否相等
assertNotEqual(a, b) # 判断a不等于b
assertTrue(a) # 判断a是否为Ture
assertFalse(a) #判断a是否为False
assertIn(a, b) # 判断a 包含在b里面
asserNotIn(a, b) # 判断a 不包含在b里面
案例:
import unittest
# 测试用例1a
def test(a):
return a
# 继承unittest.TestCase
class MyTest(unittest.TestCase):
# 测试用例1
def test001(self):
# 判断a和b是否相等
self.assertEqual(test(1), 1)
# 测试用例1
def test002(self):
# 判断a不等于b
self.assertNotEqual(test(1), 2)
def test003(self):
# 判断返回为True
self.assertTrue(test(True))
def test004(self):
# 判断返回为False
self.assertFalse(test(False))
def test005(self):
# 判断a 包含在b里面
self.assertIn(test("1"), "123456")
def test006(self):
# 判断a 不包含在b里面
self.assertNotIn(test("1"), "23456")
if __name__ == '__main__':
unittest.main()
TestLoader(自动从代码中加载多个测试用例TestCase):
使用场景:从指定目录查找指定py文件的所有测试用例并自动加载到Testsuite中
import unittest
# 获取当前目录下以test开头的py文件
suite=unittest.TestLoader().discover("./","test*.py")
# 实例化TextTestRunner对象
runner=unittest.TextTestRunner()
# 调用对象的run方法
runner.run(suite)
Fixture(UnitTest特性):
- 使用场景:可以在测试用例执行前或执行结束后自动调用指定的函数
- 控制方法:
-
方法级:每个方法执行前和执行结束后都调用的函数
- setUp():每个方法执行前都需要执行这个函数
- tearDown():每个方法执行结束后都需要执行这个函数
案例:import unittest # 测试用例1a def test(a): return a # 继承unittest.TestCaseU class MyTest(unittest.TestCase): def setUp(self): print('方法级别脚本初始化') def tearDown(self): print('方法级别脚本结束处理') # 测试用例1 def test001(self): # 判断a和b是否相等 self.assertEqual(test(1), 1) # 测试用例1 def test002(self): # 判断a不等于b self.assertNotEqual(test(1), 2) ```
-
类级:每个类执行前和执行结束后都调用的函数
- @classmethod setUpClass(cls):每个方法执行前都需要执行这个函数
- @classmethod tearDownClass(cls):每个方法执行结束后都需要执行这个函数
- 案例:
import unittest # 测试用例1a def test(a): return a # 继承unittest.TestCaseU class MyTest(unittest.TestCase): @classmethod def setUpClass(cls): print('类级别脚本初始化') @classmethod def tearDownClass(cls): print('类级别脚本结束处理') # 测试用例1 def test001(self): # 判断a和b是否相等 self.assertEqual(test(1), 1) # 测试用例1 def test002(self): # 判断a不等于b self.assertNotEqual(test(1), 2)
-
模块级:每个模块(一个模块就是一个py文件)执行前和执行结束后都调用的函数
-
setUpModule():每个模块执行前都需要执行这个函数
-
tearDownModule():每个模块执行后都需要执行这个函数
-
案例:
import unittest # 测试用例1a def test(a): return a def setUpModule(): print('模块级别脚本初始化') def tearDownModule(): print('模块级别脚本结束处理') # 继承unittest.TestCaseU class MyTest(unittest.TestCase): # 测试用例1 def test001(self): # 判断a和b是否相等 self.assertEqual(test(1), 1) # 测试用例1 def test002(self): # 判断a不等于b self.assertNotEqual(test(1), 2)
-
参数化的使用:
使用场景:多次执行的重复的函数,且只有传递的参数不一样时可使用参数化
安装parameterized:pip install parameterized
导包:from parameterized import parameterized
- 使用@parameterized.expand()装饰器进行参数化
使用:@parameterized.expand([(数据1),(数据2),(数据3)])
注意:元组内的数据必须要有2个,假如只有一个会报错比如@parameterized.expand([(1),(2),(3)])
案例:import unittest from parameterized import parameterized # 测试用例1a def test(a): return a # 继承unittest.TestCaseU class MyTest(unittest.TestCase): # 参数化的使用 @parameterized.expand([(1,2),(4,4),(5,6)]) def test001(self,a,b): # 判断a和b是否相等 self.assertEqual(test(a), b)
用例的跳过:
使用场景:有些用例在某些场景不用执行时可使用 @unittest.skip()跳过该用例
直接跳过:@unittest.skip(str)
条件达成时跳过:@unittest.skipIf(条件,str)
案例:
import unittest
# 测试用例1
def test(a):
return a
# 继承unittest.TestCaseU
class MyTest(unittest.TestCase):
p=1
@unittest.skip('跳过这个用例')
def test001(self):
# 判断a和b是否相等
self.assertEqual(test(1), 1)
@unittest.skipIf(p==1,'因为p==1所以跳过该用例')
def test002(self):
# 判断a和b是否相等
self.assertEqual(test(1), 1)
生成测试报告:
在实例化对象中stream变量设置为需要打开的文件位置即可:
- 生成txt文件测试报告:
案例:import unittest # 获取当前目录下以test开头的py文件 suite=unittest.TestLoader().discover("./","test*.py") # 设置测试报告的地址及编码格式 file=open("test01.txt","w",encoding='utf-8') # 实例化TextTestRunner对象 runner=unittest.TextTestRunner(stream=file,verbosity=2) # 调用对象的run方法 runner.run(suite)
- 生成html文件的测试报告(重点):
使用UnitTestReport测试报告模块进行生成,
项目地址:https://github.com/musen123/UnitTestReport
unittestreport是基于python3.6开发的,安装前请确认你的python版本>3.6
安装:pip install unittestreport
案例:import unittest from unittestreport import TestRunner # 获取当前目录下以test开头的py文件 suite=unittest.TestLoader().discover("./","test*.py") # 生成实例 run=TestRunner(suite) run.run()
- TestRunner初始化参数:
在使用TestRunner创建测试运行程序时,可以通过以下参数来,自定义报告的相关内容
suites: 测试套件(必传)
filename: 指定报告文件名
report_dir:指定存放报告路径
title:指定测试报告的标题
templates: 可以指定1,2,3三个风格的模板
tester:测试人员名称import unittestreport # 1、加载测试用例到套件中 suite = unittest.defaultTestLoader.discover(r'C:\project\open_class\Py0507\testcase') # 2、创建一个用例运行程序 runner = unittestreport.TestRunner(suite, tester='测试人员名称', filename="C:\project\", report_dir=".", title='这里设置报告标题', desc='测试生成的报告描述', templates=2 ) # 3、运行测试用例 runner.run()
- 用例描述:
只需要在测试函数下,用三个单引号里面写用例描述即可比如:
class Test001(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_API001(self):
'''用例描述001''' #用例描述,在函数下,用三个单引号里面写用例描述
self.assertTrue(True)
pass
if __name__ == '__main__':
unittest.main()
报告结果:
-
templates: 指定1,2,3三个风格的模板样式分别如下,
测试报告样式示例图:
报告样式一:
报告样式二:
报告样式三: