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()

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

Python 使用装饰器装饰类的更多相关文章

  1. Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  2. python 进阶篇 函数装饰器和类装饰器

    函数装饰器 简单装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapp ...

  3. python 装饰器 对类和函数的装饰

    #装饰器:对类或者函数进行功能的扩展  很多需要缩进的没有进行缩进'''#第一步:基本函数def laxi(): print('拉屎')#调用函数laxi()laxi() print('======= ...

  4. python 装饰器(七):装饰器实例(四)类装饰器装饰类以及类方法

    类装饰器装饰类方法 不带参数 from functools import wraps import types class CatchException: def __init__(self,orig ...

  5. python 装饰器(八):装饰器实例(五)函数装饰器装饰类以及类方法

    函数装饰器装饰类 单例模式 from functools import wraps def singleton(cls): instances = {} @wraps(cls) def get_ins ...

  6. python编程系列---多个装饰器装饰一个函数的执行流程

    首先看一个例子 ''' 多个装饰器装饰一个函数 ''' # 定义第一个装饰器 def set_func1(func): def wrapper1(*args,**kwargs): print('装饰内 ...

  7. Python:有参装饰器与多个装饰器装饰一个函数

    有参装饰器 def timmerout(flag1): #flag1 =flag def timmer(f): def inner(*args,**kwargs): if flag1: start_t ...

  8. typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  9. Python函数07/有参装饰器/多个装饰器装饰一个函数

    Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...

随机推荐

  1. [转帖]crontab每小时运行一次

    crontab每小时运行一次     先给出crontab的语法格式 对于网上很多给出的每小时定时任务写法,可以说绝大多数都是错误的!比如对于下面的这种写法: 00 * * * * #每隔一小时执行一 ...

  2. [转帖]中国x86服务器市场H1出货量大幅下滑:浪潮、戴尔和华为排名前三

    中国x86服务器市场H1出货量大幅下滑:浪潮.戴尔和华为排名前三 https://www.cnbeta.com/articles/tech/900237.htm 市场开始下滑了.. 据IDC<2 ...

  3. Ribbon源

    在Riibon中一个非常重要的组件为LoadBalancerClient,它作为负载均衡的一个客户端 ServiceInstance choose(String serviceId); 从负载均衡器中 ...

  4. ajax后台跳转无效的原因

    Ajax只是利用脚本访问对应url获取数据而已,不能做除了获取返回数据以外的其它动作了.所以浏览器端是不会发起重定向的. 1)正常的http url请求,只有浏览器和服务器两个参与者.浏览器端发起一个 ...

  5. 二进制知识(java中的位操作)

    文章目录 前言 机器数 真值 原码 反码 补码 计算机中保存的都是补码 位操作 强制转换,精度丢失 前言 讲二进制的东西,必须要说明是多少位机器,八位机上的 1000 1000 和 十六位机上的 10 ...

  6. SQL语言(二)

    SQL约束与策略 create table student( id int primary key, //主键约束 name ) not null, //非空约束 idCard ) unique, / ...

  7. xsy 2412【BZOJ4569】【Scoi2016】萌萌哒

    Description Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2, ...

  8. PAT(B) 1074 宇宙无敌加法器(Java)

    题目链接:1074 宇宙无敌加法器 (20 point(s)) 题目描述 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的, ...

  9. PAT(B) 1086 就不告诉你(Java)

    题目链接:1086 就不告诉你 (15 point(s)) 题目描述 做作业的时候,邻座的小盆友问你:"五乘以七等于多少?"你应该不失礼貌地围笑着告诉他:"五十三.&qu ...

  10. docker 实践十:docker 网络管理

    本篇是关于 docker 网络管理的内容,同时也包含了 docker 网络的高级应用. 注:环境为 CentOS7,docker 19.03. docker 网络基础 docker 网络模型 在 do ...