Зачем 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/playwright | E2E-тестирование Playwright с браузерами |
cypress/included | E2E-тестирование Cypress |
selenium/standalone-chrome | Selenium с Chrome |
selenium/hub + selenium/node-* | Selenium Grid |
postgres | PostgreSQL для интеграционных тестов |
redis | Redis для тестов кэширования |
localstack/localstack | Эмуляция сервисов AWS |
mailhog/mailhog | Тестирование email |
Ключевые выводы
- Docker обеспечивает консистентность окружений — один образ работает одинаково на ноутбуке и в CI
- Образы — шаблоны, контейнеры — экземпляры — один образ может породить множество контейнеров
- Оптимизируйте слои Dockerfile — зависимости первыми, тестовый код последним для оптимального кэширования
- Используйте тома для тестовых артефактов — монтируйте директории хоста для извлечения отчётов и скриншотов
- Выучите базовые команды отладки —
docker exec,docker logsиdocker inspectсэкономят часы