如何对 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 进行单元测试

你如何对 Python DataFrames 进行单元测试

使用 XCTestExpectation 对异步函数进行单元测试,但它不会等待我设置的秒数

如何对绘制 PDF 图形的 Python 函数进行单元测试?

如何在 python 中对装饰器工厂输入进行单元测试

如何开始用Junit进行单元测试