为什么使用 'pytest.mark.asyncio'?

For what 'pytest.mark.asyncio' is used?

我不明白装饰器 @pytest.mark.asyncio 的用途。

我已经尝试 运行 安装了 pytestpytest-asyncio 插件的以下代码片段但失败了,所以我得出结论,pytest 在没有装饰器的情况下收集测试协程。为什么会这样?

async def test_div():
    return 1 / 0

当您的测试标记为 @pytest.mark.asyncio 时,它们会变成 coroutines,连同 body

中的关键字 await

pytest 将使用 event_loop fixture 提供的事件循环将其作为异步任务执行:

此代码带有装饰器

@pytest.mark.asyncio
async def test_example(event_loop):
    do_stuff()    
    await asyncio.sleep(0.1, loop=event_loop)

等于这样写:

def test_example():
    loop = asyncio.new_event_loop()
    try:
        do_stuff()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(asyncio.sleep(0.1, loop=loop))
    finally:
        loop.close()

仍然正确,但请注意,从 pytest-asyncio>=0.17 开始,如果您将 asyncio_mode = auto 添加到 pyproject.tomlpytest.ini,则不需要标记,即自动为异步测试启用此行为。

https://github.com/pytest-dev/pytest-asyncio#modes