Рубрики
Без рубрики

Начало работы с httpx, часть 2: pytest и pytest_httpx

В части 1 мы создали простой инструмент поиска в Википедии, используя Python и HTTPX. Теперь давайте использовать Pytest и … Tagged с помощью Python, Pytest, httpx, pythonpoetry.

Начало работы с httpx (4 серии деталей)

В Часть 1 , Мы построили простой инструмент поиска в Википедии, используя Python и Httpx Анкет

Теперь давайте использовать pytest и напишите несколько тестов.

Необзлений: тест на удаленные конечные точки

Мы могли бы проверить прямо против живых серверов Википедии. Содержимое tests/test_pypedia.py может быть что -то вроде этого:

import pypedia.synchronous


def test_sync_search():
    response = pypedia.synchronous.search("incategory:Python_(programming_language)")
    assert response.status_code == 200
    assert "Guido" in response.text

Попробуйте:

poetry run pytest

Оно работает! Вероятно.

Однако эта стратегия может вызвать боль по любой из следующих причин:

  • Информация может измениться (например, редактор вики может извергать имя Гвидо), и ваши тесты не будут потерпеть неудачу по причинам, которые не имеют ничего общего с вашим кодом.
  • Википедия может временно снизиться, и ваши тесты потерпят неудачу по причинам, которые не имеют ничего общего с вашим кодом.
  • Википедия может установить ограничения API, и вы запускаете слишком много тестов в минуту или решите взимать деньги, а ваши средства работают в сухой, и ваши тесты не будут потерпеть неудачу по причинам, которые не имеют никакого отношения к вашему коду.

Ощущение темы?

Вместо того, чтобы проверять на живом сервере, мы должны быть в состоянии проверить с «макетной» конечной точкой, которая возвращает предсказуемые данные. Таким образом, мы проверяем код, который мы пишем, а не возможности чужого сервера.

Установка pytest_httpx

Конечно, можно построить свой собственный макет HTTP, но я благодарен за пакеты, которые облегчают это.

Respx один из них.

Другой вариант pytest_httpx который построен для pytest и сейчас хорошо работает. Это пакет, который я выбрал.

Прежде чем продолжить, нам нужно обновить Pytest и установить pytest_httpx:

poetry add -D pytest@latest pytest_httpx

Обратите внимание, что Флаг используется, чтобы указать, что они Развитие Зависимость, а не пакеты, которые необходимы кода в производстве.

Издеваться над запросом

Чтобы сделать фиктивный запрос, то, с чем мы тестируем, необходимо указать в макете. Для этого httpx_mock.add_response () Функция используется.

По умолчанию он издевается над 200 HTTP -ответом с пустым телом.

Если тестирование, чтобы убедиться, что URL -образован сформирован правильно, передайте URL -адрес httpx_mock.add_response () с URL параметр.

При тестировании контента, возвращаемого запросом, передайте контент httpx_mock.add_response () Анкет данные Параметр принимает произвольный текст, в то время как json Параметр сначала преобразует переданный объект Python в JSON, как показано ниже.

import pypedia.synchronous

ARTICLES = {
    "pages": [
        {
            "id": 23862,
            "key": "Python_(programming_language)",
            "title": "Python (programming language)",
            "excerpt": "Python is an interpreted, high-level, general-purpose programming language.",
            "description": "An interpreted, high-level, general-purpose programming language.",
        },
        {
            "id": 226402,
            "key": "Guido_van_Rossum",
            "title": "Guido van Rossum",
            "excerpt": "Guido van Rossum; the creator of the Python programming language",
            "description": "Dutch programmer and creator of Python",
        },
    ]
}
SEARCH = "incategory:Python_(programming_language)"
URL = "https://en.wikipedia.org/w/rest.php/v1/search/page?q=incategory%3APython_%28programming_language%29&limit=100"


def test_mock_sync_search(httpx_mock):
    httpx_mock.add_response(url=URL, json=ARTICLES)
    response = pypedia.synchronous.search(SEARCH)
    assert response.status_code == 200
    assert "Guido" in response.text

Статьи DICT представляет собой ответ Википедии. Тем не менее, я удалил некоторую информацию, которую мне не нужно было тестировать. На самом деле, я мог бы пойти намного дальше и удалить все, что мне не нужно сейчас. Вместо этого я включил такие ключи, как id , ключ и Описание В случае, если я хочу использовать их в будущем, хотя в коде нет ничего, что использует эти конкретные данные сейчас. Другими словами, немного лени теперь допускает немного лени позже.

Запустить pytest

Тест проходит?

poetry run pytest

У нас есть успешный, синхронный клиент Википедии.

В Следующая статья , мы принимаем этого синхронного клиента, который мы написали в предыдущая статья , и настройте его, чтобы бежать асинхронно. И да, pytest_httpx Также можно использовать Чтобы проверить асинхронную функциональность .

Начало работы с httpx (4 серии деталей)

Оригинал: “https://dev.to/bowmanjd/getting-started-with-httpx-part-2-pytest-and-pytesthttpx-2jef”