← Назад к вопросам

Приведи пример использования API

2.0 Middle🔥 202 комментариев
#Другое

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример работы с 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-тестирования в этом примере:

  1. Проверка кодов состояния HTTP:

    • 200 (OK) для успешных GET и PUT запросов
    • 201 (Created) для успешного создания ресурса
    • 204 (No Content) для успешного удаления
    • 404 (Not Found) для несуществующих ресурсов
  2. Валидация структуры ответа:

    • Проверка наличия обязательных полей
    • Проверка типов данных
    • Проверка форматов (email, даты)
  3. Тестирование граничных случаев:

    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)
    
  4. Работа с аутентификацией:

    • Передача токенов в заголовках
    • Тестирование endpoints, требующих авторизации

Преимущества такого подхода:

  • Скорость выполнения: API-тесты выполняются значительно быстрее UI-тестов
  • Стабильность: Меньше зависимостей от изменений интерфейса
  • Раннее обнаружение дефектов: Тестирование на уровне бизнес-логики
  • Легкость интеграции: Простое включение в CI/CD пайплайны

Этот пример демонстрирует основные принципы API-тестирования, которые можно расширять для проверки сложных сценариев, включая тестирование производительности, безопасности и интеграции с другими системами.