Писал ли Dockerfile для тестового окружения?

«Писал ли Dockerfile для тестового окружения?» — вопрос из категории CI/CD и DevOps, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, регулярно пишу Dockerfile для изоляции и воспроизводимости тестового окружения. Это позволяет запускать автотесты в идентичной среде на любой машине и в CI/CD-пайплайне.

Пример Dockerfile для запуска набора Python-автотестов (UI + API):

# Используем официальный образ Python как базовый
FROM python:3.11-slim-buster

# Устанавливаем системные зависимости, необходимые для Selenium и других инструментов
RUN apt-get update && apt-get install -y 
    wget 
    gnupg 
    unzip 
    # Для headless Chrome
    chromium 
    chromium-driver 
    fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf 
    libxss1 
    --no-install-recommends && 
    rm -rf /var/lib/apt/lists/*

# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /usr/src/app

# Копируем файл с зависимостями и устанавливаем их
# Это делается отдельным слоем для кэширования
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копируем весь проект (включая тесты, конфиги, тестовые данные)
COPY . .

# Указываем переменные окружения для тестов
ENV ENV=ci 
    PYTHONPATH=/usr/src/app 
    CHROME_BIN=/usr/bin/chromium

# Команда по умолчанию для запуска тестов через Pytest
CMD ["pytest", "./tests", "-v", "--tb=short", "--html=report.html", "--self-contained-html"]

Сопровождающий .dockerignore файл:

# Игнорируем ненужные для запуска тестов файлы
.git
__pycache__
*.pyc
.env
*.log
*.tmp
coverage.xml
.pytest_cache
htmlcov/

Практическое применение:

  1. Локальная разработка: docker build -t autotests . && docker run autotests — позволяет быстро проверить, что тесты работают в чистом окружении.
  2. CI/CD (GitLab CI):

    stages:
      - test
    
    autotests:
      stage: test
      image: docker:latest
      services:
        - docker:dind
      script:
        - docker build -t test-runner .
        - docker run --rm test-runner
  3. Multi-stage сборка: Для разделения этапов сборки зависимостей и запуска, что уменьшает итоговый размер образа.

Это гарантирует, что все тесты запускаются в одинаковом окружении, независимо от операционной системы или глобальных настроек разработчика.