Введение
CI/CD (Continuous Integration/Continuous Delivery) — основа современной разработки. Автоматические тесты в пайплайне гарантируют качество кода при каждом коммите. Но что делать, если тесты зависят от внешних API, которые нестабильны, дороги или недоступны?
Mock API решает эту проблему, обеспечивая стабильные, быстрые и предсказуемые тесты в CI/CD пайплайне. В этой статье мы рассмотрим, как интегрировать Mock API в различные CI/CD системы.
Проблемы тестирования в CI/CD без Mock API ⚠️
❌ Типичные проблемы:
- Нестабильные тесты (flaky tests) — внешний API недоступен или медленный
- Зависимость от окружений — тестовый сервер упал, тесты сломались
- Долгое выполнение — каждый запрос к реальному API занимает время
- Стоимость вызовов — платные API (платежи, SMS, карты) дороги для тестов
- Rate limiting — ограничения на количество запросов к API
- Невозможность тестировать edge cases — сложно имитировать ошибки
- Параллельные запуски — конфликты при одновременном использовании тестовых данных
Пример проблемы
✅ 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 в пайплайне:
- Стабильность 100% — Mock API всегда доступен и работает предсказуемо
- Скорость — мгновенные ответы без сетевых задержек
- Полная изоляция — тесты не зависят от внешних сервисов
- Бесплатно — никаких затрат на API calls
- Гибкость — легко имитировать любые сценарии и ошибки
- Параллельность — безопасный запуск тестов параллельно
- Контроль версий — тестируйте разные версии API
С Mock API
✅ 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
Детальный процесс:
- Разработчик делает git push в репозиторий
- CI/CD система запускает pipeline
- Mock API поднимается (Docker контейнер или облачный сервис)
- Тесты выполняются с использованием Mock API
- Результаты собираются и анализируются
- Деплой происходит, если все тесты прошли
Интеграция с популярными CI/CD платформами 🛠
Примеры конфигураций 💻
GitHub Actions
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
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
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 для локальной разработки
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 🌟
Рекомендации по интеграции
Версионируйте OpenAPI спецификацию
Храните openapi.yaml в Git рядом с кодом. При изменении API обновляйте спецификацию в том же PR, что гарантирует синхронизацию тестов и контракта.
Используйте environment variables
Не хардкодите URL API в тестах. Используйте переменные окружения (API_BASE_URL), чтобы легко переключаться между Mock и реальным API.
Health checks для Mock API
Перед запуском тестов проверяйте готовность Mock API (health check endpoint). Это избегает race conditions и падений тестов.
Кэшируйте Docker images
Используйте кэширование слоёв Docker для ускорения CI/CD. Mock API image скачивается один раз и переиспользуется.
Логируйте запросы Mock API
Включите verbose logging для Mock API в CI/CD. При падении тестов легко понять, какие запросы отправлялись.
Параллельные тесты
Mock API позволяет безопасно запускать тесты параллельно. Настройте matrix builds для ускорения CI/CD в 3-5 раз.
Contract testing в отдельном job
Создайте отдельный CI/CD job для проверки соответствия реального API спецификации. Запускайте его реже (например, только на develop/main).
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
- Создали OpenAPI спецификации для всех микросервисов и внешних API
- Настроили LightBox API для облачных моков
- Интегрировали в GitHub Actions
- Добавили contract testing в отдельный job (запуск 1 раз в день)
Результаты
ДО внедрения 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 — это не просто улучшение, а необходимость для стабильной и быстрой автоматизации тестирования.
- ✅ Стабильность — 99-100% успешных builds, нет flaky tests
- ✅ Скорость — тесты выполняются в 5-10 раз быстрее
- ✅ Экономия — $0 на API calls, экономия тысяч рублей в год
- ✅ Изоляция — никаких зависимостей от внешних сервисов
- ✅ Гибкость — легко тестировать любые сценарии и ошибки
- ✅ Параллельность — безопасный запуск тестов параллельно
💡 Главный принцип: CI/CD тесты должны быть быстрыми, стабильными и изолированными. Mock API обеспечивает все три качества из коробки.
Интегрируйте Mock API в ваш CI/CD
Создайте Mock API из OpenAPI спецификации и получите стабильные тесты в пайплайне. Поддержка всех популярных CI/CD систем.
Начать бесплатно →