zoukankan      html  css  js  c++  java
  • Python 使用装饰器装饰类

    1、装饰器装饰函数

    了解过或学过装饰器的同学都知道,Python 中的装饰器是可以装饰函数的,如:

    # 定义一个装饰器
    def decorator(func):
        def inner(*args,**kwargs):
            print("被装饰函数新增的功能")
            return func(*args,**kwargs)
    return inner
    # 定义一个函数test,使用decorator进行装饰
    @decorator
    def test(a,b):
        print("a= %s b= %s" %(a,b))
    
    #调用test函数
    test("a","b")

    以上代码输出:

      被装饰函数新增的功能
      a= a b= b

    2、装饰器装饰类

    那么,装饰器除了可以装饰函数以外,还能装饰类吗?答案是肯定的

    首先看一下装饰器装饰类的语法

    语法和装饰函数是一个的

    # 定义一个装饰器
    def decorator(cls):
        print("这里可以写被装饰类新增的功能") 
        return cls
    
    
    # 定义一个类 A,并使用decorator装饰器装饰
    @decorator # 装饰器的本质 A = decorator(A),装饰器返回类本身,还是之前的类,只是在返回之前增加了额外的功能
    class A(object):
        def __init__(self):
            pass
    
        def test(self):
            print("test")

    3、装饰器在自动化测试的中使用场景

    目前在自动化框架设计时,为了便于测试脚本的维护,我们一般会将测试数据和测试用例进行分离,那该如何分离呢?

    一种方法是将测试类和测试数据进行动态关联来获取测试类需要的测试数据,在 Python 中这种方式可通过装饰器装饰测试类来实现。

    思路:

      1、新建测试用例时,可通过测试类名和测试数据文件(类名和存储数据的文件名称一样)进行一一对应关联

      2、使用装饰器动态解析测试数据

      3、将解析的测试数据动态赋给对应的测试类

      4、测试类可使用该数据进行脚本的编写

    框架如下:

    代码结构如下:

    ├─common
    │ __init__.py

    ├─config
    │ Login.json
    │ __init__.py

    ├─email
    │ __init__.py

    ├─logs
    │ __init__.py

    ├─parse
    │ │ decorator.py
    │ │ __init__.py


    ├─report
    │ __init__.py

    ├─request
    │ __init__.py

    └─testcase
    login.py
    __init__.py

    动态获取测试数据的装饰器

    import os
    import json
    
    def test_data(cls):
        cls_name = cls.__name__
        param_file = os.path.join("..config", cls_name + ".json")
        cls.parameters = json.load(open(param_file))
        return cls

    测试数据

    {
      "test_login": {"url": "api/v2/login"},
      "test_logout": {"url": "api/v2/logout"}
    }

    测试用例

    import unittest
    
    from AutoTestFrameDemo.parse.decorator import test_data
    
    
    @test_data
    class Login(unittest.TestCase):
        def test_login(self):
            print(Login.parameters.get("test_login"))
    
        def test_logout(self):
            print(Login.parameters.get("test_logout"))
    
    
    if __name__ == "__main__":
        unittest.main()

    更多内容请关注微信公众号:

  • 相关阅读:
    这样的专家门诊
    CPU 知识介绍
    软考结束了!
    ubuntu环境配置eclipse+opencv
    2016年3月份总结
    点聚合功能基于ARCGIS RUNTIME SDK FOR ANDROID
    如何用java语言获取某个网页的源代码
    点聚合功能改良版本
    ARCGIS切图:TPK文件的空间参考为地理坐标系
    Java中的数据类型
  • 原文地址:https://www.cnblogs.com/yaoqingzhuan/p/10628592.html
Copyright © 2011-2022 走看看