• python自动化测试中装饰器@unpack、@json_file和@yaml_file源码解析和使用


    在这里插入图片描述

    一、@unpack

    作用:将字典进行解包,输出测试用例中的单个字段的值

    源码

    def unpack(func):
        func.unpack = True
        return func
    
    • 1
    • 2
    • 3
    def create_test_method(method, value):
        # todo 闭包函数作用是将测试方法和函数放到闭包中,进行数据锁定
        def wrapper(self):
            # todo unpack装饰器的实现
            if hasattr(method, 'unpack'):
                if isinstance(value, dict):
                    method(self, **value)
                else:
                    method(self, *value)
            else:
                method(self, value)
    
        return wrapper
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    案例1:使用@unpack装饰器执行测试用例

    test_datas=[
        {'id':1,'title':'测试用例1'},
        {'id':2,'title':'测试用例2'},
        {'id':3,'title':'测试用例3'},
        {'id':4,'title':'测试用例4'}
    ]
    
    from test_ddt import ddt,data,json_file,yaml_file,unpack
    import unittest
    
    
    @ddt
    class TestDemo(unittest.TestCase):
    
        @unpack
        @data(*test_datas)
        def test_demo(self,id,title):
            print('测试用例执行',id,title)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    执行结果:

    测试用例执行 1 测试用例1
    测试用例执行 2 测试用例2
    测试用例执行 3 测试用例3
    测试用例执行 4 测试用例4


    案例2:不使用@unpack装饰器执行测试用例

    test_datas=[
        {'id':1,'title':'测试用例1'},
        {'id':2,'title':'测试用例2'},
        {'id':3,'title':'测试用例3'},
        {'id':4,'title':'测试用例4'}
    ]
    
    from test_ddt import ddt,data,json_file,yaml_file,unpack
    import unittest
    
    
    @ddt
    class TestDemo(unittest.TestCase):
    
        @data(*test_datas)
        def test_demo(self, item):
            print('测试用例执行', item)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    执行结果:

    测试用例执行 {‘id’: 1, ‘title’: ‘测试用例1’}
    测试用例执行 {‘id’: 2, ‘title’: ‘测试用例2’}
    测试用例执行 {‘id’: 3, ‘title’: ‘测试用例3’}
    测试用例执行 {‘id’: 4, ‘title’: ‘测试用例4’}

    二、@json_file

    作用:测试数据编写在json文件中,读取测试数据用于测试

    源码

    def json_file(file_path):
        '''
        :param file_path: json文件路径
        :return:
        '''
    
        def wrapper(func):
            try:
                with open(file_path, "r", encoding="utf-8") as f:
                    datas = json.load(f)
            except:
                with open(file_path, "r", encoding="gbk") as f:
                    datas = json.load(f)
            if not isinstance(datas, list):
                raise ValueError('json文件内的用例数据格式不符护规范')
            func.datas = datas
            return func
    
        return wrapper
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    案例:使用json_file执行测试用例

    from test_ddt import ddt,data,json_file,yaml_file,unpack
    import unittest
    
    
    @ddt
    class TestDemo(unittest.TestCase):
    
        # @unpack
        # @data(*test_datas)
        # def test_demo(self,id,title):
        #     print('测试用例执行',id,title)
    
        # @data(*test_datas)
        # def test_demo(self, item):
        #     print('测试用例执行', item)
    
        @json_file(r'D:\project_development\测试开发\day5_unittest框架用例参数化库ddt的使用\data.json')
        def test_demo1(self,item):
            print('测试用例执行',item)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    json文件

    
    [
      {
        "title": "用例1",
        "data": "python"
      },
      {
        "title": "用例2",
        "data": "python1"
      },
      {
        "title": "用例3",
        "data": "python2"
      }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    执行结果:

    测试用例执行 {‘title’: ‘用例1’, ‘data’: ‘python’}
    测试用例执行 {‘title’: ‘用例2’, ‘data’: ‘python1’}
    测试用例执行 {‘title’: ‘用例3’, ‘data’: ‘python2’}


    三、@yaml_file

    作用:测试数据编写在yaml文件中,读取测试数据用于测试

    源码

    def yaml_file(file_path):
        def wrapper(func):
            try:
                with open(file_path, "r", encoding="utf-8") as f:
                    datas = yaml.load(f, Loader=yaml.FullLoader)
            except:
                with open(file_path, "r", encoding="gbk") as f:
                    datas = yaml.load(f, Loader=yaml.FullLoader)
            if not isinstance(datas, list):
                raise ValueError('json文件内的用例数据格式不符护规范')
            func.datas = datas
            return func
    
        return wrapper
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    案例:使用yaml_file执行测试用例

    from test_ddt import ddt,data,json_file,yaml_file,unpack
    import unittest
    
    
    @ddt
    class TestDemo(unittest.TestCase):
    
        @yaml_file(r'D:\project_development\测试开发\day5_unittest框架用例参数化库ddt的使用\data.yaml')
        def test_demo2(self,item):
            print('测试用例执行', item)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    yaml文件

    - title: 用例1
      data: python_1
    - title: 用例2
      data: python_2
    - title: 用例3
      data: python_3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行结果:

    测试用例执行 {‘title’: ‘用例1’, ‘data’: ‘python_1’}
    测试用例执行 {‘title’: ‘用例2’, ‘data’: ‘python_2’}
    测试用例执行 {‘title’: ‘用例3’, ‘data’: ‘python_3’}


    在这里插入图片描述

  • 相关阅读:
    Maven内网开发使用离线仓库
    .NET 如何阻止线程执行上下文的传递
    IE让我首次遭受了社会的毒打
    辽宁博学优晨教育科技有限公司视频剪辑培训靠谱吗?
    【笔记】MTK与高通平台emergency APN配置差异
    千万级用户的大型网站,如何进行服务器压力预估?
    LeetCode每日一题——Single Number
    java-net-php-python-springboot家政服务平台计算机毕业设计程序
    linux输出的重定向无效问题和解决
    读 RocketMQ 源码,学习并发编程三大神器
  • 原文地址:https://blog.csdn.net/YZL40514131/article/details/126817193