python unittest单元测试框架
unittest单元测试框架的作用
unittest单元测试框架就是自动化测试中为了便于维护和管理测试用例的,能够生成测试报告和进行测试统计的一个框架
1.提供了测试用例的组织与执行
2.提供了丰富的断言方法
3.提供了丰富的日志信息
unittest单元测试框架的4个组件
1.测试用例
一个函数(必须以test为前缀命名,否则会被视为普通函数)就是一个测试用例
2.测试套件
一堆测试用例的集合
3.测试执行器
用来执行单元测试,并给出测试报告
4.测试固件
(1)setUp(self),每个测试用例执行前都会调用,在setUp(self)之前还可以添加一个类方法:
def setUpClass(cls):它会在所有用例前执行一次(也在setUp之前执行),不管有多少用例,都只执行一次,在这个类方法上必须添加装饰器@classmethod
(2)tearDown(self),每个测试用例执行完毕后都会调用,在teatDown(self)之前还可以添加一个类方法:
def teatDownClass(cls):它会在所有用例执行完毕后一次(也在tearDown之后执行),在这个类方法上必须添加装饰器@classmethod
如果没有setUpClass和tearDownClass,测试类中一般将setUp()和tearDown()写在第一,第二位,
如果有,那么类方法要写在前面,如图:
编写测试用例
普通类(要被测试的类):
再写测试用例的时候一般都是放在测试类中,如:
这里的TestCase类是所有测试类的基类,测试类都要继承这个类
注意基类中已有构造函数,这里不需要你写
测试用例(即以test为前缀命名的函数)一般不允许自定义参数
执行测试用例
执行测试用例一般有2种方法:
1.使用入口函数unittest.main()
2.
(1)另外建一个py文件
(2)在该文件中,使用unittest.TestSuite()新建测试套件
(3)用addTest()方法添加测试用例到套件,格式如上图
(4)使用unittest.TextTestRunner()安装测试执行器
(5)使用run()方法执行测试套件
ddt数据驱动
使多组数据可以在一个测试用例中使用
经过unpack解包的数据会被分开为多组,然后每一组数据有几个参数就相应传入用例中,
如果不给unpack,传入多组数据,会造成只将第一组数据整体传给用例的第一个参数,后面的参数会接收不到参数而报错(E),每有一组数据,会报错一次
@ddt.data(*a)
*表示可变参数,即可以传多个参数
@ddt.data(**a)
**表示关键字参数
makeSuite用法详解
makeSuite方法说白了就是将一个类中的所有测试用例打包成一个集合,它的参数就是类名
用法
1.作为TestSuite的参数
当作为TestSuite的参数时,意思就是说我makeSuite打包好的用例给TestSuite,让TestSuite用这些用例来生成套件(所以说此时的套件已经有了用例,不需要在用addTest来添加)
import unittest
class MyTest(unittest.TestCase):
def test_01(self):
print("111")
def test_02(self):
print("222")
t = unittest.makeSuite(MyTest)
#注意:上面一行就是将测试类MyTest中的所有用例打包
#(这里只是打包,还没有形成套件!!!)
suit = unittest.TestSuite(t)
#这一行才是将打完包的测试用例生成测试套件
#注意这个时候测试套件suit里面已经有了测试用例了,
#不需要通过addTest方法再添加用例了
my_run = unittest.TextTestRunner()#生成测试执行器
my_run.run(suit)#执行套件suit
2.作为addTest方法的参数
用makeSuite打包好的测试用例还是测试用例,放在addTest里面直接添加用例到套件就行了
import unittest
class MyTest(unittest.TestCase):
def test_01(self):
print("111")
def test_02(self):
print("222")
#当makeSuite作为addTest的参数时,那么我们就要先创建测试套件了
suit = unittest.TestSuite()#新建测试套件
suit.addTest(unittest.makeSuite(MyTest))
#上面就是添加测试用例,
#注意这里的用例是用makeSuite打包的测试类MyTest的所有用例
myrun = unittest.TextTestRunner()
myrun.run(suit)
注:
python3中已经没有makeSuite了,被以下方法替换了
以前是:
suite = unittest.TestSuite(unittest.makeSuite(MyTest))
python3中是:
suite = unittest.TestSuite(unittest.TestLoader().loadTestsFromTestCase(MyTest))