Что находится между unit и n2n слоями в пирамиде тестирования?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Пирамида тестирования: слои от unit к n2n
Вопрос немного запутан в формулировке, но вероятнее всего речь идёт о пирамиде тестирования (Testing Pyramid) и слоях между unit тестами и e2e (end-to-end) тестами. Давайте разберёмся.
Классическая пирамида тестирования
E2E / Integration
/ / /____________________ / Integration Tests / (Component/API tests) /___________________________ / Unit Tests /__________________________________```
### Слои пирамиды тестирования (от дна к вершине)
#### 1. Unit Tests (Unit Test Layer)
Тестирование **отдельных функций и методов** без зависимостей.
```python
Unit тест
def calculate_discount(price, discount_percent): return price * (1 - discount_percent / 100)
def test_calculate_discount(): assert calculate_discount(100, 10) == 90 assert calculate_discount(100, 0) == 100 assert calculate_discount(100, 100) == 0
Характеристики:
- Самые быстрые
- Изолированы от внешних зависимостей
- Большое количество (60-70% всех тестов)
- Используют mocks и stubs
2. Integration Tests (Интеграционные тесты)
Это то, что находится между unit и e2e. Тестирование взаимодействия между компонентами, слоями, модулями.
import pytest from unittest.mock import Mock, patch
class UserRepository: def init(self, db): self.db = db
def save_user(self, user):
return self.db.insert(user)
def get_user(self, user_id):
return self.db.query(f"SELECT * FROM users WHERE id={user_id}")
class UserService: def init(self, repository): self.repository = repository
def create_user(self, name, email):
user = {'name': name, 'email': email}
return self.repository.save_user(user)
Integration тест: сервис + репозиторий + мок БД
@pytest.fixture
def mock_db(): return Mock()
@pytest.fixture
def user_repository(mock_db): return UserRepository(mock_db)
@pytest.fixture
def user_service(user_repository): return UserService(user_repository)
def test_create_user_integration(user_service, mock_db): mock_db.insert.return_value = {'id': 1, 'name': 'John', 'email': 'john@example.com'}
result = user_service.create_user('John', 'john@example.com')
# Проверяем, что репозиторий был вызван
assert result is not None
mock_db.insert.assert_called_once()
Типы интеграционных тестов:
API/Component Tests — тестирование API слоя с реальной БД:
import pytest from fastapi.testclient import TestClient from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker
client = TestClient(app)
@pytest.fixture
def test_db(): engine = create_engine("sqlite:///:memory:") Base.metadata.create_all(engine) SessionLocal = sessionmaker(bind=engine) return SessionLocal()
def test_create_user_api(test_db): response = client.post("/users", json={ "name": "John", "email": "john@example.com" })
assert response.status_code == 201
assert response.json()['id'] is not None
Service Layer Tests — тестирование бизнес-логики:
class OrderService: def init(self, db, payment_service): self.db = db self.payment_service = payment_service
def create_order(self, user_id, items):
total = sum(item.price for item in items)
payment_result = self.payment_service.charge(user_id, total)
if payment_result.success:
order = Order.create(user_id=user_id, items=items, total=total)
self.db.save(order)
return order
else:
raise PaymentError("Payment failed")
Integration тест
@pytest.fixture
def mock_payment_service(): service = Mock() service.charge.return_value = Mock(success=True) return service
def test_create_order_with_successful_payment(mock_payment_service): db = Mock() service = OrderService(db, mock_payment_service)
result = service.create_order(1, [Mock(price=100)])
mock_payment_service.charge.assert_called_once_with(1, 100)
db.save.assert_called_once()
3. E2E Tests (End-to-End Tests)
Тестирование полного пути от пользователя через весь стек приложения.
import pytest from playwright.sync_api import sync_playwright
def test_user_registration_e2e(): with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page()
# Пользователь открывает страницу регистрации
page.goto("http://localhost:8000/register")
# Заполняет форму
page.fill('input[name="name"]', "John Doe")
page.fill('input[name="email"]', "john@example.com")
page.fill('input[name="password"]', "SecurePassword123")
# Отправляет форму
page.click('button[type="submit"]')
# Проверяем, что пользователь перенаправлен на страницу профиля
page.wait_for_url("http://localhost:8000/profile")
assert "John Doe" in page.content()
browser.close()
Характеристики:
- Самые медленные
- Тестируют весь стек приложения
- Небольшое количество (10-20% тестов)
- Требуют запущенного приложения
Проблема с формулировкой "unit и n2n"
Я полагаю, что "n2n" это опечатка или неправильное аббревиатура. Возможно имелось в виду:
- n-tier (многоуровневая архитектура)
- e2e (end-to-end)
- integration (интеграционные)
Если вопрос о слоях между unit и e2e, то ответ — интеграционные тесты.
Рекомендуемое распределение тестов
Пирамида тестирования: правильное распределение
test_distribution = { 'unit_tests': { 'percentage': 60-70, 'speed': 'very_fast', 'examples': [ 'test_calculate_discount', 'test_validate_email', 'test_format_date' ] }, 'integration_tests': { 'percentage': 20-30, 'speed': 'fast', 'examples': [ 'test_user_creation_with_db', 'test_api_endpoint_response', 'test_service_with_mocked_dependencies' ] }, 'e2e_tests': { 'percentage': 10, 'speed': 'slow', 'examples': [ 'test_complete_user_flow', 'test_checkout_process', 'test_login_and_purchase' ] } }
Практический пример структуры тестов
tests/unit/test_utils.py
def test_calculate_total(): assert calculate_total([10, 20, 30]) == 60
tests/integration/test_order_service.py
def test_create_order_with_payment(): db_mock = Mock() payment_mock = Mock(return_value=True) service = OrderService(db_mock, payment_mock)
result = service.create_order(1, [Item(10)])
assert result is not None
tests/e2e/test_checkout_flow.py
def test_complete_checkout_flow(): # Открыть браузер, заполнить корзину, оплатить page.goto("/store") page.click("button:has-text('Add to cart')") # ... и так далее
Выводы
Между unit и e2e находятся интеграционные тесты, которые:
- Тестируют взаимодействие компонентов (не изолированы как unit)
- Работают быстрее чем e2e (могут использовать in-memory БД)
- Проверяют правильность интеграции между слоями
- Являются критически важны для надёжности приложения
Правильная пирамида тестирования обеспечивает баланс между скоростью выполнения, надёжностью и удобством сопровождения кода.