测试平台系列(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日志并进行多维度分析。
相关文章
|
15天前
|
芯片
LDO的原理及测试方法
一、基本结构 这是LM317芯片的核心,这个电路单元称为Bandgap Reference带隙基准源。属于模拟集成电路中的经典电路结构。 LDO拓扑结构图 常见的基本结构 利用VBE的负温度系数,而VT是正温度系数,正负温度系数抵消就的得到稳定的基准参考电压了(三极管的方程VBE=VT*In(lC/IS))。 二、测试意义 了解集成电路的内部结构对测试有意义么? 1、了解内部结构,才能更好的理解测试原理或者设计测试方案2、可以学习提升对电路结构的理解能力。 针对LM317,了解了内部简单原理,可以知道1、内部结构设计针对的是温度系数,因此可能受温度的影响,实际也是会受到温度的影
157 88
|
8天前
|
测试技术
测试用例设计方法之基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法,设计出的测试用例要保证在测试中程序的语句覆盖100%,条件覆盖100%
20 7
测试用例设计方法之基本路径测试法
|
8天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
53 7
Jmeter实现WebSocket协议的接口测试方法
|
7天前
|
敏捷开发 数据可视化 Devops
敏捷测试价值观、方法和实践读书笔记(4)
本章节探讨了敏捷测试执行的关键概念与实践。首先介绍了用户故事及其重要性,强调其在敏捷开发中的角色,并阐述了用户故事的 INVEST 原则。接着分析了用户故事生命周期中的测试关注点,包括定义、处理、完成及验收阶段的测试活动。此外,还对比了不同测试术语的差异,并提供了敏捷测试计划的策略与过程。通过看板等工具实现任务管理与跟踪,确保测试活动高效进行。最后,介绍了敏捷测试中的度量指标,帮助团队评估测试效果。
17 5
敏捷测试价值观、方法和实践读书笔记(4)
|
7天前
|
监控 架构师 Devops
敏捷测试价值观、方法和实践读书笔记(3)
本章节介绍敏捷测试转型框架,涵盖模型概览、实施难度与顺序、文化转变、角色技能需求及测试流程。敏捷测试转型模型包括文化、组织、流程与实践等关键要素,并针对各层面提出具体实施建议与障碍解决方案。此外,详细阐述了不同敏捷测试角色的技能需求与职责,以及从Sprint内至跨Sprint的测试流程与交付物。
16 5
敏捷测试价值观、方法和实践读书笔记(3)
|
7天前
|
开发框架 数据可视化 项目管理
敏捷测试价值观、方法和实践读书笔记(1)
敏捷软件开发宣言在身体力行的同时也帮助我们一直在实践中探寻更好的软件开发方法。由此,我们建立了如下价值观:个体和互动 高于 流程和工具工作的软件,高于 详尽的文档客户合作, 高于 合同谈判响应变化,高于 遵循计划。也就是说,尽管右项有其价值,但我们更重视左项的价值。
29 4
敏捷测试价值观、方法和实践读书笔记(1)
|
7天前
|
JavaScript 前端开发 Java
敏捷测试价值观、方法和实践读书笔记(5)
本章节介绍了敏捷功能测试的原则与实践,包括单元测试的概念及其编写步骤,测试驱动开发(TDD)的流程,以及如何通过模拟对象进行测试。详细讲解了单元测试的编写方法,如初始化对象、执行操作及验证结果,并探讨了 TDD 的五个步骤。通过具体案例展示了如何逐步完善储蓄账户的功能测试,包括存款、取款及异常处理。此外,还讨论了代码覆盖率的重要性及其局限性,强调了测试充分性比单纯追求代码覆盖率更为关键。
14 3
敏捷测试价值观、方法和实践读书笔记(5)
|
7天前
|
机器人 测试技术
敏捷测试价值观、方法和实践读书笔记(6)
验收测试驱动开发(ATDD)强调在开发前定义验收标准,并通过自动化测试确保用户价值得到满足。验收测试关注用户需求是否实现,而非代码细节。ATDD涉及用户、产品负责人、开发人员及测试人员,通过讨论、开发和交付三个阶段,确保产品符合预期。此方法有助于团队更好地理解和实现用户需求。
17 5
|
7天前
|
敏捷开发 测试技术
敏捷测试价值观、方法和实践读书笔记(2)
本章节介绍敏捷测试在快速变化的软件开发环境中的重要性。传统测试方法在敏捷环境中面临时间紧迫、文档不足、频繁变更及资源短缺等挑战。敏捷测试遵循敏捷开发原则,强调测试与开发的紧密融合、团队协作及业务价值交付。其特点包括更强的协作、更短的周期、更灵活的计划及高效的自动化。相较于传统测试,敏捷测试具有加快产品上市时间、提升整体质量及简化流程降低成本的优势。
13 3
|
9天前
|
机器学习/深度学习 物联网 大数据
软件测试的演变与未来:从传统方法到自动化革命
在数字化时代的浪潮下,软件测试作为保障软件质量的重要环节,其方法和工具经历了翻天覆地的变化。本文将带领读者穿梭时光隧道,探索软件测试的发展历程,从手工测试的繁琐与局限性,到自动化测试的高效与精准,再到未来可能迎来的智能化与集成化趋势。通过深入浅出的分析,我们将揭示如何通过不断进化的软件测试技术,提升软件开发的效率和质量,确保在这个快速变化的时代中,软件产品能够稳健前行。