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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 异步方法装饰器

大家好~我是米洛


我在从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代替。输入到日志需要记录什么内容呢?

  • 调用了什么方法
  • 方法的参数是什么
  • 方法的返回值是什么
    我们来看看输出:

23.jpg

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

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

求豆麻袋。

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

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

24.jpg

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的装饰器,反之则是普通的装饰器。

试试效果先


25.jpg

效果良好

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

26.jpg

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

代码冗余


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

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

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


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




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14天前
|
Kubernetes 测试技术 Perl
混沌测试平台 Chaos Mesh
混沌测试平台 Chaos Mesh
34 1
|
6天前
|
运维 Kubernetes 监控
|
13天前
|
敏捷开发 测试技术 持续交付
软件测试中的探索性测试方法及其重要性
【8月更文挑战第6天】在软件开发周期中,测试环节是不可或缺的。它确保了产品的质量、性能与可靠性。然而,传统的测试方法往往侧重于预设的测试用例和场景,可能忽略了用户实际使用过程中的非预期行为。探索性测试(ET)应运而生,它强调测试人员的自主性和创造性,通过不断学习和适应来发现软件的潜在缺陷。本文将探讨探索性测试的概念、实施策略及其在现代软件开发中的重要性。
|
11天前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
|
14天前
|
测试技术 持续交付
探索式测试:一种灵活的软件质量保证方法
在软件测试领域,探索式测试是一种与传统脚本测试截然不同的方法。它强调测试人员的自主性与创造性,允许他们在执行测试时即时设计和执行测试用例。这种方法的灵活性和适应性使其成为发现复杂软件系统中难以预测的错误的有效手段。本文将深入探讨探索式测试的核心概念、实施策略以及它在现代软件开发生命周期中的价值。
29 4
|
14天前
|
敏捷开发 测试技术
探索式测试:一种高效灵活的质量保证方法
在软件生命周期中,确保产品质量是至关重要的一环。传统的测试方法往往依赖于预设的测试用例,而忽视了测试过程中的灵活性和创造性。本文将介绍一种与传统测试截然不同的方法—探索式测试,它强调个人技能与经验的应用,鼓励测试人员发挥主观能动性,通过不断探索来发现更多潜在的软件缺陷。文章将详细阐述探索式测试的核心概念、实施步骤及其在现代软件开发中的实际应用案例,旨在为读者提供一种更为高效和灵活的测试策略。
|
19天前
|
测试技术
软件测试中的探索性测试方法
在软件开发周期中,测试环节扮演着至关重要的角色。本文将深入探讨一种灵活而高效的测试方法——探索性测试。我们将通过具体实例分析其实施过程,并讨论如何通过这种方法提高软件质量和测试效率。最后,我们提出一个开放性问题,邀请读者思考探索性测试在他们工作中的实际应用和潜在价值。 【7月更文挑战第31天】
|
20天前
|
敏捷开发 测试技术
软件测试中的探索性测试:一种灵活的质量保证方法
在软件开发周期中,测试是确保产品质量的关键步骤。传统的测试方法往往依赖于事先定义好的测试用例,但这种方法可能无法覆盖所有潜在的缺陷和场景。探索性测试(ET)作为一种更为灵活的测试方式,允许测试人员在执行测试的同时设计和适应测试用例,从而提高了测试覆盖率并发现更多隐藏的缺陷。本文将探讨探索性测试的核心概念、实施策略以及与传统测试方法的比较,旨在为软件测试专业人员提供一种更高效、适应性强的测试手段。
|
25天前
|
敏捷开发 测试技术 持续交付
探索式测试:一种高效软件质量保证方法
在软件开发的复杂性不断增加的背景下,传统的测试方法已不能完全满足快速迭代和高质量标准的要求。探索式测试(Exploratory Testing)作为一种灵活且高效的软件测试实践,正逐渐成为质量保证过程中不可或缺的一部分。本文将深入探讨探索式测试的核心理念、实施策略以及与传统测试方法相比的优势,旨在为读者提供一套完整的探索式测试框架及其在实际项目中的应用示例。
|
26天前
|
测试技术
详解单元测试问题之MockHandlerImpl类的handle方法中VerificationMode不为空如何解决
详解单元测试问题之MockHandlerImpl类的handle方法中VerificationMode不为空如何解决
26 3

热门文章

最新文章