Python装饰器使用接口测试的步骤

目录
  • 第一步,先看一下闭包的语法:
  • 第二步,再来看一下闭包的装饰器版本的语法:
  • 最后一步,再看一下装饰器的语法:

写接口case时,有时需要对cae做一些共性的操作,最典型的场景如:获取case执行时间、打印log等。

有没有一种办法来集中处理共性操作从而避免在每个case中都写相同的代码(如:每个case都需要写相同的获取执行时间的代码)呢?

Python的装饰器可以做到这一点。

可以这样理解装饰器,装饰器运用闭包对目标函数进行装饰(目标函数作为闭包外部函数的引用),即在执行目标函数之前、之后执行一些指定的代码来完成想要的业务逻辑。

概念看起来总是晦涩,直接上语法吧。

第一步,先看一下闭包的语法:

def outer(a):
    b = 10
    # inner是内函数
    def inner():
        # 在内函数中 用到了外函数的临时变量
        print(a + b)
    # 外函数的返回值是内函数的引用
    return inner

第二步,再来看一下闭包的装饰器版本的语法:

和上面闭包的例子只有一个区别:闭包中外部函数的引用是一个整数a,而此时是一个函数的引用(函数的引用也就是函数名)。

# 装饰器用到闭包原理:外函数内部定义了一个内函数,内函数使用外函数的局部变量,并且外函数返回了内函数的引用
def outer(target):   # 装饰器函数 传入一个想对其装饰的目标函数的 引用,将在内函数中使用。
   b = 10
    c = 1
    d = 5
    # inner是内函数
    def inner():
        print(b + c)
        # 外部函数传入的参数target,就是希望装饰的目标函数的引用
        target()   # 这里实际上执行了目标函数,想对这个函数进行装饰,所以在该函数执行之前和之后进行一番操作,具体什么操作看业务逻辑
        print(c + d)
    # 外函数的返回值是内函数的引用
    return inner

注意:target只是函数的一个引用(引用指向函数在内存中的位置),不会执行。带()时( target() )才会执行该函数。

最后一步,再看一下装饰器的语法:

@decorator
    def test_01():

所以可以总结出:装饰器decorator是闭包的外部函数,即 outer() (装饰器是一个函数,即闭包的外部函数),被装饰函数test_01是闭包传入的参数,即target。

举个例子:

以统计各接口请求耗时为例。

装饰器(decorat.py):

import time
def time_consume(func):
    def inner():
        time_start = time.time()  # 目标函数开始之前取一下时间
        print("\n接口请求前的时间是", time_start)
        func()
        time_end = time.time()  # 目标函数结束之后取一下时间
        print("接口请求后的时间是", time_end)
        t = time_end - time_start  # 计算目标函数执行花了多长时间
        print("接口耗时:", t)
    return inner

接口(test_case.py):

import requests
import decorat
@decorat.time_consume
def test_demo():
    res = requests.get("https://www.baidu.com")
    assert res.status_code == 200

效果:

再来总结下这个例子的整个过程:

