unittest框架提供了创建测试用例、测试套件以及批量执行的解决方案。
利用单元测试框架创建测试类,可以把每个测试方法看成是一个最小的单元, 由测试容器组装打包起来,然后可以统一执行,最后输出测试报告。
一、UnitTest核心要素
- TestCase:测试⽤例,脚本代码。
- TestSuite:测试套件,⽤来组装(打包)TestCase(测试⽤例)的,即可以将多个⽤例脚本⽂件组装到⼀起,用于批量执行测试。
- TestRunner:测试执⾏,用来执⾏TestSuite(测试套件)中的测试用例。
- TestLoader:测试加载,⽤来组装(打包)TestCase(测试⽤例)的,是对TestSuite(测试套件)功能的补充。
- Fixture:测试脚手架,用于初始化和清理测试的运行环境,比如打开浏览器、打开指定网页、关闭浏览器等,其中setUp()和tearDown()是最常用的方法。
- TestReport:生成测试报告。
二、TestCase测试用例
在unittest框架中,一个测试用例指的是测试类中的测试方法。测试用例是由测试类中的测试方法组成的,每个测试方法对应于被测试代码的一个具体功能或者一个场景。通常情况下,一个.py文件中可能包含多个测试类和多个测试方法。
三、TestSuite测试套件
测试套件可以将多个测试⽤例组装打包到⼀起,用于批量执行测试。
1)操作步骤
- 实例化TestSuite测试套件对象。
suite = unittest.TestSuite()
- 添加测试用例。
- 方式一:添加一个测试类中的一个测试方法。
# ClassName:测试类名 # MethodName:测试方法名 suite.addTest(ClassName("MethodName"))
- 方式二:将指定测试类中的测试用例全部添加到测试套件中。
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(ClassName))
- 方式一:添加一个测试类中的一个测试方法。
- 实例化TestRunner对象,执行TestSuite中的测试用例。
runner = unittest.TextTestRunner() runner.run(suite)
2)创建cal.py文件,编写测试类及测试方法
import unittest# 实现加法操作
def add(a, b):return a + b# 实现减法操作
def sub(a, b):return a - b# 第一个测试类
class TestAdd(unittest.TestCase):def test_add_01(self):print('TestAdd.test_add_01:{}'.format(add(1, 1)))def test_add_02(self):print('TestAdd.test_add_02:{}'.format(add(2, 2)))# 第二个测试类
class TestSub(unittest.TestCase):def test_sub_01(self):print('TestAdd.test_sub_01:{}'.format(sub(1, 1)))def test_sub_02(self):print('TestAdd.test_sub_01:{}'.format(sub(2, 1)))
3)创建test.py文件,批量执行测试用例
'''TestSuite 测试套件注:TestSuite将测试用例组装打包好后,需要通过TestRunner进行批量执行。
'''
# 1.导入模块
import unittest
from cal import TestAdd
from cal import TestSub# 2.实例化TestSuite测试套件对象
suite = unittest.TestSuite()# 3.组装打包测试用例
# 方式一:添加一个测试类中的测试方法
suite.addTest(TestAdd('test_add_01'))
suite.addTest(TestAdd('test_add_02'))
# 方式二:将指定测试类中的测试方法全部添加到TestSuite中
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(TestSub))# 4.实例化TestRunner对象,批量执行TestSuite中的测试用例
runner = unittest.TextTestRunner()
runner.run(suite)
四、TestRunner测试执行
用来执⾏TestSuite测试套件中的测试用例。使用步骤参考上述示例代码:
- 导入模块:import unittest。
- 实例化TestRunner对象:runner = unittest.TextTestRunner()。
- 执⾏测试用例:runner.run(TestSuite测试套件对象)
五、TestLoader测试加载
TestSuite一次只能添加单个测试方法或单个测试类,而TestLoader能一次添加多个.py文件中的测试用例。
使用unittest.TestLoader,通过该类下面的discover()方法自动搜索指定目录下的指定.py文件,并将查找到的测试用例组装到测试套件中。
1)使用步骤
2)示例代码
'''TestLoader 测试加载
'''
# 1.导入模块
import unittest# 2.添加.py文件中的测试用例
# unittest.defaultTestLoader.discover('测试用例所在目录', '测试用例代码文件名.py')
suite = unittest.defaultTestLoader.discover('.', 'cal.py')# 3.实例化TestRunner对象,批量执行测试用例
runner = unittest.TextTestRunner()
runner.run(suite)
3)TestLoader和TestSuite的区别
六、Fixture测试脚手架
在测试⽤例执⾏前后会⾃动执⾏的代码结构,例如:setUp、tearDown、setUpClass、tearDownClass等,可用于初始化和清理测试的运行环境,比如打开浏览器、打开指定网页、关闭浏览器等。
七、TestReport测试报告
生成测试报告需要第三方工具插件,插件有很多,比如:HTMLTestReport插件、HTMLTestRunner插件等。
安装命令:pip install HTMLTestReport
1)使用步骤
- 导入模块:from htmltestreport import HTMLTestReport。
- 封装测试套件:TestSuite或者TestLoader。
- 实例化HTMLTestReport对象。
- 执行测试套件中的测试用例。
2)示例代码
import unittest
from htmltestreport import HTMLTestReport
from cal import TestAdd# 1.创建TestSuite测试套件
suite = unittest.TestSuite()
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(TestAdd))# 2.实例化HTMLTestReport对象
report_path = "./report/report.html"
report = HTMLTestReport(report_path, title='单元测试报告', description='V1.0')# 3.执行测试套件中的测试用例
report.run(suite)