← Назад к вопросам

Как добавлял записи в БД

1.0 Junior🔥 122 комментариев
#Базы данных и SQL

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стратегии добавления записей в базу данных в контексте тестирования

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

1. Через пользовательский интерфейс (E2E и интеграционные тесты)

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

// Пример через UI с помощью Playwright
await page.goto('/product/create');
await page.fill('#product-name', 'Тестовый продукт');
await page.fill('#product-price', '99.99');
await page.click('#save-button');
// Проверяем, что запись появилась в UI
await expect(page.locator('.success-message')).toBeVisible();

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

2. Прямые SQL-запросы (наиболее эффективный способ)

Для подготовки тестовых данных или проверки бизнес-логики оптимально использовать прямые запросы.

-- Простая вставка
INSERT INTO users (username, email, created_at) 
VALUES ('test_user', 'test@example.com', NOW());

-- Массовая вставка для тестов производительности
INSERT INTO orders (user_id, amount, status) 
SELECT 
    id, 
    ROUND(RAND() * 1000, 2),
    'pending'
FROM users 
WHERE created_at > '2024-01-01'
LIMIT 10000;

Преимущества:

  • Высокая скорость выполнения
  • Точный контроль над вставляемыми данными
  • Возможность создания сложных связей между таблицами

3. Через API (REST/GraphQL)

Оптимальный баланс между скоростью и проверкой бизнес-логики.

import requests

# Пример для REST API
def create_product_via_api(product_data):
    response = requests.post(
        'https://api.example.com/products',
        json=product_data,
        headers={'Authorization': f'Bearer {token}'}
    )
    return response.json()

# Использование
new_product = {
    "name": "Тестовый продукт",
    "price": 99.99,
    "category_id": 5
}
created_product = create_product_via_api(new_product)

4. Использование ORM и моделей приложения

В unit-тестах или интеграционных тестах на уровне сервиса.

// Пример на Java с Spring Data JPA
@Test
public void testCreateUser() {
    User user = new User();
    user.setUsername("test_user");
    user.setEmail("test@example.com");
    
    User savedUser = userRepository.save(user);
    
    assertNotNull(savedUser.getId());
    assertEquals("test_user", savedUser.getUsername());
}

5. Фабрики данных и фикстуры

Для структурированного создания тестовых данных в автоматизированных тестах.

# Использование factory_boy
import factory
from models import User

class UserFactory(factory.Factory):
    class Meta:
        model = User
    
    username = factory.Sequence(lambda n: f'user_{n}')
    email = factory.LazyAttribute(lambda obj: f'{obj.username}@example.com')

# Создание тестовых данных
test_user = UserFactory.create()  # Сохраняется в БД
users_list = UserFactory.create_batch(50)  # 50 пользователей

Ключевые принципы, которые я соблюдаю:

  • Идемпотентность тестов: Каждый тест должен очищать за собой данные или использовать изолированные базы
  • Использование транзакций: Для отката изменений после теста
@pytest.fixture
def db_session():
    """Фикстура с откатом транзакции после теста"""
    session = create_session()
    transaction = session.begin()
    yield session
    transaction.rollback()
    session.close()
  • Параметризация данных: Для проверки граничных значений и различных сценариев
  • Мокирование внешних зависимостей: При unit-тестировании сервисов, работающих с БД

Сценарии использования разных подходов:

  1. Подготовка тестовой среды → SQL-скрипты и миграции
  2. Интеграционные тесты API → REST/GraphQL запросы
  3. E2E тестирование → Через UI с последующей проверкой в БД
  4. Нагрузочное тестирование → Прямые SQL-запросы или специализированные утилиты
  5. Unit-тестирование сервисов → Моки репозиториев или in-memory базы

Важнейший аспект — соблюдение баланса между реалистичностью тестов и их производительностью. Для быстрых юнит-тестов использую моки, для интеграционных — реальную БД с транзакционным откатом, для E2E — полный цикл через UI с предварительной настройкой данных через API или SQL.