zoukankan      html  css  js  c++  java
  • Unittest组织用例的姿势

    本文我们将会讲解Python Unittest 里组织用例的5种姿势。


    环境准备:
    python 3.0以上
    python requests库


    小编的环境:
    python 3.6.4

    一、TestLoader

    • 当 import unittest 时 ,会自动导入TestLoader类
    • TestLoader这个类下,封装了 5 种组织用例的方法

    loader.py

    class TestLoader(object):
        """
        该类负责根据各种标准加载测试并将它们包装在TestSuite中
        """
        
        def loadTestsFromTestCase(self, testCaseClass):
        """
        返回testCaseClass中包含的所有测试用例的套件
        """
        
        def loadTestsFromModule(self, module, *args, pattern=None, **kws):
        """
        返回给定模块中包含的所有测试用例的套件
        """
        
        def loadTestsFromName(self, name, module=None):
        """
        返回给定用例名的测试用例的套件
        
        """
        
        def loadTestsFromNames(self, names, module=None):
        """
        返回给定的一组用例名的测试用例的套件
        """
        
        def discover(self, start_dir, pattern='test*.py', top_level_dir=None):
        """
        查找并返回指定的起始目录中的所有测试模块,递归到子目录中以查找它们并返回在其
        中找到的所有测试。仅加载与模式匹配的测试文件。
        必须可以从项目的顶层导入测试模块。如果起始目录不是顶级目录,则必须单独指定顶级目录。
        """
        
    defaultTestLoader = TestLoader()
    """
    当执行     import unittest 时
    会自动导入 defaultTestLoader
    defaultTestLoader是TestLoader()的实例对象
    """
    

    ### 二、unittest组织用例方法演示 #### 项目目录 ``` how_to_run_test_case test_case __init__.py test_add.py test_sub.py run_from_test_case_class.py run_from_test_case_moudle.py run_from_case_name.py run_from_case_names.py run_from_discover.py ```

    test_add.py

    # encoding:utf8
    
    import unittest
    
    class AddCase(unittest.TestCase):
    
        def add_fun(self, a, b):
            
            return a + b
        def test_add_1(self):
        '''加法冒烟测试'''
            ret = self.add_fun(1, 2)
            self.assertEqual(3, ret)
        
        def test_add_2(self):
            ret = self.add_fun(1, 2)
            self.assertEqual(6, ret)
    

    test_sub.py

    # encoding:utf8
    
    import unittest
    
    class SubCase(unittest.TestCase):
    
        def add_fun(self, a, b):
            return a - b
        
        def test_sub_1(self):
        '''减法冒烟测试'''
            ret = self.add_fun(1, 2)
            self.assertEqual(-1, ret)
        
        def test_sub_2(self):
            ret = self.add_fun(1, 2)
            self.assertEqual(6, ret)
    

    ### 1、加载测试类中的用例 ``` loadTestsFromTestCase(self, testCaseClass) ``` - 使用loadTestsFromTestCase这个方法,需传入unittest测试类的类名 - 以项目为例子,传入 testCaseClass :AddCase

    例子:

    run_from_test_case_class.py

    # encoding:utf8
    
    import unittest
    from test_case.test_add import AddCase
    
    cases = unittest.TestLoader().loadTestsFromTestCase(AddCase)
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(cases)
    

    1.1 运行 run_from_test_case_class.py

    python run_from_test_case_class.py
    

    1.2 运行结果

    test_add_1 (test_case.test_add.AddCase)
    加法冒烟测试 ... ok
    test_add_2 (test_case.test_add.AddCase) ... FAIL
    

    ### 2、加载模块中的测试用例 ``` loadTestsFromModule(self, module, *args, pattern=None, **kws) ``` - 使用loadTestsFromModule这个方法,需传入被测试模块 - 以项目为例子,传入参数 module :test_add

    例子:

    run_from_test_case_moudle.py

    # encoding:utf8
    
    import unittest
    from test_case import test_add
    
    cases = unittest.TestLoader().loadTestsFromModule(test_add)
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(cases)
    

    2.1 运行 run_from_test_case_moudle.py

    python run_from_test_case_moudle.py
    

    2.2 运行结果

    test_add_1 (test_case.test_add.AddCase)
    加法冒烟测试 ... ok
    test_add_2 (test_case.test_add.AddCase) ... FAIL
    

    ### 3、加载指定的单个测试用例 ``` loadTestsFromName(self, name, module=None) ``` - 使用loadTestsFromName这个方法,需传入测试用例的方法名 - 传入测试用例的方法名格式:moudleName.testCaseClassName.testCaseName - 以项目为例子,我想测试test_add.py 里面的用例 test_add_1 - 我需要传入的参数 name:test_add.AddCase.test_add_1 - loadTestsFromName这个方法是在 sys.path 里面的路径去寻找测试模块test_add.py,然后再寻找测试类AddCase 最后再寻找测试用例test_add_1

    例子:

    run_from_case_name.py

    # encoding:utf8
    
    import unittest
    import os
    import sys
    
    # 获取 "how_to_run_test_case" 的绝对路径
    dir_run_test_case = os.path.dirname(os.path.abspath(__file__))
    # 获取 "test_case" 的绝对路径
    dir_test_case = dir_run_test_case + '/test_case'
    # 把 "test_case" 的绝对路径 加入 sys.path
    sys.path.insert(0,dir_test_case)
    
    case= unittest.TestLoader().loadTestsFromName('test_add.AddCase.test_add_1')
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(cases)
    

    3.1 运行 run_from_case_name.py

    python run_from_case_name.py
    

    3.2 运行结果

    test_add_1 (test_add.AddCase)
    加法冒烟测试 ... ok
    

    ### 4、加载指定的多个测试用例 ``` loadTestsFromNames(self, names, module=None) ``` - 使用loadTestsFromNames这个方法,需要传入一个数组 - 数组里面里面的元素必须是字符串 - 数组元素可以是模块、类、方法 - 数组元素 - 传入格式1:moudleName - 数组元素 - 传入格式2:moudleName.testCaseClassName - 数组元素 - 传入格式3:moudleName.testCaseClassName.testCaseName - 以项目为例,我想测试test_add.py 里面的用例 test_add_1 ,以及test_sub.py 里面的用例 test_sub_1 - 我需要传入的参数 names:['test_sub.SubCase.test_sub_2','test_add.AddCase.test_add_1'] - loadTestsFromNames这个方法是在 sys.path 里面的路径去寻找匹配的测试用例 - 执行用例是根据数组元素的的顺序执行

    例子:

    run_from_case_names.py

    # encoding:utf8
    
    import unittest
    import sys
    import os
    
    # 获取 "how_to_run_test_case" 的绝对路径
    dir_run_test_case = os.path.dirname(os.path.abspath(__file__))
    # 获取 "test_case" 的绝对路径
    dir_test_case = dir_run_test_case + '/test_case'
    # 把 "test_case" 的绝对路径 加入 sys.path
    sys.path.insert(0,dir_test_case)
    
    cases = ['test_sub.SubCase.test_sub_1','test_add.AddCase.test_add_1']
    suite = unittest.TestLoader().loadTestsFromNames(cases)
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)
    

    4.1 运行 run_from_case_names.py

    python run_from_case_names.py
    

    4.2 运行结果

    test_sub_1 (test_sub.SubCase)
    减法冒烟测试 ... ok
    test_add_1 (test_add.AddCase)
    加法冒烟测试 ... ok
    

    ### 5、加载指定目录下所有的测试用例 ``` discover(self, start_dir, pattern='test*.py', top_level_dir=None) ``` - start_dir : 查找用例的起始目录 - pattern='test*py' : 查找模块名为test开头的python文件 - top_level_dir=None :测试模块顶级目录

    例子:

    run_from_discover.py

    # encoding:utf8
    
    import unittest
    import os
    
    dir_how_to_run_test_case = os.path.dirname(os.path.abspath(__file__))
    dir_test_case = dir_how_to_run_test_case + '/test_case'
    
    cases = unittest.defaultTestLoader.discover(dir_test_case)
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(cases)
    

    5.1 运行 run_from_discover.py

    python run_from_discover.py
    

    5.2 运行结果

    test_add_1 (test_add.AddCase)
    加法冒烟测试 ... ok
    test_add_2 (test_add.AddCase) ... FAIL
    test_sub_1 (test_sub.SubCase)
    减法冒烟测试 ... ok
    test_sub_2 (test_sub.SubCase) ... FAIL
    

    ### 6、 Github 源码地址: [https://github.com/SEtester/how_to_run_test_case](https://github.com/SEtester/how_to_run_test_case)


  • 相关阅读:
    osg模型部分节点旋转
    IFC数据模型构件控制
    自定义基于IFC数据的施工进度数据结构
    QDateTime QString
    Qt获取屏幕分辨率
    Qt自定义类重写 copy
    removeEntry
    initGanttView
    IfcAxis2Placement3D IFC构件的位置和方向
    致我最爱的你
  • 原文地址:https://www.cnblogs.com/snailrunning/p/10051585.html
Copyright © 2011-2022 走看看