С легкостью тестируем REST API в Python с помощью pyhttptest

В настоящее время каждый из нас сталкивается с REST API, разрабатывая или используя такие сервисы. Кроме того, мы живем в эру микросервисов, где мы разделяем нашу бизнес-логику на небольшие отдельные сервисы, независимые от каждого. В основном эти сервисы следуют принципам RESTful и используют для связи формат JSON, который стал наиболее широко используемым из-за своей простоты.

pyhttptest — инструмент командной строки для HTTP-тестов через API-интерфейсы RESTful

Благодаря этой утилите можно автоматизировать тестирование в три простых шага.

1. Установка пакета

pip install pyhttptest

2. Опишите ваши тест-кейсы HTTP-запросов для вашей службы API в простейшем и широко используемом формате JSON, записав их в файл.

Примеры определения тест-кейса

  • Чтобы отправить HTTP GET запрос
    • Создаем JSON файл, например data/test_server_status.json
{
  "name": "TEST: Get server status",
  "verb": "GET",
  "endpoint": "/get",
  "host": "https://httpbin.org",
  "headers": {
    "Accept-Language": "en-US"
  }
}
  • Чтобы отправить HTTP POST запрос
    • Создаем JSON файл, например, data/test_create_html_bin.json
{
  "name": "TEST: Create an HTML bin",
  "verb": "POST",
  "endpoint": "post",
  "host": "https://httpbin.org",
  "payload": {
    "content": "Hello, world!"
  }
}

Пример определения множественных тестов

  • Создаем JSON файл, например data/requests.json
[
  {
    "name": "TEST: List all users",
    "verb": "GET",
    "endpoint": "api/v1/users",
    "host": "http://localhost:8085/",
    "headers": {
      "Accept-Language": "en-US"
    },
    "query_string": {
      "limit": 1
    }
  },
  {
    "name": "TEST: Add a new user",
    "verb": "POST",
    "endpoint": "api/v1/users",
    "host": "http://localhost:8085/",
    "payload": {
      "username": "pyhttptest",
      "email": "admin@pyhttptest.com"
    }
  },
  {
    "name": "TEST: Modify an existing user",
    "verb": "PUT",
    "endpoint": "api/v1/users/XeEsscGqweEttXsgY",
    "host": "http://localhost:8085/",
    "payload": {
      "username": "pyhttptest"
    }
  },
  {
    "name": "TEST: Delete an existing user",
    "verb": "DELETE",
    "endpoint": "api/v1/users/XeEsscGqweEttXsgY",
    "host": "http://localhost:8085/"
  }
]

3.Запускаем команду и получаем отчет

pyhttptest execute data/test_server_status.json

Отчет с одиночного теста

pyhttptest execute data/requests.json

Отчет множественного тестирования

Свойства, которые вы должны указать в .json файле таковы:

  • name — имя тест-кейса
  • verb — HTTP метод
  • endpoint — ресурс, который вы хотите вызвать на сервере
  • host — адрес сервера хоста
  • headers — HTTP хэдеры. Все доступные поля HTTP поддерживаются
  • query_string — строковые параметры после знака вопроса
  • payload — загружаемые данные

Best practices

У вас может возникнуть один вопрос: как добавлять, структурировать и организовывать тестовые примеры в мой существующий/новый проект. Каждый проект Python, в котором есть тесты, содержит в своем каталоге проектов папку, которая называется tests/.

По соглашению, из этого каталога лучшие фреймворки, такие как unittest и pytest, ищут и выполненяют определенные тест-кейсы в скриптах Python. Чтобы не связываться с этими тестами и не нарушать соглашения, мы предлагаем создать новый каталог в корневом каталоге вашего проекта с именем live_tests/.

Внутри нового каталога вы можете поместить все файлы .json с определенными тестовыми примерами для API. Благодаря этому ваши тесты будут легко различимы. Но это зависит только от вас!