← Назад к вопросам
Как протестируешь выполнение запроса данных из бд и их возвращение на веб-сервис?
2.0 Middle🔥 151 комментариев
#Python Core#Soft Skills
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Тестирование запросов к БД и возврата данных в веб-сервисе
Это один из ключевых аспектов разработки — убедиться, что данные корректно загружаются из БД и правильно возвращаются клиенту. Я использую многоуровневый подход к тестированию.
Стратегия тестирования
Тестирование делится на несколько уровней:
- Unit тесты — изолированное тестирование логики
- Интеграционные тесты — с реальной БД (или тестовой)
- 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 Pattern | Arrange → Act → Assert |
| Fixtures | Переиспользуемые данные |
| Mocking | Изоляция от БД |
| Parametrize | Несколько сценариев |
| Isolation | Откат транзакций |
Команды запуска
pytest # Все тесты
pytest --cov=myapp # С покрытием
pytest tests/test_user_service.py # Конкретный файл
pytest -m integration # Только интеграционные
Этот многоуровневый подход гарантирует корректность загрузки данных из БД и их возврата клиенту.