Unit tests

Simple unit test

import pytest

def test_some():
   assert 1 == 1

Async unit test

Надо поставить плагин для pytest — pytest-asyncio

import pytest

@pytest.mark.asyncio
async def test_some():
    assert 1 == 1

Test exceptions

import pytest

def test_raise():
    with pytest.raises(TypeError):
        // do something that lead to the TypeError exception
        ... 

Запустить тест с набором параметров

Тест асинхронного запроса с асинхронным контекстом

Инструменты:

  • pytest

  • pytest-mock

  • pytest-asyncio

  • aiohttp

Пусть есть такой код (делаем асинхронно GET http запрос к API и парсим ответ с помощью pydantic):

Сложность в этом кусочке:

Пишем тест:

Где:

  • [1] — импортируем нашу асинхронную функцию для тестов

  • [2] — проставляем метку для плагина pytest-asyncio, чтобы pytest смог запустить асинхронный код

  • [3] — Для удобства проставляем тип для нашей фикстуры (эту аннотацию поддерживает pytest-mock)

  • [4] — Собираем mock-объект для aiohttp.ClientResponse

  • [5] — Проставляем ответ для вызова асинхронной функции (4), при этом обрати внимание, что ответ получаем из асинхронного контекста, который формировали в (2)

  • [6] — Проставляем ответ для вызова асинхронной функции get — (3)

  • [7] — Проставляем ответ, который получаем при заходе в контекст (1)

  • [8] — Запускаем саму асинхронную функцию, для которой мы наконец-то пропатчили все сайд эффекты

Last updated