Начало работы с 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”