美文网首页
测试平台系列(65) 异步方法装饰器

测试平台系列(65) 异步方法装饰器

作者: 米洛丶 | 来源:发表于2021-09-27 19:41 被阅读0次

大家好~我是米洛


我在从0到1打造一个开源平台, 也在编写一套完整的接口测试平台系列教程,希望大家能够多多支持。



欢迎关注我的龚仲耗测试开发坑货,获取最新文章教程!

回顾

上一节我们完善了一整套测试用例执行的流程,这一节我们来讲讲async方法的装饰器

在此之前,我们先来看下用于同步方法的装饰器。

日志装饰器

还记得我们之前编写过的日志装饰器吗?不记得的话也没关系,咱们现卤一个。

import functools


def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print("正在执行方法: ", func.__name__)
        print("参数: ", *args, *[f"{k}={v} " for k, v in kwargs.items()])
        result = func(*args, **kwargs)
        print("执行结果: ", result)
        return result

    return wrapper


@log
def print_user(name, age, height=180):
    return f"hello, {name}. Age: {age}, Height: {height}"


if __name__ == "__main__":
    print_user("klose", 43, height=182)

我们编写了一个print_user(打印用户信息)的方法,并给他加上了log装饰器,这样一旦这个方法执行了,我们就会输出这些数据到日志里面。

因为这里我没有现成的日志包,所以我用了print代替。输入到日志需要记录什么内容呢?

  • 调用了什么方法

  • 方法的参数是什么

  • 方法的返回值是什么

    我们来看看输出:

这个装饰器的目的是当我们发现这个方法报错了,能够回溯到当时的参数信息,以便于排查问题,当然这边不会有报错,因为场景比较简单

就是这么个场景,普通的装饰器实现如上。接着我们来思考一个问题,如果我们的方法是异步的,在装饰器不变的情况下,会是什么输出呢?

求豆麻袋。

我们来进行下简单的改造。

async方法的装饰器

@log
async def print_user(name, age, height=180):
    return f"hello, {name}. Age: {age}, Height: {height}"

只需要把print_user方法改为async,然后用asyncio.run执行print_user方法即可。来看下输出:

@log
async def print_user(name, age, height=180):
    return f"hello, {name}. Age: {age}, Height: {height}"

if __name__ == "__main__":
    asyncio.run(print_user("klose", 43, height=182))
image

可以看到,执行结果变成了coroutine了,也就是说拿不到返回值了。

那么接下来就进入我们的改造阶段,让装饰器也支持异步方法。

查询资料

通过google,我们发现asyncio有这样一个方法: iscoroutinefunction

看名字就知道,是判断一个function是不是coroutine,如果这招有用的话,那说明我们的问题能够解决了。

def log(func):
    if asyncio.iscoroutinefunction(func):
        @functools.wraps(func)
        async def wrapper(*args, **kwargs):
            print("正在执行方法: ", func.__name__)
            print("参数: ", *args, *[f"{k}={v} " for k, v in kwargs.items()])
            result = await func(*args, **kwargs)
            print("执行结果: ", result)
            return result
    else:
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print("正在执行方法: ", func.__name__)
            print("参数: ", *args, *[f"{k}={v} " for k, v in kwargs.items()])
            result = func(*args, **kwargs)
            print("执行结果: ", result)
            return result
    return wrapper

我们把代码改成这个样子: 可以看到,装饰器又和上一次讲的一样,进入了一个分水岭,当iscoroutine成立的时候,形成了一个async的装饰器,反之则是普通的装饰器。

试试效果先

效果良好

再试试把log放到普通方法上面:

注意看方法名, 执行的确实是print_user2方法

代码冗余

细心的朋友可能发现了,3个print的内容都是很重复的,但是ide并没有提示你,但其实这几块内容是完全可以封装起来的。

这大概就是顺手为之,慢慢就形成了屎山代码吧~

所以核心方法是asyncio.iscoroutinefunction, 你学会了吗?


今天的内容就介绍到这里了,大家没点关注的点个关注,点了关注的点个赞,点了赞的点个在看,点了在看的点个赞赏,点了赞赏的点个退出

相关文章

  • 测试平台系列(65) 异步方法装饰器

    大家好~我是米洛!我在从0到1打造一个开源平台, 也在编写一套完整的接口测试平台系列教程,希望大家能够多多支持。欢...

  • iOS单元测试常用的宏和测试方法

    单元测试常用的宏和测试方法 异步测试方法(定时器测试)

  • Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:《Java设计模式系列-装饰器模式》 一、概述 装饰器模式作用是针对目标方法进行增强,提...

  • Golang设计模式,装饰器模式

    装饰器模式测试

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • 装饰器实验

    装饰器实验 说明 ts内包含了四个装饰器,类装饰器、属性装饰器、函数装饰器、参数装饰器,本文中测试一下其的使用。 ...

  • allure-13-测试步骤step

    一、测试步骤 方式1:测试用例内部加步骤 方式2:测试用例字方法上加步骤(装饰器@allure.step('描述'...

  • 2019-12-30

    重载编码器亨士乐AX65系列采煤机用 德国产 AX65系列编码器 重载防爆绝对值编码器 AX65-SSI • 极其...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • 类里方法的装饰器

    类的方法的装饰器 方法的装饰器的执行时间也是在类定义之后,立即对类的方法进行装饰修改 方法的装饰器接受3个参数 ...

网友评论

      本文标题:测试平台系列(65) 异步方法装饰器

      本文链接:https://www.haomeiwen.com/subject/bfjknltx.html