zoukankan      html  css  js  c++  java
  • python单元测试框架unittest总结

    一、基本用法

    unittest是python自带的单元测试框架,主要用于测试用例的组织和执行。

    1、基本概念

    TestCase:即一个测试用例,包含测试环境准备、测试过程、测试结束后环境销毁等完整的测试流程

    TestSuite:多个TestCase的集合构成测试套件

    TestRunner:执行测试用例

    Test fixture:对测试环境的创建和销毁,比如,在测试之前需要进行登录,测试完成后需要进行退出登录,测试用例更过的专注于核心测试逻辑

    上述相关类的源码可以参考博客:https://blog.csdn.net/fengguangke/category_7941105.html

    2、基本用法

    import unittest
    
    from calculator import Count
    
    #测试类需要继承unittest的TestCase类
    class TestCount(unittest.TestCase):
        #重写setUp方法,进行测试前的操作
        def setUp(self):
            print('测试开始')
    
        # 重写tearDown方法,进行测试前的操作
        def tearDown(self):
            print('测试结束')
    
        #测试核心逻辑
        def test_add(self):
            res = Count(1,2).add()
            self.assertEqual(res,3,'计算错误!')
    
        def test_add1(self):
            res = Count(2,3).add()
            self.assertEqual(res,5,'计算错误')
    
    if __name__ == '__main__':
        unittest.main()

    执行结果如下:

     说明:

    1、每个测试用例都会单独执行setUp、tearDown方法;

    2、测试方法以test开头命名;

    二、拓展用法

    参考整理大神博客,主要是:https://blog.csdn.net/fengguangke/category_7941105.html

     1、构建TestSuite的几种方法:

    (1). 通过unittest.TestSuite()类直接构建,或者通过TestSuite实例的addTests、addTest方法构建

    import unittest
    class UserCase(unittest.TestCase):
    
        def testAddUser(self):
            print("add a user")
    
        def testDelUser(self):
            print("delete a user")
    
    if __name__ == '__main__':
        suite = unittest.TestSuite(map(UserCase,['testAddUser','testDelUser']))
        suite2 = unittest.TestSuite()
        suite2.addTests(map(UserCase,['testAddUser','testDelUser']))
        suite3 = unittest.TestSuite()
        suite3.addTest(UserCase('testAddUser'))
        suite3.addTest(UserCase('testDelUser'))

    (2). 通过unittest.TestLoader类的discover、loadTestsFromTestCase、loadTestsFromModule、loadTestsFromName、loadTestsFromNames这五个方法去构建

    import unittest
    class UserCase(unittest.TestCase):
    
        def testAddUser(self):
            print("add a user")
    
        def testDelUser(self):
            print("delete a user")
    
    if __name__ == '__main__':
        module = __import__(__name__)
        suite = unittest.TestLoader().discover('.','unittest_user.py') #unittest_user.py
        suite2 = unittest.TestLoader().loadTestsFromTestCase(UserCase)
        suite3 = unittest.TestLoader().loadTestsFromModule(module)

    (3). 通过unittest.makeSuite()、unittest.findTestCases()这两个方法去构建

    import unittest
    class UserCase(unittest.TestCase):
    
        def testAddUser(self):
            print("add a user")
    
        def testDelUser(self):
            print("delete a user")
    
    if __name__ == '__main__':
        module = __import__(__name__)
        suite = unittest.makeSuite(UserCase,prefix='test')
        suite2 = unittest.findTestCases(module,prefix='test')

    2、unittest执行顺序

    unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0~9,A~Z,a~z。所以,TestAdd类会优先于TestBdd类被执 行,test_aaa()方法会优先于test_ccc()被执行,因而它并没有按照用例从 上到下的顺序执行;

    对于测试目录与测试文件来说,unittest框架同样是按照这个规则来 加载测试用例。

    3、跳过测试和预期失败

    在运行测试时,有时需要直接跳过某些测试用例,或者当用例符合 某个条件时跳过测试,又或者直接将测试用例设置为失败。unittest提供了实现这些需求的装饰器:

    #无条件的跳过装饰的测试方法或类
    unittest.skip(reason)
    #当条件为真时,跳过装饰的的测试方法或类
    unittest.skipIf(condition, reason)
    #跳过装饰的测试方法或类,除非条件为真
    unittest.skipUnless(condition, reason)
    #不管执行结果是否为失败,同一标记为失败
    unittest.expectedFailure()

     4、更大范围的fixture

    对于测试module、测试类、测试方法都有对应的fixture,完整的示例代码:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    import unittest
    
    def setUpModule():
        print('start module')
    
    def tearDownModule():
        print('end module')
    
    class TestClass(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            print('start class')
        @classmethod
        def tearDownClass(cls):
            print('end class')
    
        def setUp(self):
            print('start case')
    
        def tearDown(self):
            print('end case')
    
        def test_add(self):
            print('case1')
    
        def test_add1(self):
            print('case2')
    
    if __name__ == '__main__':
        unittest.main()

    执行结果如下:

     可以看出模块和类的fixture只执行了一次,而对于测试方法的fixture,有多少个测试方法就执行了几次

  • 相关阅读:
    SQL注入攻击
    新手指引,php什么是常量、变量、数组、类和对象及方法?
    JQuery坑,说说哪些大家都踩过的坑
    利用Jsonp实现跨域请求,spring MVC+JQuery
    【实用】需要收藏备用的JQuery代码片段
    【动画】JQuery实现冒泡排序算法动画演示
    【基础】26个命令玩转linux,菜鸟及面试必备
    【收藏】8段JQuery处理表单的代码片段,很实用
    【实用】Html5实现文件异步上传
    【基础】新手任务,五分钟全面掌握JQuery选择器
  • 原文地址:https://www.cnblogs.com/canghai1024/p/13187970.html
Copyright © 2011-2022 走看看