Ответ
Я глубоко разбираюсь в 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, клиент определяет запрашиваемые поля).