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

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

 

posted @ 2019-03-30 19:18  ilovetesting  阅读(3719)  评论(0编辑  收藏  举报