Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример работы с REST API в автоматизации тестирования
В современной автоматизации тестирования API-тестирование является критически важным слоем, так как позволяет проверять бизнес-логику приложения без зависимости от пользовательского интерфейса. Рассмотрим практический пример использования REST API для тестирования сервиса управления пользователями.
Контекст и инструменты
Предположим, мы тестируем веб-сервис https://api.example.com, который предоставляет CRUD-операции (Create, Read, Update, Delete) для сущности "Пользователь". Для автоматизации будем использовать:
- Python как язык программирования
- Библиотеку requests для HTTP-запросов
- Pytest как фреймворк для тестирования
Реализация тестового сценария
1. Базовая настройка и вспомогательные функции
import requests
import pytest
BASE_URL = "https://api.example.com"
HEADERS = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_TOKEN_HERE"
}
def make_request(method, endpoint, data=None):
"""Универсальная функция для выполнения HTTP-запросов"""
url = f"{BASE_URL}/{endpoint}"
response = requests.request(method, url, json=data, headers=HEADERS)
return response
2. Тест создания пользователя (POST-запрос)
def test_create_user():
"""Тест создания нового пользователя"""
user_data = {
"name": "Иван Петров",
"email": "ivan.petrov@example.com",
"age": 28,
"is_active": True
}
# Выполняем POST-запрос
response = make_request("POST", "users", user_data)
# Проверяем статус код
assert response.status_code == 201, f"Ожидался код 201, получен {response.status_code}"
# Проверяем структуру ответа
response_json = response.json()
assert "id" in response_json, "Ответ должен содержать поле id"
assert response_json["name"] == user_data["name"]
assert response_json["email"] == user_data["email"]
# Сохраняем ID для последующих тестов
user_id = response_json["id"]
return user_id
3. Тест получения пользователя (GET-запрос)
def test_get_user():
"""Тест получения информации о пользователе"""
# Сначала создаем пользователя
user_id = test_create_user()
# Выполняем GET-запрос
response = make_request("GET", f"users/{user_id}")
# Проверяем ответ
assert response.status_code == 200
user_data = response.json()
# Проверяем основные поля
assert user_data["id"] == user_id
assert isinstance(user_data["created_at"], str), "Поле created_at должно быть строкой"
# Используем утверждения из pytest для лучшей читаемости
with pytest.raises(KeyError):
_ = user_data["password"] # Пароль не должен быть в ответе
4. Тест обновления пользователя (PUT-запрос)
def test_update_user():
"""Тест обновления данных пользователя"""
user_id = test_create_user()
updated_data = {
"name": "Иван Сидоров",
"age": 29,
"is_active": False
}
# Выполняем PUT-запрос
response = make_request("PUT", f"users/{user_id}", updated_data)
# Проверяем обновление
assert response.status_code == 200
# Получаем обновленные данные для проверки
get_response = make_request("GET", f"users/{user_id}")
updated_user = get_response.json()
assert updated_user["name"] == updated_data["name"]
assert updated_user["age"] == updated_data["age"]
assert updated_user["is_active"] == updated_data["is_active"]
# Проверяем, что неизмененные поля остались прежними
assert "email" in updated_user
5. Тест удаления пользователя (DELETE-запрос)
def test_delete_user():
"""Тест удаления пользователя"""
user_id = test_create_user()
# Выполняем DELETE-запрос
response = make_request("DELETE", f"users/{user_id}")
# Проверяем успешное удаление
assert response.status_code == 204 or response.status_code == 200
# Пытаемся получить удаленного пользователя
get_response = make_request("GET", f"users/{user_id}")
# Должен вернуться 404 Not Found
assert get_response.status_code == 404, "Удаленный пользователь не должен быть доступен"
Ключевые аспекты API-тестирования в этом примере:
-
Проверка кодов состояния HTTP:
- 200 (OK) для успешных GET и PUT запросов
- 201 (Created) для успешного создания ресурса
- 204 (No Content) для успешного удаления
- 404 (Not Found) для несуществующих ресурсов
-
Валидация структуры ответа:
- Проверка наличия обязательных полей
- Проверка типов данных
- Проверка форматов (email, даты)
-
Тестирование граничных случаев:
def test_create_user_invalid_data(): """Тест создания пользователя с некорректными данными""" invalid_data = { "email": "invalid-email", # Невалидный email "age": -5 # Отрицательный возраст } response = make_request("POST", "users", invalid_data) assert response.status_code == 400, "Ожидалась ошибка валидации" error_response = response.json() assert "errors" in error_response assert isinstance(error_response["errors"], list) -
Работа с аутентификацией:
- Передача токенов в заголовках
- Тестирование endpoints, требующих авторизации
Преимущества такого подхода:
- Скорость выполнения: API-тесты выполняются значительно быстрее UI-тестов
- Стабильность: Меньше зависимостей от изменений интерфейса
- Раннее обнаружение дефектов: Тестирование на уровне бизнес-логики
- Легкость интеграции: Простое включение в CI/CD пайплайны
Этот пример демонстрирует основные принципы API-тестирования, которые можно расширять для проверки сложных сценариев, включая тестирование производительности, безопасности и интеграции с другими системами.