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

Как протестируешь выполнение запроса данных из бд и их возвращение на веб-сервис?

2.0 Middle🔥 151 комментариев
#Python Core#Soft Skills

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

Тестирование запросов к БД и возврата данных в веб-сервисе

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

Стратегия тестирования

Тестирование делится на несколько уровней:

  1. Unit тесты — изолированное тестирование логики
  2. Интеграционные тесты — с реальной БД (или тестовой)
  3. E2E тесты — полный цикл от клиента до БД

1. Unit тесты с моками

Тестируем слой приложения отдельно от БД:

import pytest
from unittest.mock import Mock, patch
from myapp.services.user_service import UserService
from myapp.models import User

class TestUserService:
    """Unit тесты сервиса без обращения к БД"""
    
    @pytest.fixture
    def mock_repository(self):
        return Mock()
    
    def test_get_user_by_id_success(self, mock_repository):
        """Тест: успешное получение пользователя"""
        user_id = 1
        expected_user = User(id=1, name="John", email="john@example.com")
        mock_repository.get_by_id.return_value = expected_user
        
        service = UserService(repository=mock_repository)
        result = service.get_user(user_id)
        
        assert result.id == expected_user.id
        assert result.name == "John"
        mock_repository.get_by_id.assert_called_once_with(user_id)

2. Интеграционные тесты с БД

Тестируем реальное взаимодействие с БД:

import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from myapp.models import Base, User
from myapp.repository import UserRepository

@pytest.fixture(scope="session")
def test_db():
    engine = create_engine("sqlite:///:memory:")
    Base.metadata.create_all(engine)
    return engine

@pytest.fixture
def db_session(test_db):
    connection = test_db.connect()
    transaction = connection.begin()
    session = sessionmaker(bind=connection)()
    
    yield session
    
    session.close()
    transaction.rollback()
    connection.close()

class TestUserRepository:
    def test_create_and_retrieve_user(self, db_session):
        repo = UserRepository(db_session)
        new_user = User(name="Alice", email="alice@example.com")
        
        created_user = repo.create(new_user)
        db_session.commit()
        
        retrieved = repo.get_by_id(created_user.id)
        
        assert retrieved is not None
        assert retrieved.name == "Alice"

3. Тесты API endpoint'ов

Тестируем полный цикл: клиент → API → БД:

import pytest
from fastapi.testclient import TestClient
from myapp.main import app

@pytest.fixture
def client(db_session):
    def override_get_db():
        return db_session
    
    app.dependency_overrides[get_db] = override_get_db
    return TestClient(app)

class TestUserAPI:
    def test_get_user_endpoint(self, client, db_session):
        user = User(name="John", email="john@example.com")
        db_session.add(user)
        db_session.commit()
        
        response = client.get(f"/api/v1/users/{user.id}")
        
        assert response.status_code == 200
        data = response.json()
        assert data["name"] == "John"
    
    def test_create_user_endpoint(self, client):
        response = client.post(
            "/api/v1/users",
            json={"name": "Jane", "email": "jane@example.com"}
        )
        
        assert response.status_code == 201
        data = response.json()
        assert data["id"] is not None

4. Лучшие практики

ПрактикаОписание
AAA PatternArrange → Act → Assert
FixturesПереиспользуемые данные
MockingИзоляция от БД
ParametrizeНесколько сценариев
IsolationОткат транзакций

Команды запуска

pytest                              # Все тесты
pytest --cov=myapp                 # С покрытием
pytest tests/test_user_service.py  # Конкретный файл
pytest -m integration              # Только интеграционные

Этот многоуровневый подход гарантирует корректность загрузки данных из БД и их возврата клиенту.

Как протестируешь выполнение запроса данных из бд и их возвращение на веб-сервис? | PrepBro