Как тайм-аут асинхронного теста в Pytest с помощью прибора? - PullRequest
9 голосов
/ 15 апреля 2019

Я тестирую асинхронную функцию, которая может быть заблокирована.Я попытался добавить осветитель, чтобы ограничить выполнение функции только 5 секундами, прежде чем вызывать ошибку, но пока это не сработало.

Настройка:

pipenv --python==3.6
pipenv install pytest==4.4.1
pipenv install pytest-asyncio==0.10.0

Код:

import asyncio
import pytest

@pytest.fixture
def my_fixture():
  # attempt to start a timer that will stop the test somehow
  asyncio.ensure_future(time_limit())
  yield 'eggs'


async def time_limit():
  await asyncio.sleep(5)
  print('time limit reached')     # this isn't printed
  raise AssertionError


@pytest.mark.asyncio
async def test(my_fixture):
  assert my_fixture == 'eggs'
  await asyncio.sleep(10)
  print('this should not print')  # this is printed
  assert 0

-

Редактировать: решение Михаила работает нормально.Однако я не могу найти способ включить его в прибор.

1 Ответ

4 голосов
/ 15 апреля 2019

Удобный способ ограничить функцию (или блок кода) тайм-аутом - использовать модуль async-timeout .Вы можете использовать его внутри своей тестовой функции или, например, создать декоратор.В отличие от прибора, он позволяет указывать конкретное время для каждого теста:

import asyncio
import pytest
from async_timeout import timeout


def with_timeout(t):
    def wrapper(corofunc):
        async def run(*args, **kwargs):
            with timeout(t):
                return await corofunc(*args, **kwargs)
        return run       
    return wrapper


@pytest.mark.asyncio
@with_timeout(2)
async def test_sleep_1():
    await asyncio.sleep(1)
    assert 1 == 1


@pytest.mark.asyncio
@with_timeout(2)
async def test_sleep_3():
    await asyncio.sleep(3)
    assert 1 == 1

Нетрудно создать декоратор для конкретного времени (with_timeout_5 = partial(with_timeout, 5)).


НадеюсьНе знаю, как создать текстуру (если вам действительно нужен инструмент), но приведенный выше код может обеспечить отправную точку.Также не уверен, есть ли общий способ достичь цели лучше.

...