关注开源优测不迷路
大数据测试过程、策略及挑战
测试框架原理,构建成功的基石
在自动化测试工作之前,你应该知道的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(提取、加载、转换)操作可能耗时,且通常可异步执行。