Как использовать фикстуры pytest-aiohttp с сеансом области видимости

Пытаюсь написать тесты для приложения aiohttp. Я использую плагин pytest-aiohttp. Я намерен инициализировать и запустить приложение один раз перед первым выполнением теста и разорвать его после завершения всех тестов. Приспособления pytest-aiohttp, такие как 'loop', 'test_client', очень полезны, но у них есть scope = 'function', что означает, что я не могу использовать их из моего собственного приспособления с scope = 'session'. Есть ли способ обойти это? А если нет, то что было бы правильным подходом для достижения моей цели без использования встроенных приспособлений? Мой код выглядит следующим образом (conftest.py)

@pytest.fixture()
def client(test_client, loop):
    app = init(loop)
    return loop.run_until_complete(test_client(app))

Затем мои тесты используют это

class TestGetAlerts:
async def test_get_login_url(self, client):
    resp = await client.get('/api/get_login_url')
    assert resp.status == 200

Итак, мой «клиент» прибора запускается для каждого теста, чего я хочу избежать.


person Belerafon    schedule 17.08.2017    source источник


Ответы (1)


test_client fixture - это простая оболочка для классов TestServer и TestClient из aiohttp.test_utils < / а>.

Вы можете создать свою собственную версию прибора с 'session' прицелом.

Но у этого способа есть свои проблемы: тесты должны быть изолированными, на практике это означает воссоздание цикла событий для каждого теста.

Но приложение aiohttp на уровне сеанса не поддерживает такое воссоздание цикла. Таким образом, приложение следует запускать в отдельном потоке, что значительно усложняет написание тестовых утверждений.

В моей практике приложение aiohttp запускается мгновенно, но такие вещи, как миграция схемы БД и применение приспособлений БД, требуют времени. Эти действия могут быть легко реализованы в рамках сеанса как отдельные приспособления, но запуск / остановка приложения должна выполняться внутри каждого теста.

person Andrew Svetlov    schedule 17.08.2017
comment
Если у меня есть прибор с областью действия сеанса, который просто выполняет побочные эффекты независимо от цикла, почему я не могу полагаться на это в тесте, который использует прибор с привязкой к функции? - person CMCDragonkai; 13.08.2020
comment
Можете ли вы привести пример того, как это сделать с session областью действия. Сейчас у меня это не работает. Поскольку в моем приложении есть подпроцесс, который присоединяет тензорный поток, который затем блокируется в графическом процессоре. Прямо сейчас необходимость воссоздавать приложение для каждого теста означает, что графический процессор необходимо повторно инициализировать каждый раз. Это значительно замедляет тесты. - person CMCDragonkai; 03.09.2020
comment
Оказывается, мне просто нужно было сделать: `` @ pytest.fixture (scope = 'session') def loop (): return asyncio.get_event_loop () `` ` - person CMCDragonkai; 06.05.2021