Зачем Docker для QA

Docker решает одну из старейших проблем QA: несогласованность окружений. Сколько раз вы слышали «у меня на машине работает» при отчёте о баге? Docker устраняет это, упаковывая приложения и их зависимости в контейнеры, которые работают одинаково везде.

Для QA-инженеров Docker предоставляет:

  • Консистентные тестовые окружения на локальных машинах, CI-серверах и staging
  • Изолированное выполнение тестов — тесты не мешают друг другу и хост-системе
  • Воспроизводимые баги — если падает в контейнере, падает одинаково каждый раз
  • Быстрая настройка окружений — полное тестовое окружение за секунды, не часы

Основные концепции Docker

Образы

Docker-образ — это легковесный, автономный пакет, включающий всё необходимое для запуска ПО: код, runtime, системные инструменты, библиотеки и настройки.

Представьте образ как снимок настроенной машины. Он доступен только для чтения и неизменяем.

# Скачать образ из Docker Hub
docker pull node:20

# Список локальных образов
docker images

# Скачать специальный тестовый образ
docker pull mcr.microsoft.com/playwright:v1.40.0-focal

Контейнеры

Контейнер — это работающий экземпляр образа. Он изолирован от хост-системы и других контейнеров, но может открывать порты и монтировать тома для коммуникации.

# Запустить контейнер
docker run -it node:20 bash

# Запустить в фоне (detached mode)
docker run -d -p 3000:3000 --name my-app my-app-image

# Список работающих контейнеров
docker ps

# Остановить контейнер
docker stop my-app

# Посмотреть логи контейнера
docker logs my-app

Тома (Volumes)

Тома сохраняют данные за пределами жизненного цикла контейнера. Для QA они необходимы для сохранения тестовых отчётов и обмена тестовыми данными:

# Монтировать локальную директорию в контейнер
docker run -v $(pwd)/test-results:/app/test-results playwright-tests

# Создать именованный том
docker volume create test-data
docker run -v test-data:/data my-test-image

Сети

Docker-сети позволяют контейнерам общаться друг с другом:

# Создать сеть
docker network create test-network

# Запустить контейнеры в одной сети
docker run -d --network test-network --name db postgres:15
docker run -d --network test-network --name app my-app-image

# Контейнеры доступны друг другу по имени (db, app)

Создание тестовых образов с Dockerfile

Dockerfile определяет, как собрать образ. Вот Dockerfile для проекта автоматизации тестирования:

FROM mcr.microsoft.com/playwright:v1.40.0-focal

WORKDIR /app

# Сначала копируем файлы зависимостей (для эффективности кэша)
COPY package.json package-lock.json ./

# Установка зависимостей
RUN npm ci

# Копирование файлов тестов
COPY . .

# Команда по умолчанию: запуск всех тестов
CMD ["npx", "playwright", "test"]

Лучшие практики Dockerfile для QA

Порядок слоёв имеет значение. Docker кэширует каждый слой. Размещайте редко меняющееся (базовый образ, зависимости) первым, а часто меняющееся (тестовый код) последним:

FROM node:20-slim

# Системные зависимости (редко меняются)
RUN apt-get update && apt-get install -y \
    chromium \
    && rm -rf /var/lib/apt/lists/*

# Зависимости приложения (меняются при изменении package.json)
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci

# Тестовый код (часто меняется)
COPY . .

CMD ["npm", "test"]

Используйте .dockerignore для исключения ненужных файлов:

node_modules
.git
test-results
playwright-report
*.md

Сборка и запуск

# Собрать образ
docker build -t my-tests .

# Запустить тесты
docker run my-tests

# Запустить конкретный тестовый файл
docker run my-tests npx playwright test tests/login.spec.ts

# Запустить с переменными окружения
docker run -e BASE_URL=https://staging.example.com my-tests

# Сохранить результаты тестов на хост
docker run -v $(pwd)/results:/app/test-results my-tests

Отладка контейнерных приложений

QA-инженерам часто нужно отлаживать приложения, работающие в Docker:

Инспекция работающих контейнеров

# Открыть shell внутри работающего контейнера
docker exec -it container-name bash

# Смотреть логи в реальном времени
docker logs -f container-name

# Инспектировать конфигурацию контейнера
docker inspect container-name

# Проверить использование ресурсов
docker stats container-name

Упражнение: Контейнеризуйте тестовый набор

Дан тестовый проект на Node.js с:

  • Unit-тесты (Jest)
  • E2E-тесты (Playwright)
  • API-тесты (против REST API с PostgreSQL)

Создайте Dockerfile, который может запускать все три типа тестов.

Решение
FROM mcr.microsoft.com/playwright:v1.40.0-focal

# Установка клиента PostgreSQL для настройки БД
RUN apt-get update && apt-get install -y \
    postgresql-client \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Зависимости (кэшированный слой)
COPY package.json package-lock.json ./
RUN npm ci

# Конфигурация тестов
COPY playwright.config.ts jest.config.ts tsconfig.json ./

# Файлы тестов
COPY tests/ tests/
COPY src/ src/

# Значения окружения по умолчанию
ENV NODE_ENV=test
ENV CI=true

# По умолчанию: запуск всех тестов
CMD ["npm", "run", "test:all"]

Запуск разных типов тестов:

# Все тесты
docker run my-tests

# Только unit-тесты
docker run my-tests npm run test:unit

# Только E2E-тесты
docker run my-tests npx playwright test

# API-тесты с базой данных
docker run --network test-net \
  -e DATABASE_URL=postgresql://test:test@db:5432/testdb \
  my-tests npm run test:api

Команды Docker, которые QA-инженеры используют ежедневно

КомандаНазначение
docker runСоздать и запустить контейнер
docker psСписок работающих контейнеров
docker logsПосмотреть вывод контейнера
docker exec -itВыполнить команды внутри контейнера
docker buildСобрать образ из Dockerfile
docker stop / rmОстановить и удалить контейнеры
docker imagesСписок локальных образов
docker pullСкачать образ
docker cpКопировать файлы между хостом и контейнером
docker system pruneОчистить неиспользуемые ресурсы

Популярные Docker-образы для QA

ОбразПрименение
mcr.microsoft.com/playwrightE2E-тестирование Playwright с браузерами
cypress/includedE2E-тестирование Cypress
selenium/standalone-chromeSelenium с Chrome
selenium/hub + selenium/node-*Selenium Grid
postgresPostgreSQL для интеграционных тестов
redisRedis для тестов кэширования
localstack/localstackЭмуляция сервисов AWS
mailhog/mailhogТестирование email

Ключевые выводы

  1. Docker обеспечивает консистентность окружений — один образ работает одинаково на ноутбуке и в CI
  2. Образы — шаблоны, контейнеры — экземпляры — один образ может породить множество контейнеров
  3. Оптимизируйте слои Dockerfile — зависимости первыми, тестовый код последним для оптимального кэширования
  4. Используйте тома для тестовых артефактов — монтируйте директории хоста для извлечения отчётов и скриншотов
  5. Выучите базовые команды отладкиdocker exec, docker logs и docker inspect сэкономят часы