Перестаньте верить примерам: сделайте OpenAPI spec единственным источником правды для docs, mocks и агентов

#OpenAPI#API#mocking#testing#AI agents

Часто API-команды говорят: «Наш spec — источник истины». Но на практике держат в актуальном состоянии сразу пять разных мест с примерами ответов: документация, мок-сервер, shared collection, тестовые фикстуры и prompt для AI-ассистента. Итог — через пару месяцев всё расходится: docs показывают поле, которое API уже не отдаёт, мок генерит обёртку, которой нет в реальном сервисе, а агент уверенно вызывает shape, который 404.

Такого рода «пример-дрифт» — не проблема дисциплины. Это проблема архитектуры и инструментов. Нужно перестать копировать вручную и начать хранить примеры в одном месте — в самом OpenAPI spec. Оттуда все остальные поверхности (docs, mocks, тесты, агенты) генерируются.


Почему встроенные в OpenAPI примеры — это не просто «красиво»

OpenAPI позволяет прикреплять именованные примеры прямо к media type и параметрам запроса/ответа. Это круче, чем один inline example, потому что можно показать разные кейсы, которые клиент должен уметь разбирать.

paths:
  /orders:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: "#/components/schemas/CreateOrderRequest" }
            examples:
              minimal:
                summary: One item, no note
                value:
                  items: [{ sku: "sku-001", quantity: 1 }]
                  currency: "USD"
              full:
                summary: Multiple items with a note
                value:
                  items:
                    - { sku: "sku-001", quantity: 2 }
                    - { sku: "sku-014", quantity: 1 }
                  currency: "USD"
                  note: "Leave at the front desk"
      responses:
        "201":
          description: Order created
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Order" }
              examples:
                created:
                  value:
                    id: "ord_8f3a2c"
                    status: "pending"
                    total: { amount: "129.00", currency: "USD" }
        "422":
          description: Validation failed
          content:
            application/problem+json:
              examples:
                invalidCurrency:
                  value:
                    type: "https://api.example.com/problems/invalid-input"
                    status: 422
                    title: "Unprocessable Entity"
                    errors:
                      - { field: "currency", code: "unsupported_currency" }

Такие именованные примеры позволяют покрыть «счастливый путь», ошибки валидации и граничные кейсы.


Примеры должны быть валидными, реалистичными и безопасными

Проблема большинства «example drift» — это плохое качество примеров.

Схема — это контракт, примеры — иллюстрация. Если они расходятся, правит схема, а не примеры.


Один spec — много поверхностей

Если держать примеры внутри OpenAPI, остальные артефакты перестают быть отдельными копиями и становятся view на одни и те же данные:

                OpenAPI spec (schemas + examples)
                 /      |        |          \
          rendered   mock     scenario     typed clients /
           docs     server    tests        agent tool context

Как не дать примерам загнить

Примеры, которые не валидируются, со временем превращаются в мусор. Чтобы этого не случилось:


Откуда начать?

Не обязательно сразу покрывать все сценарии. На старте достаточно для каждой операции:

Назовите их по смыслу — «created», «empty», «unsupportedCurrency», — а не «example1», «example2». Docs и моки сами их подхватят.

Даже этот минимальный набор уже уберёт четыре места с копипастом, откуда берётся 80% багов интеграции.


Кому это полезно и что попробовать

Если вы работаете с REST API и у вас:

Попробуйте:

Инструменты вроде Powerduck уже умеют строить workflow вокруг этой идеи — можно посмотреть, как моки и сценарные тесты работают на реальном spec.


Однажды попробовав перестать копипастить примеры и начать использовать spec как единственный источник правды, вы увидите, как резко упадёт количество багов из-за расхождений. Это не хайп вокруг OpenAPI, а практическая инженерная гигиена, которую легко внедрить.


Источник: https://dev.to/jeff_pdc/stop-letting-examples-lie-make-your-openapi-spec-the-single-source-of-truth-for-docs-mocks-and-30jc