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

Как описывал методы Cat Post?

2.2 Middle🔥 162 комментариев
#Теория тестирования

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

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

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

Отличный вопрос. Он проверяет понимание основ тест-дизайна, спецификации тестов и владение стандартной терминологией. Методы POST я бы описывал в зависимости от контекста: в рамках требований (user story), API-спецификации (Swagger/OpenAPI) или тест-кейсов.

Вот как я подхожу к этому, разбивая на ключевые аспекты.

1. В Контексте Требований (User Story / BDD)

Здесь важно описать поведение с точки зрения бизнес-логики. Я использую структуру Given-When-Then.

Feature: Управление котиками
  Как пользователь API
  Я хочу добавлять новых котиков в систему
  Чтобы вести их учёт и выдавать лакомства.

  Scenario: Успешное создание нового котика
    Given Существует валидный набор данных для котика
      | name  | breed        | age | favorite_toy |
      | Барсик | Maine Coon  | 3   | laser_pointer|
    When Я отправляю POST запрос на эндпоинт "/api/cats" с этими данными
    Then Я получаю ответ с кодом статуса 201 (Created)
    And В теле ответа содержится созданный объект котика с присвоенным ID
    And В заголовке "Location" указан URL для доступа к созданному ресурсу

2. В Контексте API-Спецификации (Swagger / OpenAPI)

Это техническое, структурированное описание для разработчиков и автоматизаторов.

paths:
  /api/cats:
    post:
      summary: Создание нового котика
      description: Добавляет запись о новом котике в систему. Возвращает созданный объект.
      tags:
        - Cats
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CatInput'
          application/xml:
            schema:
              $ref: '#/components/schemas/CatInput'
      responses:
        '201':
          description: Котик успешно создан
          headers:
            Location:
              schema:
                type: string
              description: URI созданного ресурса (/api/cats/{id})
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CatOutput'
        '400':
          description: Невалидные входные данные (например, отрицательный возраст)
        '409':
          description: Конфликт (котик с таким именем уже существует)

3. В Контексте Тест-Кейсов и Автотестов

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

Ключевые аспекты для описания метода POST:

  • Цель: Создание нового ресурса (котика) в системе.
  • Эндпоинт: POST /api/cats
  • Заголовки (Headers): Content-Type: application/json, возможно Authorization: Bearer <token>.
  • Тело запроса (Request Body): JSON-объект с обязательными и опциональными полями.
  • Ожидаемые ответы (Responses):
    *   **Успех (201 Created):** Тело ответа содержит созданный объект + заголовок `Location`.
    *   **Ошибка клиента (400 Bad Request):** При невалидных данных (отсутствует обязательное поле `name`, строка вместо числа в `age`).
    *   **Конфликт (409 Conflict):** При нарушении уникальности (например, дублирование `name`).
    *   **Ошибка аутентификации/авторизации (401/403).**

Пример кода автотеста (на Python с использованием pytest и requests):

import pytest
import requests

class TestCatPost:

    BASE_URL = "https://api.catbook.com/v1"
    ENDPOINT = "/cats"

    @pytest.fixture
    def valid_cat_data(self):
        return {"name": "Мурзик", "breed": "Siberian", "age": 5}

    def test_create_cat_success(self, valid_cat_data):
        """Убедиться, что валидные данные приводят к успешному созданию котика."""
        
        # Act: Выполняем POST запрос
        response = requests.post(
            url=f"{self.BASE_URL}{self.ENDPOINT}",
            json=valid_cat_data,
            headers={"Content-Type": "application/json"}
        )

        # Assert: Проверяем результат
        assert response.status_code == 201, f"Ожидался 201, получен {response.status_code}"
        
        response_json = response.json()
        assert "id" in response_json, "В ответе отсутствует поле 'id'"
        assert response_json["name"] == valid_cat_data["name"], "Имя не совпадает"
        
        assert "Location" in response.headers, "Заголовок Location отсутствует"
        assert str(response_json["id"]) in response.headers["Location"], "Location не содержит ID ресурса"

    @pytest.mark.parametrize("invalid_data, expected_status", [
        ({"breed": "Siberian"}, 400),  # отсутствует обязательное 'name'
        ({"name": "X", "age": -5}, 400), # отрицательный возраст
        ({"name": "Барсик", "age": "старый"}, 400) # неверный тип данных
    ])
    def test_create_cat_with_invalid_data(self, invalid_data, expected_status):
        """Убедиться, что невалидные данные возвращают корректную ошибку."""
        
        response = requests.post(
            url=f"{self.BASE_URL}{self.ENDPOINT}",
            json=invalid_data
        )
        
        assert response.status_code == expected_status, f"Ожидался {expected_status}, получен {response.status_code}"
        # Дополнительно можно проверить структуру тела ошибки
        assert "message" in response.json()

Итог: Мой Подход к Описанию

Я описываю методы POST (и любой другой HTTP-метод) многоуровнево:

  1. Бизнес-уровень: Что это даёт пользователю? (через User Story/BDD).
  2. Контракт-уровень: Какой точный "договор" у API? Какие поля, типы, коды ответов? (через OpenAPI-спецификацию). Это самый важный документ.
  3. Уровень тестирования: Как мы проверяем этот контракт и поведение? Какие позитивные и негативные сценарии? (через тест-кейсы и код автотестов).

Такое описание обеспечивает полноту, однозначность и служит единым источником правды для всех членов команды: продакт-менеджера, разработчика и тестировщика.