Python中的unittest模块

unittest是Python内置的模块,在测试中只需要导入unittest模块,就可以使用,unittest包含四大组成部分,分别是测试固件、测试用例、测试套件、测试执行器

一、测试固件
  1. 测试固件分为执行前的部分和执行后的部分,执行前的部分叫做setUp(),一般用作打开浏览器,链接数据库等真正开始测试之前使用;执行后的部分叫做tearDown(),主要用作关闭浏览器,断开数据库链接等部分
  2. setUp()和teardowm()在执行的时候,每执行一个用例的时候就需要打开一次和关闭一次,就是说,如果有3个用例在测试脚本中,那么浏览器就需要打开三次,关闭三次,为了解决这个问题,需要用到setUpClass()和tearDownClass,但是在用这个之前,只需要在方法前面加上@classmethod,这样以来,执行三个用例的时候,浏览器只打开和关闭一次,如图:
import unittest
class Testproject(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("测试开始。。。")
    @classmethod
    def tearDownClass(cls):
        print("结束测试。。。")
    def test_001(self):
        print("这是第一个测试用例")
    def test_two(self):
        print("这是第二个测试用例")
    def test_003(self):
        print("这是第三个测试用例")
if __name__ == '__main__':
        unittest.main()

运行结果:在这里插入图片描述

二、测试用例
  1. 在unitt中,测试用例的函数是以test开头的,在执行用例的时候,unittest会自动识别test开头的函数是测试代码,切记一定要用小写的test开头!如上图均已test开头,测试固件包含在测试用例中,可写可不写。
  2. 在测试用例中,当我们不想执行某个用例的时候,只需要在测试用例前加上装饰器@unittest.skip就可跳过该用例,执行下面的用例
import unittest
class Testproject(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("测试开始。。。")
    @classmethod
    def tearDownClass(cls):
        print("结束测试。。。")
    def test_001(self):
        print("这是第一个测试用例")
    def test_two(self):
        print("这是第二个测试用例")
    def test_003(self):
        print("这是第三个测试用例")
    def test_four(self):
        print("这是第四个测试用例")
if __name__ == '__main__':
        unittest.main()

没加装饰前,四个用例均会被执行,加装饰器后,代码如下:

import unittest
class Testproject(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("测试开始。。。")
    @classmethod
    def tearDownClass(cls):
        print("结束测试。。。")
    def test_001(self):
        print("这是第一个测试用例")
    def test_two(self):
        print("这是第二个测试用例")
    def test_003(self):
        print("这是第三个测试用例")
    @unittest.skip
    def test_four(self):
        print("这是第四个测试用例")
if __name__ == '__main__':
        unittest.main()

此时第四个用例不会被执行,结果如下:
在这里插入图片描述

三、测试执行器

测试执行器(testrunner)用来执行测试用例,可以执行单个测试用例,也可以通过测试套件批量执行用例,测试执行器有两种执行方法

  1. 直接使用unittest.main()执行,当直接使用unittest.main()执行时,unittest会搜索所有以test开头的测试用例,按照ASCII的顺序执行多个用例,上图没有按照一二三的顺序执行就是如此
  2. 使用TextTestRunner()方法初始化一个测试执行器,然后往测试套件添加测试用例,通过run()去执行测试套件从而执行测试用例。那么什么是测试套件了,测试套件就是测试用例的集合,根据测试套件执行用例的时候,会根据用例的加载顺序执行,使用addTest()方法加载测试方法到测试套件中,addTest()如果要在传入别的包下的测试方法: 包名.类名(测试方法函数)
if __name__=='__main__':
    suite = unittest.TestSuite()
    suite.addTest(Testproject('test_001'))  # Testproject是类名,test_001是测试函数
    suite.addTest(Testproject('test_two'))  # 如果是Testproject是其他包下的,就是包名.Testproject(‘test_002’)
    suite.addTest(Testproject('test_003'))  # 从上到下依次执行
    runner = unittest.TextTestRunner()
    runner.run(suite)
四、测试套件
  1. 使用makeSuite()可以把一个类下面所有测试方法都加载到测试套件中
import unittest
class Testproject(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("测试开始。。。")
    @classmethod
    def tearDownClass(cls):
        print("结束测试。。。")
    def test_001(self):
        print("这是第一个测试用例")
    def test_two(self):
        print("这是第二个测试用例")
    def test_003(self):
        print("这是第三个测试用例")
    @unittest.skip
    def test_four(self):
        print("这是第四个测试用例")
suite = unittest.TestSuite(unittest.makeSuite(Testproject))
if __name__=='__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite)
  1. 最常用的是使用discover()方法可以把指定路径下所有测试方法都加载到测试套件中
test_dir = r'C:\Users\fsy\PycharmProjects\testing\testing'  #测试用例的路径
discover = unittest.defaultTestLoader.discover(test_dir, pattern='fi*.py')
runner = unittest.TextTestRunner()
runner.run(discover)

在这里插入图片描述
test_dir是指定的路径,pattern是指定的文件名。pattern参数是定义文件名匹配规则的,可以随便修改
比如这里fi*.py是指文件名以fi开头的文件
也可以写成test文件带有test的文件
如果是*fist.py,那就是指文件名以fist.py结尾的文件
*起到跟通配符差不多的作用
3. 在测试中还可以把整个测试类加入到测试套件中,然后执行, suite.addTest(Testproject)将执行Testproject类下的所有用例

猜你喜欢

转载自blog.csdn.net/qq_41500249/article/details/106367114
今日推荐