Какой у вас уровень знания REST API?

«Какой у вас уровень знания REST API?» — вопрос из категории API тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я глубоко разбираюсь в REST API, понимаю его архитектурные ограничения и активно применяю эти знания в тестировании.

Понимание принципов REST:

  • Единообразие интерфейса: Использование стандартных HTTP-методов (GET, POST, PUT, PATCH, DELETE) и ресурсо-ориентированных URI.
  • Stateless (Без состояния): Каждый запрос содержит всю необходимую информацию для его обработки.
  • Кэшируемость: Понимание заголовков кэширования (Cache-Control, ETag).
  • Слоистая система: Клиент не обязан знать, общается ли он напрямую с сервером или через промежуточные узлы.

Навыки тестирования REST API:

  • Валидация ответов: Проверка HTTP-статус кодов (200, 201, 400, 401, 404, 500), структуры и данных в JSON/XML, соответствия JSON Schema.
  • Тестирование параметров: Проверка query-, path- и header-параметров, их валидации и обработки ошибок.
  • Тестирование безопасности: Проверка аутентификации (JWT, OAuth, Basic Auth), авторизации и защиты от распространенных уязвимостей.
  • Негативное тестирование: Отправка невалидных данных, проверка корректности и информативности сообщений об ошибках.

Пример теста на Python с использованием библиотеки requests:

import requests
import pytest

BASE_URL = "https://api.example.com/v1"

def test_create_and_retrieve_user():
    # 1. Создание нового пользователя (POST)
    new_user = {"name": "John Doe", "email": "john@example.com"}
    create_response = requests.post(f"{BASE_URL}/users", json=new_user)

    assert create_response.status_code == 201
    created_user = create_response.json()
    user_id = created_user["id"]
    assert created_user["name"] == new_user["name"]

    # 2. Получение созданного пользователя (GET)
    get_response = requests.get(f"{BASE_URL}/users/{user_id}")

    assert get_response.status_code == 200
    retrieved_user = get_response.json()
    assert retrieved_user["id"] == user_id
    assert retrieved_user["email"] == new_user["email"]

Инструменты: Активно использую Postman (включая коллекции и окружения), Swagger/OpenAPI для документации, curl для быстрых проверок. Понимаю ключевые отличия REST от SOAP (тяжеловесный XML, WSDL) и GraphQL (единая endpoint, клиент определяет запрашиваемые поля).