'pytest.mark.asyncio' 用于什么?

Ego*_*kin 4 pytest python-3.x pytest-asyncio

我不明白装饰器@pytest.mark.asyncio可以用于哪些目的。

我试图运行下面的代码片段与pytestpytest-asyncio插件安装失败了,所以我订立无装饰是pytest收集测试协同程序。为什么会这样存在?

async def test_div():
    return 1 / 0
Run Code Online (Sandbox Code Playgroud)

fol*_*ben 8

S\xc5\x82awomir Lenart\ 的答案仍然是正确的,但请注意,如果pytest-asyncio>=0.17您添加asyncio_mode = autopyproject.toml标记,pytest.ini则不需要标记,即自动为异步测试启用此行为。

\n

请参阅https://pytest-asyncio.readthedocs.io/en/latest/reference/configuration.html

\n

  • 你是对的,但我认为这应该是公认答案的一部分,而不是单独的答案,因为它不应该成为“正确的答案”。我会尝试将其合并到已接受的版本中 (4认同)

Sła*_*art 5

当您的测试被标记为 时@pytest.mark.asyncio,它们与body 中的关键字一起成为协程await

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

这段代码带有装饰器

@pytest.mark.asyncio
async def test_example(event_loop):
    do_stuff()    
    await asyncio.sleep(0.1, loop=event_loop)
Run Code Online (Sandbox Code Playgroud)

等于写这个:

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()
Run Code Online (Sandbox Code Playgroud)