python之Unittest框架介绍
一、Unittest框架介绍
unittest是python自带的一个单元测试框架,不仅适用于单元测试,还可以用于web、appium、接口自动化测试用例的开发与执行。Unittest提供了许多用于编写测试用例的工具和功能,使得测试代码的编写和执行变得简单直接。
二、Unittest框架要素
Unittest中最核心的四个概念是:
- TestCase:测试用例
- TestSuite:测试套件
- TestRunner:用来执行测试用例和测试套件,并返回测试用例的执行结果
- TestFixure:测试夹具(测试固件),代表执行一个或者多个测试所需的环境准备,以及关联的清理动作
备注:TestLoader:批量执行测试用例
* 一个testcase实例就是一个测试用例
//什么是测试用例?
--就是一个完整的测试流程,包括测试前环境的搭建(setup),执行测试代码(run),测试后环境的还原(teardown)。
* 而多个测试用例集合在一起,就是testsuite,testsuite可以嵌套testsuite。
* testloader是用来加载testcase到testsuite中
* testrunner是执行测试用例,测试结果保存在testrunner实例中,包括运行了多少测试用例,成功了多少,失败了多少,跳过了多少等。
* testfixture是测试夹具,是对一个测试用例环境的搭建和销毁,如setup、teardown
三、Unittest使用
3.1 TestCase
我们在写测试用例时,会继承unittest的TestCase的类和方法。一个TestCase就是一个测试用例,unittest中的测试用例都是以test开头,执行顺序是按照方法名的ASCLL值进行排序。
# 导入unittest模块
import unittest
class TestDemo(unittest.TestCase):
def test_01(self):
print("test case 01")
self.assertEqual('test'.upper(),"TEST")
def test_02(self):
print("test case 02")
self.assertTrue("test".upper())
if __name__ == "__main__":
# 执行用例
unittest.main()
说明
- 每个测试用例的结果标识,成功是
.
,失败是F,出错是E,跳过是S - 执行的顺序,跟方法的顺序没有关系
- 每个用例都是test开头,否则不被识别
3.2 TestSuite
我们可以把多个测试用例集合在一起运行,就产生了TestSuite测试套件。
import unittest
#...省略
suite = unittest.TestSuite() # 实例化一个对象suite
# 添加测试用例
suite.addTest(TestDemo("test_01"))
suite.addTest(TestDemo("test_02"))
备注:TestSuite需要配合TestRunner才会被执行
3.3 TestRunner
TestRunner测试运行器,用于执行测试用例的组件,自动运行测试用例并生成测试结果报告。负责加载测试用例,执行测试用例,并提供测试报告输出。
unittest提供了多种测试运行器,如:TextTestRunner、HTMLTestRunner、XMLTestRunner等,可以根据不同的需求选择不同的运行器。
import unittest
#...省略
suite = unittest.TestSuite() # 实例化一个对象suite
# 添加测试用例
suite.addTest(TestDemo("test_01"))
suite.addTest(TestDemo("test_02"))
# 实例化运行器
runner = unittest.TextTestRunner()
# 运行测试套件
runner.run(suite)
四、TestFixure
TestFixure测试夹具,是一个用于设置和清理测试环境的方法。允许在每个测试方法前后运行特定的代码。例如:初始化测试所需的对象或数据,并在测试完成后对这些对象数据进行清理。
4.1 setUp()和tearDown()方法
这两个方法分别在每个测试方法之前和之后运行。
import unittest
class TestDemo(unittest.TestCase):
def setUp(self):
# 在这里初始化你的测试环境,例如创建对象或加载数据
print("setUp: 准备测试环境")
self.test_data = [1, 2, 3]
def tearDown(self):
# 在这里清理你的测试环境
print("tearDown: 清理测试环境")
del self.test_data
def test_01(self):
print("test case 01")
self.assertEqual('test'.upper(),"TEST")
def test_02(self):
print("test case 02")
self.assertTrue("test".upper())
if __name__ == "__main__":
unittest.main()
4.2 setUpClass()和tearDownClass()方法
setUpClass()和tearDownClass()是类级别的fixture,就是在所有测试方法之前和之后运行一次的代码,例如:数据库连接。
import unittest
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass: 准备测试环境")
cls.class_data = [1, 2, 3]
@classmethod
def tearDownClass(cls):
print("tearDownClass: 清理测试环境")
del cls.class_data
def test_01(self):
print("test case 01")
self.assertEqual('test'.upper(),"TEST")
def test_02(self):
print("test case 02")
self.assertTrue("test".upper())
if __name__ == "__main__":
unittest.main()
备注
- 使用setUp()和tearDown()使用于每个测试方法的独立设置和清理
- setUpClass()和tearDownClass()适用于类的所有测试方法的共享设置和清理