Как в процессе тестирования происходит работа с базой данных?

Ответ

Взаимодействие с БД — неотъемлемая часть проверки целостности данных и бизнес-логики.

Типичные сценарии и инструменты:

Сценарий тестирования Цель работы с БД Инструменты / Методы
Ручное тестирование Валидация результатов CRUD-операций, проверка связей данных. Прямые SQL-запросы в клиенте (DBeaver, pgAdmin, psql). Пример: SELECT * FROM orders WHERE user_id = 123;
Автоматизированное тестирование Подготовка тестовых данных, проверка состояния после выполнения теста. ORM (SQLAlchemy, Hibernate), библиотеки доступа (psycopg2, JDBC).
Тестирование ETL/миграций Сравнение данных до и после преобразования, проверка сложных вычислений. Написание скриптов с множеством JOIN и агрегирующих функций.

Пример автотеста на Python с прямой проверкой в БД:

import psycopg2

def test_order_creation(db_connection):
    """Тест проверяет, что заказ корректно сохраняется в БД."""
    # 1. Действие в приложении: создание заказа через API
    create_order_via_api(product_id=777, quantity=2)

    # 2. Проверка в БД
    cursor = db_connection.cursor()
    cursor.execute("""
        SELECT id, quantity, status 
        FROM orders 
        WHERE product_id = 777 
        ORDER BY created_at DESC 
        LIMIT 1
    """)
    db_record = cursor.fetchone()

    # 3. Верификация
    assert db_record is not None, "Запись о заказе не найдена в БД"
    assert db_record[1] == 2  # Проверка количества
    assert db_record[2] == 'pending'  # Проверка статуса

Частота работы: от нескольких раз в спринт (ручные проверки) до десятков раз в день (в рамках CI/CD пайплайна с автотестами).

Ответ 18+ 🔞

Ага, ну вот, подъехали к самому сокровенному — к базе данных. Это ж, блядь, святая святых, там вся правда жизни лежит, а не то что в этих ваших логах и интерфейсах. Если приложение врет, как сивый мерин, то БД тебе честно скажет, кто тут реально накосячил.

Типичные разборки с хранилищем данных:

Что делаем Зачем лезем в кишки Чем ковыряемся
Ручная проверка (когда надо мозги включить) Убедиться, что после клика "Купить" деньги не испарились, а заказ прилип. Прямо в DBeaver или psql вбиваем запрос, типа: SELECT * FROM orders WHERE user_id = 123; и смотрим, не пиздёж ли это всё.
Автотесты (когда надо, чтобы само всё бегало) Нагенерить тестового дерьма, проверить состояние до и после, откатить. Используем ORM (SQLAlchemy иже с ними) или драйверы (psycopg2), чтобы не париться с голым SQL в коде.
Проверка миграций и переносов (ETL) Сравнить, что было в старой помойке и что стало в новой, после всех этих "магических" преобразований. Пишем скрипты с кучей JOIN и агрегаций, чтобы выловить все косяки.

Вот, смотри, как это выглядит в коде, когда тест сам лезет в базу проверить факты:

import psycopg2

def test_order_creation(db_connection):
    """Тест проверяет, что заказ не сдулся по дороге в базу."""
    # 1. Симулируем действие юзера: тыкнул кнопку, отправил запрос
    create_order_via_api(product_id=777, quantity=2)

    # 2. А теперь лезем в базу, искать улики
    cursor = db_connection.cursor()
    cursor.execute("""
        SELECT id, quantity, status 
        FROM orders 
        WHERE product_id = 777 
        ORDER BY created_at DESC 
        LIMIT 1
    """)
    db_record = cursor.fetchone()

    # 3. Сверяем показания
    assert db_record is not None, "Запись о заказе не найдена в БД, ёпта!"
    assert db_record[1] == 2  # Количество должно совпадать, а то хуйня какая-то
    assert db_record[2] == 'pending'  # Статус должен быть "в ожидании", а не "уплыл"

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