Устанавливаете Docker Desktop, запускаете PostgreSQL через docker-compose.yml, подключаетесь через psql, первый SELECT и INSERT, понимаете транзакции. Всё необходимое для курса за 40 минут. ОБЯЗАТЕЛЬНЫЙ БЕСПЛАТНЫЙ МОДУЛЬ
Это обязательный бесплатный модуль для всех, кто начинает курс. За 40 минут вы установите Docker, запустите PostgreSQL и выполните первые SQL-команды.
Цель: Убрать все технические барьеры перед тем, как начать тестирование БД.
Вам НЕ нужен опыт с:
Вам нужен только:
Если Docker/PostgreSQL уже установлены:
Вы можете пропустить секции установки, но обязательно выполните практику (SELECT, INSERT, транзакции) — это фундамент для курса.
macOS:
# M1/M2 Mac (Apple Silicon)
https://www.docker.com/products/docker-desktop/
# Intel Mac
https://www.docker.com/products/docker-desktop/Windows:
# Windows 10/11 Pro, Enterprise, или Education
https://www.docker.com/products/docker-desktop/
# Требования:
# - WSL 2 (Windows Subsystem for Linux)
# - Virtualization enabled в BIOSLinux (Ubuntu/Debian):
# Установка Docker Engine
sudo apt-get update
sudo apt-get install docker.io docker-compose
sudo usermod -aG docker $USER
# Logout и login обратноdocker --version
# Docker version 25.0.0, build abc123
docker-compose --version
# Docker Compose version v2.24.0✅ Если видите версии — Docker установлен!
macOS: "Docker Desktop is starting..."
Windows: "WSL 2 installation is incomplete"
# Установите WSL 2
wsl --install
wsl --set-default-version 2Linux: "permission denied"
# Добавьте себя в группу docker
sudo usermod -aG docker $USER
# Logout и login обратноmkdir pytest-db-course
cd pytest-db-course# docker-compose.yml
version: "3.8"
services:
postgres:
image: postgres:16
container_name: pytest-postgres
environment:
POSTGRES_USER: testuser
POSTGRES_PASSWORD: testpass
POSTGRES_DB: testdb
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:Что здесь происходит:
image: postgres:16 — используем PostgreSQL версии 16POSTGRES_USER: testuser — username для подключенияPOSTGRES_PASSWORD: testpass — пароль (для тестов!)POSTGRES_DB: testdb — имя базы данныхports: "5432:5432" — PostgreSQL доступен на localhost:5432volumes — данные сохраняются между перезапускамиdocker-compose up -d
# Creating pytest-postgres ... done
# Проверьте статус
docker-compose ps
# NAME STATUS
# pytest-postgres Up 5 seconds✅ PostgreSQL запущен!
docker-compose logs postgres
# Должны увидеть: "database system is ready to accept connections"macOS:
brew install libpq
echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc
source ~/.zshrcWindows:
psql уже включен в Docker контейнер (используйте метод 2).
Linux:
sudo apt-get install postgresql-clientpsql -h localhost -U testuser -d testdb
# Password: testpass
# Должны увидеть:
# testdb=#docker exec -it pytest-postgres psql -U testuser -d testdb
# testdb=#✅ Вы подключены к PostgreSQL!
-- Проверьте версию PostgreSQL
SELECT version();
-- Результат:
-- PostgreSQL 16.1 on x86_64-pc-linux-gnu...
-- Покажите текущую БД
SELECT current_database();
-- Результат:
-- testdb
-- Выход
\q-- Подключитесь к PostgreSQL
docker exec -it pytest-postgres psql -U testuser -d testdb
-- Создайте таблицу
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Проверьте структуру
\d users
-- Результат:
-- Column | Type | Modifiers
-- -----------+---------+-------------
-- id | integer | not null default nextval('users_id_seq')
-- email | varchar | not null
-- created_at| timestamp| default now()-- Добавьте одного пользователя
INSERT INTO users (email) VALUES ('alice@test.com');
-- Добавьте несколько за раз
INSERT INTO users (email) VALUES
('bob@test.com'),
('charlie@test.com');
-- Проверьте результат
SELECT * FROM users;
-- id | email | created_at
-- ----+------------------+------------------------
-- 1 | alice@test.com | 2025-11-25 12:30:00
-- 2 | bob@test.com | 2025-11-25 12:30:01
-- 3 | charlie@test.com | 2025-11-25 12:30:01-- Все пользователи
SELECT * FROM users;
-- Только email
SELECT email FROM users;
-- Фильтрация
SELECT * FROM users WHERE email = 'alice@test.com';
-- Подсчёт
SELECT COUNT(*) FROM users;
-- count: 3-- Добавьте колонку для имени
ALTER TABLE users ADD COLUMN name VARCHAR(100);
-- Обновите данные
UPDATE users SET name = 'Alice' WHERE email = 'alice@test.com';
-- Проверьте
SELECT * FROM users WHERE email = 'alice@test.com';
-- id | email | created_at | name
-- ----+------------------+------------+-------
-- 1 | alice@test.com | ... | Alice-- Удалите одного пользователя
DELETE FROM users WHERE email = 'charlie@test.com';
-- Проверьте
SELECT COUNT(*) FROM users;
-- count: 2 (Alice и Bob остались)
-- Удалите всех (осторожно!)
DELETE FROM users;
-- Проверьте
SELECT COUNT(*) FROM users;
-- count: 0Транзакция — группа SQL команд, которые выполняются все или ничего.
Пример без транзакции (плохо для тестов):
-- Добавляем пользователя
INSERT INTO users (email) VALUES ('test@test.com');
-- ❌ Тест упал — но данные остались в БД!
-- Следующий тест увидит "мусор" от предыдущего тестаПаттерн для изоляции тестов:
-- Начните транзакцию
BEGIN;
-- Вставьте тестовые данные
INSERT INTO users (email) VALUES ('test@test.com');
-- Проверьте (в рамках транзакции)
SELECT * FROM users WHERE email = 'test@test.com';
-- id | email | created_at | name
-- ----+------------------+------------+------
-- 1 | test@test.com | ... | NULL
-- Откатите изменения
ROLLBACK;
-- Данные исчезли!
SELECT * FROM users WHERE email = 'test@test.com';
-- (0 rows)✅ Это фундамент для изоляции тестов!
В pytest мы будем:
@pytest.fixture
def db_connection():
conn = psycopg2.connect(...)
conn.execute("BEGIN") # Начать транзакцию
yield conn
conn.execute("ROLLBACK") # Откатить после теста-- Начните транзакцию
BEGIN;
-- Вставьте данные
INSERT INTO users (email) VALUES ('real@test.com');
-- Сохраните изменения
COMMIT;
-- Данные сохранены навсегда
SELECT * FROM users;
-- id | email | created_at | name
-- ----+------------------+------------+------
-- 1 | real@test.com | ... | NULLВы готовы к курсу если можете выполнить:
-- 1. Создать таблицу
CREATE TABLE test_ready (
id SERIAL PRIMARY KEY,
message TEXT
);
-- 2. Вставить данные в транзакции
BEGIN;
INSERT INTO test_ready (message) VALUES ('I am ready!');
ROLLBACK;
-- 3. Проверить что данные исчезли
SELECT COUNT(*) FROM test_ready;
-- count: 0 ✅
-- 4. Очистить
DROP TABLE test_ready;✅ Если всё работает — вы готовы!
# Остановить контейнер (данные сохраняются)
docker-compose stop
# Запустить снова
docker-compose start
# Остановить и удалить (данные сохраняются в volume)
docker-compose down
# Запустить заново
docker-compose up -d# Остановить и удалить ВСЁ включая volumes
docker-compose down -v
# Запустить с чистой БД
docker-compose up -dПроблема: У вас уже установлен PostgreSQL локально.
Решение 1: Остановите локальный PostgreSQL
# macOS
brew services stop postgresql
# Linux
sudo systemctl stop postgresqlРешение 2: Используйте другой порт
# docker-compose.yml
ports:
- "5433:5432" # Используем 5433 вместо 5432# Подключение
psql -h localhost -p 5433 -U testuser -d testdbПроблема: PostgreSQL ещё не запустился.
Решение:
# Проверьте логи
docker-compose logs postgres
# Дождитесь: "database system is ready to accept connections"Проблема: Неправильный пароль.
Решение:
# Проверьте docker-compose.yml
# POSTGRES_PASSWORD: testpass
# Используйте правильный пароль
psql -h localhost -U testuser -d testdb
# Password: testpassВопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.
Далее: Integration vs Unit: границы тестирования