使用Pytest-Asyncio进行异步测试的实用指南之常见异步场景

关注开源优测不迷路

大数据测试过程、策略及挑战

测试框架原理,构建成功的基石

在自动化测试工作之前,你应该知道的10条建议

在自动化测试中,重要的不是工具

异步(asynchronous,简称 async)技术允许程序高效执行任务(在等待某一任务时执行其他任务),这也被称为并发(concurrency)。

当涉及测试异步代码时,事情可能会变得有些棘手。

如何确保异步代码按预期运行?如何测试不同异步任务和函数的交互,同时避免陷入事件循环(event loop)和 await 语句的复杂性中?

这正是 Pytest Asyncio 发挥作用的地方。

pytest-asyncio 插件简化了事件循环的处理、异步 fixture 的管理,并架起了异步编程与全面测试之间的桥梁。

在本系列中,我们将深入探讨如何使用 pytest-asyncio 插件测试异步函数、编写异步 fixture,以及通过简单示例使用异步模拟(async mocking)测试外部服务。

什么是异步函数 —— 快速概览

互联网上充斥着关于异步的信息,因此我们在此不做过多细节展开。

需要明确的是:异步并非并行执行,而是计算资源的高效分配。

我们将在下文探讨实际案例,但请记住:当某个任务处于挂起(pending)或休眠(sleeping)状态时,系统会执行另一个任务。

例如,文件上传、数据库写入、I/O 操作或调用外部 API 等任务,由于网络或服务器开销而耗时。

系统会智能决定在此期间执行另一任务,从而节省时间和资源。

异步 —— 应用场景

既然你已对异步有了基本了解,或许会好奇它在实际中应用于哪些场景?

这是个好问题,其应用场景多种多样:

非阻塞 I/O(网络)

I/O 操作例如:

  • 文件 / 图像上传或下载

  • 本地磁盘或云存储的读写

  • 数据库读写

所有这些任务都存在网络或服务器开销(即执行速度取决于网络或服务器速度)。

因此,当程序等待响应时,它可以启动或完整执行另一任务(而非闲置)。

调用外部 API 或服务


与上述场景类似,调用外部服务可能因服务器响应速度和网络状况产生开销。

外部 API 调用耗时较长,会浪费宝贵的执行时间,因此良好的设计实践是让程序在等待时执行其他有用操作,而非单纯等待。

音频 / 图像处理与计算机视觉


如果程序需要进行图像、音频处理或计算机视觉来检测实体或转录文字,这些操作通常耗时。

编写优化的异步代码以便在此期间执行其他任务是更佳选择。

机器学习 / 模型训练


机器学习和模型训练耗时较长。

高性能模型通常基于数百万甚至数十亿参数进行训练 —— 例如,GPT-4 基于超过 1.7 万亿参数训练。

在模型训练期间,可能可以执行其他关键或非关键任务,如文件 / 图像处理、状态变更、轮询、数据库读写等。

服务器响应与聊天机器人


服务器响应和聊天机器人可能需要同时处理多个请求,且这些请求大多相互独立。

异步代码在这些场景中极为有用,可降低响应延迟。

数据 ETL 或 ELT 操作


数据同步或 ELT(提取、加载、转换)操作可能耗时,且通常可异步执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值