CI/CD интеграция Mock API: Стабильные тесты в пайплайне

← Вернуться к статьям

Введение

CI/CD (Continuous Integration/Continuous Delivery) — основа современной разработки. Автоматические тесты в пайплайне гарантируют качество кода при каждом коммите. Но что делать, если тесты зависят от внешних API, которые нестабильны, дороги или недоступны?

Mock API решает эту проблему, обеспечивая стабильные, быстрые и предсказуемые тесты в CI/CD пайплайне. В этой статье мы рассмотрим, как интегрировать Mock API в различные CI/CD системы.

100%
Стабильность тестов
5x
Быстрее выполнение
0₽
Стоимость вызовов API
-90%
Меньше флаки

Проблемы тестирования в CI/CD без Mock API ⚠️

❌ Типичные проблемы:

Пример проблемы

LOG
✅ Test 1: User registration - PASSED
✅ Test 2: Login flow - PASSED
❌ Test 3: Payment processing - FAILED
   Reason: Payment API timeout (5000ms)
❌ Test 4: Send notification - FAILED
   Reason: SMS API rate limit exceeded
✅ Test 5: Profile update - PASSED

Tests: 3 passed, 2 failed, 5 total
Time: 47.3s
Status: FAILED ❌

Решение: Mock API в CI/CD ✅

✅ Преимущества Mock API в пайплайне:

С Mock API

LOG
✅ Test 1: User registration - PASSED
✅ Test 2: Login flow - PASSED
✅ Test 3: Payment processing - PASSED
✅ Test 4: Send notification - PASSED
✅ Test 5: Profile update - PASSED
✅ Test 6: Payment failure handling - PASSED
✅ Test 7: API timeout scenario - PASSED

Tests: 7 passed, 0 failed, 7 total
Time: 3.8s
Status: SUCCESS ✅

Как работает интеграция Mock API в CI/CD 🔄

CI/CD пайплайн с Mock API

1. Git Push
2. Trigger CI/CD
3. Start Mock API
4. Run Tests
5. Deploy

Детальный процесс:

  1. Разработчик делает git push в репозиторий
  2. CI/CD система запускает pipeline
  3. Mock API поднимается (Docker контейнер или облачный сервис)
  4. Тесты выполняются с использованием Mock API
  5. Результаты собираются и анализируются
  6. Деплой происходит, если все тесты прошли

Интеграция с популярными CI/CD платформами 🛠

🐙
GitHub Actions
Встроенный CI/CD от GitHub
🦊
GitLab CI
Integrated DevOps платформа
⚙️
Jenkins
Популярный open-source CI/CD
CircleCI
Облачный CI/CD сервис
🔷
Azure DevOps
Microsoft DevOps решение
📦
Bitbucket Pipelines
CI/CD от Atlassian

Примеры конфигураций 💻

GitHub Actions

YAML
name: API Tests with Mock

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      # Вариант 1: Использовать облачный Mock API (LightBox API)
      - name: Configure Mock API URL
        run: echo "API_URL=https://mock.lightboxapi.com/project-123" >> $GITHUB_ENV

      # Вариант 2: Поднять локальный Mock сервер через Docker
      - name: Start Prism Mock Server
        run: |
          docker run -d \
            --name mock-api \
            -p 4010:4010 \
            -v ${ github.workspace }/openapi.yaml:/tmp/openapi.yaml \
            stoplight/prism:4 \
            mock -h 0.0.0.0 /tmp/openapi.yaml

      - name: Wait for Mock API
        run: |
          timeout 30 bash -c 'until curl -f http://localhost:4010; do sleep 1; done'

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test
        env:
          API_BASE_URL: http://localhost:4010

      - name: Stop Mock API
        if: always()
        run: docker stop mock-api

GitLab CI

YAML
stages:
  - test
  - deploy

api_tests:
  stage: test
  image: node:18

  services:
    # Запуск Mock API как service
    - name: stoplight/prism:4
      alias: mock-api
      command: ["mock", "-h", "0.0.0.0", "/tmp/openapi.yaml"]

  variables:
    API_BASE_URL: "http://mock-api:4010"

  before_script:
    - npm ci
    - cp openapi.yaml /tmp/openapi.yaml

  script:
    - npm test

  artifacts:
    when: always
    reports:
      junit: test-results.xml
    paths:
      - coverage/

contract_testing:
  stage: test
  image: node:18

  script:
    # Проверка соответствия реального API спецификации
    - npx dredd openapi.yaml $STAGING_API_URL

  only:
    - merge_requests

Jenkins Pipeline

Groovy
pipeline {
    agent any

    environment {
        MOCK_API_URL = 'http://localhost:4010'
    }

    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        stage('Start Mock API') {
            steps {
                script {
                    sh '''
                        docker run -d \
                            --name mock-api-${BUILD_NUMBER} \
                            -p 4010:4010 \
                            -v ${WORKSPACE}/openapi.yaml:/tmp/openapi.yaml \
                            stoplight/prism:4 \
                            mock -h 0.0.0.0 /tmp/openapi.yaml
                    '''

                    // Ждём готовности Mock API
                    sh 'timeout 30 bash -c \'until curl -f http://localhost:4010; do sleep 1; done\''
                }
            }
        }

        stage('Run Tests') {
            steps {
                sh 'npm ci'
                sh 'npm test'
            }
        }

        stage('Contract Testing') {
            when {
                branch 'develop'
            }
            steps {
                sh 'npx dredd openapi.yaml ${STAGING_API_URL}'
            }
        }
    }

    post {
        always {
            // Всегда останавливаем Mock API
            sh 'docker stop mock-api-${BUILD_NUMBER} || true'
            sh 'docker rm mock-api-${BUILD_NUMBER} || true'

            // Публикуем результаты тестов
            junit 'test-results/*.xml'
        }

        success {
            echo 'Tests passed! ✅'
        }

        failure {
            echo 'Tests failed! ❌'
        }
    }
}

