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. Djang简单使用

    用户访问内容 ​ 用户能够访问的所有的资源,都是程序猿提前暴露的,如果没有暴露,用户是不能进行访问的. diango重启的问题 ​ 当我们更改django中的代码的时候,django内部会检测到我们更 ...

  2. todo---git 生成密钥 原理分析

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRJkDZ2z7syFC2QDCaORKF41ecwbL/kyFwkycOVE3MavTRBliAhoAhOaZQTr4j ...

  3. 高可用etcd集群(三节点) + ssl双向认证

    # etcd下载地址 https://github.com/etcd-io/etcd/tags wget https://github.com/etcd-io/etcd/releases/downlo ...

  4. jmu-Java-02基本语法-04-动态数组

    题目: 根据输入的n,打印n行乘法口诀表.需要使用二维字符串数组存储乘法口诀表的每一项,比如存放1*1=1.为了保证程序中使用了二维数组,需在打印完乘法口诀表后使用Arrays.deepToStrin ...

  5. java 线程实现、线程暂停和终止 、线程联合join、线程基本信息获取和设置、线程优先级

    转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-inheritthread.html 1. 通过继承Thread类实现多线程 继承Th ...

  6. 【css】文本效果

    一.字体属性 在css字体样式中常见的字体属性有以下几种 p{ font-size: 50px; /*字体大小*/ line-height: 30px; /*行高*/ font-family: 幼圆, ...

  7. VS.NET(C#-2.5)_简单例子(所有控件都转换成HTML控件)

    简单例子 UI设计视图  UI代码视图 <% @PageLanguage="C#" AutoEventWireup="true"CodeFile=&quo ...

  8. 浅谈(IOC)依赖注入与控制反转(DI)

    前言:参考了百度文献和https://www.cnblogs.com/liuqifeng/p/11077592.html以及http://www.cnblogs.com/leoo2sk/archive ...

  9. SpringBoot启动流程与源码

    一 main方法作为程序的入口,执行SpringApplication.run(),传入参数是启动类的class对象@SpringBootApplication注解 二 run中首先new Sprin ...

  10. 理解JVM之java内存模型

    java虚拟机规范中试图定义一种java内存模型(JMM)来屏蔽掉各种硬件和操作系统内存访问差异,以实现让java程序在各种平台都能打到一致的内存访问效果.所以java内存模型的主要目标是定义程序中各 ...