如何对 python 异步函数进行单元测试?
Posted
技术标签:
【中文标题】如何对 python 异步函数进行单元测试?【英文标题】:How to do unit tests on python async functions? 【发布时间】:2021-09-25 07:39:46 【问题描述】:当你编写一个普通函数时,通常你可以通过在 Python 控制台中运行它来对其进行单元测试。假设您的带有一个字符串 arg 的“myprint”位于module.py
,
def myprint(s):
print("\ "+str(s))
只需cd
包含module.py
的目录并输入python3
并输入这些:
from module import *
myprint("a test")
但如果“myprint”是用async def
定义的,这种方式会失败并出现类似的错误
TypeError: 'coroutine' object is not callable
测试异步函数的正确方法是什么?
【问题讨论】:
鉴于this highly-rated and well-answered question 的存在,很难看出这个自我回答的问题给社区带来了什么价值——尽管我猜你对async
关键字的使用让它有些不同?跨度>
【参考方案1】:
免责声明 下面的答案是我简单地尝试一个功能的解决方案,或者换句话说 - 基本单元测试。这是一个单元测试,但不是正式的:
" 为了进行单元测试,开发人员编写一段代码来测试软件应用程序中的特定功能。开发人员还可以隔离该功能以进行更严格的测试,从而揭示被测功能与其他单元之间不必要的依赖关系,因此依赖关系可以省去。开发者一般使用UnitTest框架开发自动化测试用例进行单元测试。”
是的,如果您想要 正式 异步单元测试,请查看库 pytest-asyncio
或 Noah 上述评论中提供的链接中的任何其他方法。我什至可以在这里重复他的链接 - How to test Python 3.4 asyncio code?,所以如果你看不起我在下面开发和享受的非正式单元测试,请别管我。
像这样重写module.py
中的打印函数:
import asyncio
async def asprint(s):
print("async "+str(s))
进入目录并调用python3
,并将这些粘贴到控制台中:
from module import *
def testf(funcname,*args):
loop = asyncio.get_event_loop()
loop.run_until_complete(funcname(*args))
testf(asprint, "test print")
通过这种方式,您可以测试单个异步函数,例如 asprint(s)
【讨论】:
你们怎么了?此答案中的任何代码行是否为 False?甚至没有在 python-asyncio 上提出问题的人在这里评论并否决了我的答案。是什么让你有信心去打那些提供真正帮助的人?以上是关于如何对 python 异步函数进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章
使用 axios、TypeScript 模板和异步函数对 VueJS 进行单元测试
使用 XCTestExpectation 对异步函数进行单元测试,但它不会等待我设置的秒数