Docker Compose для локальной разработки

YAML
version: '3.8'

services:
  mock-api:
    image: stoplight/prism:4
    container_name: mock-api
    command: mock -h 0.0.0.0 /tmp/openapi.yaml
    volumes:
      - ./openapi.yaml:/tmp/openapi.yaml
    ports:
      - "4010:4010"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:4010"]
      interval: 5s
      timeout: 3s
      retries: 5

  app:
    build: .
    depends_on:
      mock-api:
        condition: service_healthy
    environment:
      - API_BASE_URL=http://mock-api:4010
    command: npm test

Стратегии использования Mock API 🎯

1️⃣ Полная замена

Все тесты в CI/CD используют только Mock API. Подходит для unit и интеграционных тестов. Максимальная скорость и стабильность.

2️⃣ Гибридный подход

Часть тестов с Mock API (быстрые, частые), часть с реальным API (критические сценарии, реже). Баланс между скоростью и реалистичностью.

3️⃣ Разные окружения

Feature branches → Mock API
Develop branch → Staging API
Main branch → Production API
Постепенная проверка на всех уровнях.

4️⃣ Contract Testing

Mock API для разработки и быстрых тестов. Contract tests проверяют соответствие реального API спецификации в отдельном job'е.

Best Practices 🌟

Рекомендации по интеграции

1

Версионируйте OpenAPI спецификацию

Храните openapi.yaml в Git рядом с кодом. При изменении API обновляйте спецификацию в том же PR, что гарантирует синхронизацию тестов и контракта.

2

Используйте environment variables

Не хардкодите URL API в тестах. Используйте переменные окружения (API_BASE_URL), чтобы легко переключаться между Mock и реальным API.

3

Health checks для Mock API

Перед запуском тестов проверяйте готовность Mock API (health check endpoint). Это избегает race conditions и падений тестов.

4

Кэшируйте Docker images

Используйте кэширование слоёв Docker для ускорения CI/CD. Mock API image скачивается один раз и переиспользуется.

5

Логируйте запросы Mock API

Включите verbose logging для Mock API в CI/CD. При падении тестов легко понять, какие запросы отправлялись.

6

Параллельные тесты

Mock API позволяет безопасно запускать тесты параллельно. Настройте matrix builds для ускорения CI/CD в 3-5 раз.

7

Contract testing в отдельном job

Создайте отдельный CI/CD job для проверки соответствия реального API спецификации. Запускайте его реже (например, только на develop/main).

8

Cleanup после тестов

Всегда останавливайте и удаляйте Mock API контейнеры после тестов (используйте post/always секции). Это освобождает ресурсы CI runners.

Сравнение подходов

Подход Без Mock API С Mock API
Стабильность тестов 60-70% (flaky tests) 99-100% (стабильные)
Время выполнения 5-10 минут 1-2 минуты
Стоимость API calls $50-200/месяц $0 (бесплатно)
Зависимость от окружений Высокая (staging должен работать) Нулевая (полная изоляция)
Тестирование edge cases Сложно (нужно настраивать staging) Легко (Mock возвращает что угодно)
Параллельный запуск Конфликты данных Безопасно
Rate limiting Есть ограничения Нет ограничений

Реальный кейс: SaaS платформа 📊

Проблема

Компания разрабатывает SaaS платформу для e-commerce. В проекте 12 микросервисов и интеграции с внешними API (Stripe, SendGrid, Twilio, Google Maps). CI/CD тесты нестабильны, выполняются 15 минут, стоимость API calls — $180/месяц.

Решение с Mock API

  1. Создали OpenAPI спецификации для всех микросервисов и внешних API
  2. Настроили LightBox API для облачных моков
  3. Интегрировали в GitHub Actions
  4. Добавили contract testing в отдельный job (запуск 1 раз в день)

Результаты

7.5x
Быстрее тесты
98%
Стабильность
$2160
Экономия в год
-92%
Меньше флаки
Metrics
ДО внедрения Mock API:
- Время CI/CD: 15-18 минут
- Успешные builds: 68%
- Flaky tests: 32%
- Стоимость API calls: $180/месяц

ПОСЛЕ внедрения Mock API:
- Время CI/CD: 2-3 минуты ✅ (7.5x быстрее)
- Успешные builds: 98% ✅ (+44%)
- Flaky tests: 2% ✅ (-94%)
- Стоимость API calls: $0/месяц ✅ ($2160 экономия в год)

Инструменты для Mock API в CI/CD 🛠

Инструмент Тип Когда использовать
LightBox API Облачный сервис Когда не хотите настраивать инфраструктуру. Просто получаете URL и используете в CI/CD
Prism Docker контейнер Для локального Mock сервера в CI/CD. Работает из OpenAPI спецификации
WireMock Java library/Docker Когда нужна гибкость и программирование сложных сценариев
Mockoon CLI CLI tool Для быстрого запуска Mock API из конфигурационного файла
json-server npm package Для простых REST API моков на базе JSON файла

Заключение

Интеграция Mock API в CI/CD — это не просто улучшение, а необходимость для стабильной и быстрой автоматизации тестирования.

💡 Главный принцип: CI/CD тесты должны быть быстрыми, стабильными и изолированными. Mock API обеспечивает все три качества из коробки.

Интегрируйте Mock API в ваш CI/CD

Создайте Mock API из OpenAPI спецификации и получите стабильные тесты в пайплайне. Поддержка всех популярных CI/CD систем.

Начать бесплатно →
← Вернуться к статьям