Опишите ваш опыт тестирования REST API.

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

Ответ

Имею комплексный опыт ручного и автоматизированного тестирования REST API.

Основные направления работы:

  1. Функциональное тестирование:

    • Проверка корректности CRUD операций (GET, POST, PUT, PATCH, DELETE).
    • Валидация кодов состояния HTTP (200, 201, 400, 401, 403, 404, 409, 500).
    • Проверка бизнес-логики и граничных условий.
  2. Тестирование данных:

    • Проверка структуры JSON ответа на соответствие контракту (использую JSON Schema или Pydantic).
    • Валидация типов данных, обязательных полей, форматов (email, date, UUID).
  3. Тестирование безопасности и авторизации:

    • Проверка эндпоинтов на наличие аутентификации (JWT, OAuth2, Basic Auth).
    • Тестирование ролевой модели доступа (RBAC).
    • Проверка на чувствительные данные в ответах.
  4. Тестирование производительности и надёжности:

    • Проверка ограничения частоты запросов (rate limiting).
    • Тестирование пагинации и сортировки.
    • Проверка обработки некорректных данных и устойчивости к сбоям.

Инструменты и технологии:

  • Для ручного тестирования/исследования: Postman, Swagger UI, cURL.
  • Для автоматизации: Python (библиотеки requests, pytest, pydantic), интеграция с Allure для отчётности.
  • Для валидации: JSON Schema, встроенные валидаторы Postman.

Пример автоматизированного теста на Python (pytest):

import requests
import pytest

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

def test_create_and_retrieve_item():
    # 1. Создание нового ресурса (POST)
    payload = {"title": "Test Item", "count": 5}
    create_response = requests.post(f"{BASE_URL}/items", json=payload)
    assert create_response.status_code == 201
    created_item = create_response.json()
    item_id = created_item["id"]

    # 2. Получение созданного ресурса (GET)
    get_response = requests.get(f"{BASE_URL}/items/{item_id}")
    assert get_response.status_code == 200
    retrieved_item = get_response.json()

    # 3. Проверка целостности данных
    assert retrieved_item["id"] == item_id
    assert retrieved_item["title"] == payload["title"]
    assert retrieved_item["count"] == payload["count"]