'''
@decorat.time_consume实际上执行的是: test_demo = @decorat.time_consume(test_demo)
因为编程语言都是从右向左来解析执行的,那么这句代码会发生的事情是:

1 、把目标函数test_demo(是一个变量名,里面存的是目标函数的引用) 传入time_consume函数,被参数func接收,这时func也是目标函数的引用 func和test_demo指向同一个函数对象    
    2 、time_consume函数定义了内部函数inner,在inner里调用func,
    这用到闭包的原理(闭包原理:外函数结束的时会把自身的引用绑定给内函数),外函数结束的时候会把func绑定给内函数,供内函数来使用
    3、 外函数结束的时候把自己创建的内函数的引用inner返回给test_demo接收,
     这时test_demo已经不是原来编写的目标函数了,test_demo可以理解成是一个inner函数的实例对象,再执行test_demo() 的时候实际上执行了inner()的一个对象
    4、 再执行test_demo() 的时候 实际上执行了inner() :
     先执行取时间,打印
     之后执行func(),才是执行目标函数,即执行test_demo()本身
     最后再次取时间,打印结果

大白话版本:

其实就一句话:
被装饰函数作为装饰器外部函数的参数传入,在装饰器的内部函数中执行被装饰函数,并外加其他的代码片段A,
这样被装饰函数除了具备自身的逻辑外,也拥有了装饰器内部函数中代码片段A的逻辑。使得无需修改被装饰函数,
就增强了被装饰函数的功能。

再来看两种情景。

第一个:被装饰函数有参数

一般接口测试的test_case不会想上面例子中提到的是一个函数,而是作为一个类的方法出现的,比如:

运行报错了,报错日志的意思是inner()需要0个入参,但是被传入了1个。通过该报错证明了上面提到的这个结论

原因是test_demo()有参数self,而inner()没有定义入参。怎么解决呢,给inner()定义一个可变入参?先来看第二个问题,最后一起来证明我们的推测吧。

第二个:被装饰函数有返回值

问题出现了,返回值打印出来是None,因为inner()里没有变量去接收test_demo的返回值并返回吗?带着第一个问题的推测,一起来改下代码。

做2处改动:

1、inner()定义可变入参

2、inner()里定义变量去接收test_demo的返回值并return该变量

test_case作为一个类的方法出现的问题解决了。

返回值也能被正常打印了。

改动后的装饰器可以作为一个定义装饰器的通用模板,基本可以给各种各样的函数来装饰了。

def decorat_demo(func):
    def inner(*args, **kwargs):   # inner()接收可变参数
        # any code before # 定义目标函数前的操作
        # 调用目标函数
        res = func(*args, **kwargs)  # 定义变量接收目标函数返回值
        # any code after # 定义目标函数后的操作
        return res     # 返回目标函数返回值
    return inner

到此这篇关于Python装饰器使用接口测试的步骤的文章就介绍到这了,更多相关python装饰器接口测试内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python接口自动化浅析登录接口测试实战

    目录 1.什么是接口? 那么,接口测试和功能测试的区别在哪呢? 2.如何开展接口测试? 3.如何设计接口用例? 1.获取接口文档 Fiddler 2.分析接口文档的接口,提取测试点 3.接口测试用例设计思路 4.接口测试其他范围 接口业务测试 接口的性能测试 接口安全测试 在项目下新建一个文件夹common 编写登录接口用例,调用封装的请求类. 对于用例的一些总结: 4.接口测试用例实战 在上一篇Python接口自动化测试系列文章:Python接口自动化浅析unittest单元测试原理,主要介绍

  • 脚本测试postman快速导出python接口测试过程示例

    Postman的脚本可以导出多种语言的脚本,方便二次维护开发. Python的requests库,支持python2和python3,用于发送http/https请求 使用unittest进行接口自动化测试 01.环境准备 1.安装python(使用python2或3都可以) 2.安装requests:pip install requests 电脑中同时存在python2和python3时会出现安装错误如下: Python3下安装: Pip的版本太低,无法安装其他模块 升级pip 成功安装req

  • python接口测试返回数据为字典取值方式

    目录 接口测试返回数据为字典取值 实例 python接口测试--sign签名 接口签名规范 实现代码 接口测试返回数据为字典取值 接口测试通常需要校验返回数据跟预期结果是否一致,这个时候如果返回数据为字典,那么我们要拿到我们想要的key对应的values时,需巧妙的运用dict.keys().dict.values()和for循环,以及列表相关知识点. 实例 这是我调接口返回的数据,该数据为dict类型,我的目标是要拿到account. #接口返回的数据: api_result = {'code

  • Python 装饰器常用的创建方式及源码示例解析

    目录 装饰器简介 基础通用装饰器 源码示例 执行结果 带参数装饰器 源码示例 源码结果 源码解析 多装饰器执行顺序 源码示例 执行结果 解析 类装饰器 源码示例 执行结果 解析 装饰器简介 装饰器(decorator)是一种高级Python语法.可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用.修饰器经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理

  • python装饰器代码解析

    目录 1.装饰器通用模型 2.多个装饰器装饰的函数执行 3.带参数的装饰器 4.类装饰器 1.装饰器通用模型 def wrapper(fn):     def inner(*args, **kwargs):         ret = fn(*args, **kwargs)         return ret     return inner 装饰器几个关键点: 1.函数可以当参数传递 2.函数可以作为返回值进行返回 3.函数名称可以当成变量一样进行赋值操作 装饰器本质上是个闭包,在不改变原有

  • Python装饰器的定义和使用详情

    目录 1.装饰器的定义 2.装饰器的通用类型的定义 3.多个装饰器同时装饰一个函数 4.多个装饰器同时装饰一个函数(二) 5.类装饰器使用方法 6.使用装饰器实现自动维护路由表 1.装饰器的定义 装饰器:给已有函数增加额外的功能的函数,本质上是一个闭包函数 特点: 1.不修改已有函数的源代码 2.不修改已有函数的调用方式 3.给已有函数增加额外的功能 4.代码执行时先解析装饰器 import time   # 装饰器原理 # def show(): #     n=0 #     for i i

  • Python的装饰器详情介绍

    目录 1.定义及使用 2.@classmethod 1.定义及使用 例1:装饰器定义: def 装饰器函数(外部函数):            def 内联函数(*args,**kwargs):                ...前置装饰...                外部函数(*args,**kwargs)                ...后置装饰...            return 内联函数  例2:装饰器两种调用方式 第一种:装饰器函数(外部函数)(参数1,参数2....

  • python设计模式之装饰器模式

    目录 装饰器模式 python 装饰器语法糖 装饰器模式 装饰器模式解决什么问题? 增加新功能,且不改变原有功能和代码 选配,根据不同情况,动态调整功能 装饰器,顾名思义,就是用来装饰其他实物,增加被装饰物的功能而不改变被装饰物.这就像我们买车,同一款车型,有很多功能是选配的,但是车的核心功能不变.我们可以在购买时,根据需要选配不同的配置. 如何实现? 想象一下,你是一个装修工,如果要装饰一辆车,那么你首先需要有一辆车,而且在装饰过程中,你不能够改变车原有的功能(接口). 如类图所示: 核心功能

  • Python实现加密接口测试方法步骤详解

    加密接口怎么测试? (1)写个函数或者方法,把要加密的参数使用这个函数过滤一遍,等于就是说把数据丢进去,加密了之后,再通过这个加密好的 数据传输过去就可以了!! (2)至于用什么加密算法,这个要根据产品和自己的业务场景和需求不管是AES或者公钥私钥也好看自己的选择 (3)也可能是编码的问题,就直接用base64码把需要传输加密的东西通过base64返回base64码,然后再放进去,然后再进行传输 (4)这是编码不是加密,真的要加密的话,首先把要用的参数加好密之后再被传输出去,传输的过程中把传输的

  • Python装饰器使用接口测试的步骤

    目录 第一步,先看一下闭包的语法: 第二步,再来看一下闭包的装饰器版本的语法: 最后一步,再看一下装饰器的语法: 写接口case时,有时需要对cae做一些共性的操作,最典型的场景如:获取case执行时间.打印log等. 有没有一种办法来集中处理共性操作从而避免在每个case中都写相同的代码(如:每个case都需要写相同的获取执行时间的代码)呢? Python的装饰器可以做到这一点. 可以这样理解装饰器,装饰器运用闭包对目标函数进行装饰(目标函数作为闭包外部函数的引用),即在执行目标函数之前.之后

  • python装饰器常见使用方法分析

    本文实例讲述了python装饰器常见使用方法.分享给大家供大家参考,具体如下: python 的装饰器,可以用来实现,类似spring AOP 类似的功能.一样可以用来记录某个方法执行前做什么,执行后做什么,或者用来记录日志,运行的时间等,更有甚者,用这个来做权限拦截,也未尝不可.从两个方面来描述python 的装饰模式: 1. 对普通方法的装饰 2. 对在 class 类中的方法的装饰,不需要给参数的情况 3. 对在 class 类中的方法的装饰,需要给参数的情况 一,对普通方法的装饰.比如,

  • python装饰器练习题及答案

    这篇文章主要介绍了python装饰器练习题及答案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一:编写装饰器,为多个函数加上认证的功能(用户的账号密码) 要求登录成功一次,后续的函数都无需输入用户名和密码 FLAG=False#此时还未登录 全局变量 写这个步骤的意义在于:方便 知道已经登录成功了,就不再重复登录 def login(func):#为多个函数加上的认证功能 def inner(*args,**kwargs):#加上装饰器 gl

  • python 装饰器功能与用法案例详解

    本文实例讲述了python 装饰器功能与用法.分享给大家供大家参考,具体如下: 1.必备 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print 'foo' foo = lambda x: x + 1 foo() # 执行下面的lambda表达式,而不再是原来的foo函数,因为函数 foo 被重新定义了 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基

  • 深入了解Python装饰器的高级用法

    原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇文章的主要目的是介绍装饰器的高级用法.如果你对装饰器知之甚少,或者对本文讲到的知识点易混淆.我建议你复习下装饰器基础教程. 本教程的目标是介绍装饰器的一些有趣的用法.特别是怎样在类中使用装饰器,怎样给装饰器传递额外的参数. 装饰器 vs 装饰器模式 Decorator模式是一个面向对象的设计模式,它

  • python装饰器实例大详解

    一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往

  • Python 装饰器深入理解

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了.于是聪明的人们发明长裤,在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后宝宝再也不冷了.装饰器就像我们这里说的长裤,在不

  • 使用Python装饰器在Django框架下去除冗余代码的教程

    Python装饰器是一个消除冗余的强大工具.随着将功能模块化为大小合适的方法,即使是最复杂的工作流,装饰器也能使它变成简洁的功能. 例如让我们看看Django web框架,该框架处理请求的方法接收一个方法对象,返回一个响应对象: def handle_request(request): return HttpResponse("Hello, World") 我最近遇到一个案例,需要编写几个满足下述条件的api方法: 返回json响应 如果是GET请求,那么返回错误码 做为一个注册api

  • 深入理解Python装饰器

    装饰器简介: 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 装饰器最早在Python 2.5中出现,它最初被用于加工函数和方法这样的可调用对象(callable object,这样的对象定义有__call__方法).在Python 2

  • python装饰器初探(推荐)

    一.含有一个装饰器 #encoding: utf-8 ############含有一个装饰器######### def outer(func): def inner(*args, **kwargs):#要装饰f1(),这里用这俩形式参数,可以接受任意个参数,不管f1定义几个参数 print "1" r = func(*args, **kwargs)#这里要用func,不要用f1 print "2" return r return inner @outer #这里ou

随机推荐