Integration Testing JavaScript with Docker: A Complete Guide

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Интеграционное тестирование JavaScript с Docker: полное руководство



Интеграционное тестирование — критически важный этап разработки на JavaScript (Node.js). Оно проверяет взаимодействие вашего приложения с внешними сервисами: базами данных, API, кэшами и очередями. Использование Docker для этих целей позволяет изолировать тестовую среду, гарантировать её воспроизводимость и избежать проблем с "это работает на моей машине". В этой статье мы разберём, как настроить интеграционное тестирование JavaScript-приложений с помощью Docker, Docker Compose и популярных тестовых фреймворков.



Зачем нужен Docker для интеграционного тестирования?



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



  • Изоляцию: каждый тестовый запуск происходит в чистом контейнере.
  • Воспроизводимость: одинаковое окружение для всех разработчиков и CI/CD.
  • Скорость: контейнеры запускаются за секунды, а не минуты.
  • Управление зависимостями: легко поднять PostgreSQL, Redis, RabbitMQ и другие сервисы.


Настройка тестовой среды с Docker Compose



Начнём с создания проекта. Допустим, у нас есть простое Node.js приложение, которое сохраняет данные в PostgreSQL. Создадим файл docker-compose.test.yml:



version: '3.8'

services: test-runner: build: context: . dockerfile: Dockerfile.test depends_on: - db - redis environment: - NODE_ENV=test - DATABASE_URL=postgresql://testuser:testpass@db:5432/testdb - REDIS_URL=redis://redis:6379 volumes: - ./coverage:/app/coverage

db: image: postgres:15-alpine environment: POSTGRES_USER: testuser POSTGRES_PASSWORD: testpass POSTGRES_DB: testdb ports: - "5432" tmpfs: - /var/lib/postgresql/data

redis: image: redis:7-alpine ports: - "6379"


Обратите внимание на tmpfs для PostgreSQL — это гарантирует, что после завершения тестов данные не сохранятся, и каждый запуск будет начинаться с чистой базы.



Dockerfile для тестов



Создадим Dockerfile.test, который оптимизирован для тестирования, а не для продакшена:



FROM node:18-alpine

WORKDIR /app

# Копируем только package.json для кэширования слоя зависимостейCOPY package*.json ./RUN npm ci --only=production && npm ci --only=dev

# Копируем исходный кодCOPY . .

# Устанавливаем wait-for-it для ожидания готовности сервисовADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /wait-for-it.shRUN chmod +x /wait-for-it.sh

CMD ["sh", "-c", "/wait-for-it.sh db:5432 -- /wait-for-it.sh redis:6379 -- npm test"]


Написание интеграционных тестов на JavaScript



Теперь напишем сами тесты. Используем Jest и Supertest для тестирования API. Создадим файл tests/integration/user.test.js:



const request = require('supertest');const { app } = require('../src/app');const { Pool } = require('pg');

describe('User API Integration Tests', () => { let pool;

beforeAll(async () => { // Создаём пул соединений к тестовой БД pool = new Pool({ connectionString: process.env.DATABASE_URL });

// Выполняем миграции перед тестами const migrationSQL = ` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); `; await pool.query(migrationSQL); });

afterAll(as

Blogs

Book Recommendations