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

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

最新文章

  1. PHP学习资料下载
  2. Head First 设计模式-- 总结
  3. Linux常用文件介绍
  4. transition、animation在macbook air上图片动画边缘抖动
  5. 页面间(窗口间)的取值赋值及获取iframe下的window对象
  6. spring mvc配置文件dispatcher-servlet.xml详解
  7. centos6.4搭建lnmp服务(转载)
  8. C#获取类中所有方法
  9. donet体系结构
  10. 自定义VS程序异常处理及调试Dump文件(一)
  11. 201521123023《Java程序设计》第8周学习总结
  12. markdown实战问题备忘
  13. 【Recorder.js+百度语音识别】全栈方案技术细节
  14. 【做题】SRM704 Div1 Median - ModEquation——数论
  15. 【Java每日一题】20170117
  16. OOP和面向对象
  17. JAVA自学笔记05
  18. SQL 必知必会·笔记<18>管理事务处理
  19. centos7下设置opencv环境变量
  20. mysql reset password重置密码

热门文章

  1. 【转帖】docker 如何删除none镜像
  2. 如何用Java实现条件编译
  3. MySQL 乱码问题解决
  4. Python 帮你玩微信跳一跳 GitHub Python脚本
  5. python 内置函数和匿名函数
  6. 【转载】C#中PadLeft函数按特定字符补足字符串长度
  7. js入门之内置数组对象 Array
  8. TR-FS00会计科目创建GL_ACCT_MASTER_SAVE
  9. idea 实用插件
  10. [iOS]UIButton内、外边距设置