Docker Compose для сложных сценариев

Docker Compose предоставляет удобный способ для организации многоконтейнерных приложений, и в контексте тестирования с использованием Playwright он становится незаменимым инструментом. Многоконтейнерные приложения часто требуют взаимодействия с различными сервисами, такими как базы данных, очереди сообщений или сторонние API, что усложняет настройку и запуск тестов в различных средах. В таких случаях Docker Compose помогает автоматизировать создание и управление всеми необходимыми контейнерами, обеспечивая быстрый и гибкий способ запуска интеграционных тестов.

Docker Compose — это инструмент для дефинирования и запуска многоконтейнерных Docker-приложений. Он использует файл конфигурации docker-compose.yml, в котором описываются все контейнеры, их настройки, зависимости и сети. В случае с Playwright, Docker Compose может быть использован для настройки контейнеров с браузерами, а также для создания окружений с различными зависимостями, такими как базы данных или кэши.

Для начала работы с Docker Compose необходимо иметь установленный Docker и Docker Compose. Если они еще не установлены, следует выполнить установку через официальные источники.

Создание docker-compose.yml для Playwright

Для начала следует подготовить файл docker-compose.yml, в котором будет описана вся инфраструктура для тестирования. Пример базового конфигурационного файла для Playwright может выглядеть следующим образом:

version: '3.8'

services:
  playwright:
    image: mcr.microsoft.com/playwright:v1.17.0-focal
    container_name: playwright-container
    volumes:
      - ./tests:/tests
    working_dir: /tests
    environment:
      - PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
    command: ["npx", "playwright", "test"]
    depends_on:
      - webapp
      - postgres

  webapp:
    image: node:14-alpine
    container_name: webapp
    environment:
      - DATABASE_URL=postgres://user:password@postgres:5432/dbname
    ports:
      - "3000:3000"
    networks:
      - test-network

  postgres:
    image: postgres:13-alpine
    container_name: postgres
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=dbname
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - test-network

networks:
  test-network:

volumes:
  postgres-data:

Пояснение к конфигурации

  • playwright: Это контейнер, в котором запускаются тесты Playwright. В качестве образа используется официальный контейнер Playwright с предустановленными браузерами. Внутри контейнера запускается команда для тестирования с помощью Playwright.

    • volumes монтирует локальную директорию с тестами в контейнер.
    • working_dir указывает рабочую директорию для выполнения тестов.
    • depends_on гарантирует, что контейнеры webapp и postgres будут запущены до того, как начнется выполнение тестов.
  • webapp: Это контейнер с веб-приложением, которое будет тестироваться. В данном случае это приложение на Node.js, которое подключается к базе данных PostgreSQL. Порты контейнера пробрасываются для доступа к приложению.

  • postgres: Контейнер с PostgreSQL базой данных, которая используется веб-приложением. Данные сохраняются в volume, чтобы база данных сохранялась между перезапусками контейнеров.

  • networks и volumes: Эти параметры создают сеть для соединения контейнеров и volume для хранения данных базы данных.

Запуск контейнеров с помощью Docker Compose

Чтобы запустить все контейнеры, достаточно выполнить команду:

docker-compose up --build

Команда создаст и запустит контейнеры в соответствии с конфигурацией docker-compose.yml. В процессе работы Docker Compose автоматически подтянет необходимые образы, если они не были предварительно загружены.

Если нужно запустить контейнеры в фоновом режиме, можно использовать параметр -d:

docker-compose up -d --build

После запуска контейнеров можно подключиться к контейнеру с тестами Playwright и вручную выполнить тесты с помощью:

docker-compose exec playwright bash
npx playwright test

Разработка и тестирование с использованием Docker Compose

Docker Compose позволяет создать идеальные условия для разработки и тестирования. При разработке тестов с Playwright можно интегрировать тесты с реальными сервисами, такими как веб-приложение и база данных, что значительно улучшает качество тестирования. Контейнеры позволяют изолировать зависимости и минимизировать риск проблем, связанных с несовместимостью версий.

Пример интеграционного теста

Для тестирования взаимодействия с веб-приложением и базой данных можно создать интеграционный тест. Пример теста Playwright, который проверяет, что приложение корректно отображает данные из базы, может выглядеть так:

import { test, expect } from '@playwright/test';

test('Web app loads data from the database', async ({ page }) => {
  await page.goto('http://webapp:3000');
  
  const dataElement = await page.locator('.data-item');
  expect(await dataElement.innerText()).toBe('Expected data from database');
});

В этом примере тест запускается внутри контейнера Playwright, который взаимодействует с контейнером webapp. С помощью Playwright можно автоматизировать не только проверку UI, но и взаимодействие с API, что делает такие тесты удобными для проверки интеграций.

Обновление и управление контейнерами

После внесения изменений в конфигурацию контейнеров или тестов, Docker Compose позволяет легко обновлять и перезапускать контейнеры. Для перезапуска всех контейнеров достаточно выполнить команду:

docker-compose restart

Для очистки всех ресурсов, включая контейнеры, сети и тома, можно использовать команду:

docker-compose down -v

Этот процесс позволяет поддерживать чистоту тестового окружения, что критично для эффективного тестирования.

Преимущества использования Docker Compose для тестирования с Playwright

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

  2. Гибкость: Docker Compose позволяет легко изменять настройки окружения для разных типов тестирования. Можно добавить новые сервисы или изменить параметры существующих.

  3. Автоматизация: Все контейнеры можно запускать, обновлять и управлять ими с помощью простых команд Docker Compose, что упрощает процессы CI/CD.

  4. Воспроизводимость: Окружение, созданное с помощью Docker Compose, полностью воспроизводимо на любой машине. Это гарантирует, что тесты будут проходить одинаково в разных средах, что критично для успешного тестирования.

Использование Docker Compose в сочетании с Playwright позволяет эффективно управлять сложными сценариями тестирования, где необходимо взаимодействовать с несколькими сервисами.