美文网首页
unittest单元测试框架

unittest单元测试框架

作者: C1R2 | 来源:发表于2020-09-14 22:39 被阅读0次

    unittest工作原理

    unittest中最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture

    (1)一个TestCase的实例就是一个测试用例。测试用例就是指一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。单元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

    (2)而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

    (3)TestLoader是用来加载TestCase到TestSuite中的。

    (4)TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法

    (5)测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

    综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。

    用例编写

    1. 新建一个test_开头(必须)的.py文件,如test_user_login.py
    2. 导入unittest
    3. 编写一个Test开头(必须)的类,并继承unittest.TestCase,做为测试类
    4. 在类中编写一个test_开头(必须)的方法,作为用例

    用例断言

    unittest提供了丰富的断言方法,常用为以下几种:

    判断相等
        assertEqual(a,b)/assertNotEqual(a,b): 断言值是否相等
        assertIs(a,b)/assertIsNot(a,b): 断言是否同一对象(内存地址一样)
        assertListEqual(list1, list2)/assertItemNotEqual(list1, list2): 断言列表是否相等
        assertDictEqual(dict1, dict2)/assertDictNotEqual(dict1, dict2): 断言字典是否相等
    是否为空
        assertIsNone(a)/assertIsNotNone(a)
    判断真假
        assertTrue(a)/assertFalse(a)
    是否包含
        assertIn(a,b)/assertNotIn(a,b) # b中是否包含a
    大小判断
        assertGreater(a,b)/assertLess(a,b) : 断言a>b / 断言a<b
        assertGreaterEqual(a,b)/assertLessEqual: 断言a>=b / 断言a<=b
    类型判断
        assertIsInstance(a,dict)/assertNotIsInstance(a,list) # 断言a为字典 / 断言a非列表
    
    图片.png

    Test Fixtures(用例包裹方法)

    Test Fixtures即setUp(用例准备)及tearDown(测试清理)方法,用于分别在测试前及测试后执行

    按照不同的作用范围分为:
    setUp()/tearDown(): 每个用例执行前/后执行一次
    setUpClass()/tearDownClass(): 每个测试类加载时/结束时执行一次
    setUpMoudle()/tearDownMoudle(): 每个测试模块(一个py文件为一个模块)加载/结束时执行一次

    '''
    import unittest

    def setUpModule(): # 当前模块执行前只执行一次
    print('=== setUpModule ===')

    def tearDownModule(): # 当前模块执行后只执行一次
    print('=== tearDownModule ===')

    class TestClass1(unittest.TestCase):
    @classmethod # 声明为类方法(必须)
    def setUpClass(cls): # 类方法,注意后面是cls,整个类只执行一次
    print('--- setUpClass ---')

    @classmethod
    def tearDownClass(cls):  
        print('--- tearDownClass ---')
        
    def setUp(self):  # 该类中每个测试用例执行一次
        print('... setUp ...')
        
    def tearDown(self):
        print('... tearDown ...')
        
    def test_a(self):  # 测试用例
        print("a")
        
    def test_B(self): # 大写B的ascii比小写a靠前,会比test_a先执行
        print("B")
    

    class TestClass2(unittest.TestCase): # 该模块另一个测试类
    def test_A(self):
    print("A")

    if name == 'main':
    unittest.main()

    '''

    相关文章

      网友评论

          本文标题:unittest单元测试框架

          本文链接:https://www.haomeiwen.com/subject/nejclktx.html