关于Pytest:Pytest-使用asyncio进行python测试

Pytest - python testing with asyncio

是否可以从函数将执行返回到event loopTask将尽快完成并返回该函数并继续执行吗?

我正在尝试使用pytest-asyncio插件

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@pytest.mark.asyncio
async def test_async1(event_loop):
    print('start 1')
    res = event_loop.create_task(
        send_async_request("http://test.com", limit=1000))) # here I need to return execution to event loop and continue only after getting response from send_async_request function
    print('end1',res)



@pytest.mark.asyncio
async def test_async2(event_loop):
    print('start 2')
    res = event_loop.create_task(
        send_async_request("http://test2", limit=1000))) # here I need to return execution to event loop and continue only after getting response from send_async_request function
    print('end2', res)

send_async_request-aiohttp

1
2
3
4
5
6
7
8
@asyncio.coroutine
def send_async_request(url, method='GET'):
    with aiohttp.ClientSession() as session:
        resp = yield from session.get(url, timeout=60)
        if resp.status == 200:
            return resp.status, response
        else:
            return resp.status, False

将测试标记为pytest.mark.asyncio时,它们将成为协程,因此您可以使用await语法:

1
2
3
4
@pytest.mark.asyncio
async def test_sleep(event_loop):
    result = await asyncio.sleep(1, result=3, loop=event_loop)
    assert result == 3

编辑:另一个示例,具有多个sleep操作:

1
2
3
4
5
6
@pytest.mark.asyncio
async def test_multiple_sleep(event_loop):
    tasks = [event_loop.create_task(asyncio.sleep(1, result=x))
             for x in range(10)]
    results = await asyncio.gather(*tasks)
    assert results == list(range(10))