最近使用 FastAPI 框架开发了一个 WEB 服务。
为了充分利用 FastAPI 作为一个 ASGI 框架的原生异步支持特性,很多业务代码也改成了异步函数,并且使用了异步的 HTTP 库httpx和 MongoDB 的异步 Python drivermotor。
由此带来的一个问题就是异步 Python 代码的单元测试的编写问题。
测试异步函数
编写测试代码
Python 的异步函数返回的是一个协程对象(coroutine),需要在前面加await才能获取异步函数的返回值,而只有在异步函数中才能使用await语句,这也意味着一般异步函数的测试代码本身也需要是一个异步函数。
1 | async def add(a:int, b:int): |
运行测试代码
与 Javascript 不同,Python 的异步代码需要显示地运行在事件循环中。
Python3.7 以上的版本中可以直接调用asyncio.run函。
如果使用的是更早的 Python 版本,就需要指定一个事件循环对象来运行异步代码。
1 | import asyncio |