Unittest框架介绍及常用组件

1、unittest框架介绍

        unittest是Python自带单元测试框架,提供丰富的用例管理、执行和断言操作。

2、unittest框架常用组件

        (1)TestCase,测试用例,继承于TestCase的类或者TestCase的实例就是一个测试例。在unittest中表示测试用例的方法都必须以test开头才能被执行,各个方法之间的执行顺序按照ASCII值排序。

import unittest
class TestDemo(unittest.TestCase):
    def test_case(self):
        print('测试用例方法......')
       
    def non_test(self):
        # 非test开头的测试用例在测试执行时不会被执行
        print('非测试用例方法')

if __name__ == '__main__':
    # 执行测试用例
    unittest.main()

        (2)TextFixture, 测试夹具。用于测试用例执行前前置条件的准备与执行完毕后的处理。提供以下常用方法:

         ·setUp(),表示每个测试用例执行前进行的操作

        ·tearDown(),表示每个测试用例执行完毕之后的操作

        ·setUpClass(),类方法,表示所有测试用例执行之前的操作,只执行一次

        ·tearDownClass(),类方法,表示所有测试用例执行完毕之后的操作,只执行一次

import unittest

class TestDemo(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print('running setUpClass...')

    def setUp(self) -> None:
        print('running setUp...')

    def tearDown(self) -> None:
        print('running tearDown...')

    @classmethod
    def tearDownClass(cls) -> None:
        print('running tearDownClass...')

    def test_case(self):
        print('测试用例方法......')

if __name__ == '__main__':
    unittest.main()

        (3)TestSuite,测试套件,把需要执行的测试用例放在一起。有两种常用方式来创建测试套件。

        ·使用TestSuite类直接构建

         suit = unittest.TestSuite(tests=()) 直接传入要执行的测试用例tests, tests必须是一个包含单独测试用例的可迭代对象或者其他测试套件 如:

suit = unittest.TestSuite((TestDemo.test_case,))

        ·使用TestSuite类实例对象的addTest()与addTests()方法构建

        addTest() ,一次只能添加一条测试用例

suit = unittest.TestSuite() 
suit.addTest(TestLogin('test_1'))  # 添加TestLogin类的test_

         addTests()  一次可以添加多条测试用例

suit = unittest.TestSuite() 
# 添加TestLogin类的test_1 test_2
suit.addTests([TestLogin('test_1'), TestLogin('test_2')])  

        (4)TestRunner,测试执行器 执行测试用例,并返回测试用例的执行结果,还能将结果以HTML或者Text形式展示出来。即HTMLTestRunner与TextTestRunner

        ·HTMLTestRunner

# 以HTML形式显示测试报告
# 1、创建执行器 
runner = HTMLTestRunner( 
        stream=xxx ,  # 指定输出方式 
        tester=xxx ,   # 测试人员     
        description=xxx ,  # 测试报告描述信息 
        title=xxx ,  # 测试报告标题 
        verbosity=num ,  # 测试报告详细程度, 有3个值(0 1 2默认2(最详细)) ) 

# 2、启动执行器运行测试用例, suit即上文装载了测试用例的TestSuite
runner.run(suit)

        ·TextTestRunner

# 以Text形式显示测试报告
# 1、创建执行器 
runer = TextTestRunner( 
    stream=xxx, # 指定输出方式(默认为None, 输出到控制台) 
                 # 输出到文件 with open('file',''wb) as file_name, stream=file_name                  
    verbosity=num ,  # 测试报告详细程度, 有3个值(0 1 2默认2(最详细)) 
    description=xxx ,  # 测试报告描述信息 
) 

# 2、启动执行器运行测试用例 
runner.run(suit)

        (5)TestLoader,测试装载器,用来将TestCase添加到TestSuite中,有以下几种常用方式         ·loadTestsFromTestCase()  通过类名将测试用例添加到测试套件中

suit = unittest.TestLoader().loadTestsFromTestCase(TestCaseClass)

         ·loadTestsFromModule()  通过模块名将测试模块添加到测试套件中

suit = unittest.TestLoader().loadTestsFromModule(TestCaseModuleName)

         ·loadTestsFromName()  通过名字将测试用例添加到测试套件中,可以是模块,测试用例类或者测试用例类中测试方法

suit = unittest.TestLoader().loadTestsFromName(class.method)
suit = unittest.TestLoader().loadTestsFromName(module.class)
...

         ·loadTestsFromNames()  将序列中的测试用例添加到测试套件中

suit = unittest.TestLoader().loadTestsFromNames(['test_1', 'tesst_2' [,...]])

         ·discover() 将指定路径下指定开头的文件添加到测试套件中(也可以使用unittest中的defaultTestLoader的discover方法)

suit = unittest.TestLoader().discover( 
    start_dir=xxx ,   # 测试用例所在路径 
    pattern=xxx ,   # 匹配规则,符合条件的加入到TestSuite中 
    top_level_dir=xxx ,  # 顶层目录名称,默认None
)

# 执行测试用例
runner = unittest.TextTestRunner()
runner.run(suit)

3、断言

        断言在测试中用来判断实际结果与预期结果是否相等,在unittest框架中,可以使用Python自带的断言,也可以使用unittest框架中的断言。

        ·Python中断言 直接使用 assert 表达式即可

        ·unittest中断言

assertEqual(a, b,msg=None) 
assertNotEqual(a, b,msg=None) 
assertIn(a, b) ...

 4、其他

        (1) skip装饰器

        skip装饰器可以跳过某些测试用例,skip主要有四种用法:

        ·@unittest.skip(reason) 无条件跳过,reason描述跳过的原因

        ·@unittest.skipIf(condition, reason) 有条件跳过,当条件满足时跳过该测试用例

        ·@unittest.skipUnless(condition, reason) 有条件跳过,当condition条件不满足时跳过该测试用例

        ·@unittest.exceptedFailure 用于标记期望执行失败的测试方法,如果该测试方法执行失败则被认为成功,如果执行成功则被认为是失败。

5、一个例子

import unittest

class TestLogin(unittest.TestCase):
    def setUp(self) -> None:
        # 创建套件,每次执行用例前都会执行一次
        print("测试用例执行前准备条件...")

    def test_name(self):
        # 创建第一个测试方法
        assert 'Tom' == 'Bob'

    def test_id(self):
        # 创建第二个测试方法
        self.assertEqual('2983', '2983')

    @unittest.skipIf('test' in 'python test', reason='满足条件跳过该用例')
    def test_time(self):
        self.assertNotEqual('B','C')

if __name__ == '__main__':
    # 创建测试套件,并装载测试用例
    suit = unittest.TestLoader().loadTestsFromTestCase(TestLogin)
    
    # 创建执行器
    runner = unittest.TextTestRunner(
        stream=None,  # 输出到终端
        descriptions='unittest 测试框架',
        verbosity=2
    )
    # 执行测试用例
    runner.run(suit)

 

 

 

 

你可能感兴趣的:(unittest,python,单元测试)