为什么使用 'pytest.mark.asyncio'?
For what 'pytest.mark.asyncio' is used?
我不明白装饰器 @pytest.mark.asyncio
的用途。
我已经尝试 运行 安装了 pytest
和 pytest-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.toml
或 pytest.ini
,则不需要标记,即自动为异步测试启用此行为。
我不明白装饰器 @pytest.mark.asyncio
的用途。
我已经尝试 运行 安装了 pytest
和 pytest-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.toml
或 pytest.ini
,则不需要标记,即自动为异步测试启用此行为。