Ответ
В классической пирамиде тестирования уровни располагаются следующим образом (сверху вниз):
- Приёмочное тестирование (Acceptance Testing / E2E) — проверка готовности системы для использования заказчиком. Часто включает UI-тесты, имитирующие действия пользователя.
- Системное тестирование (System Testing) — тестирование полностью интегрированной системы на соответствие требованиям.
- Интеграционное тестирование (Integration Testing) — проверка взаимодействия между модулями, сервисами или системами.
- Компонентное тестирование (Component / Module Testing) — тестирование отдельных, изолированных частей приложения (например, сервиса или модуля).
- Модульное тестирование (Unit Testing) — тестирование минимальных изолированных единиц кода (функций, методов, классов).
Почему важна пирамида? Она отражает баланс между стоимостью, скоростью и надёжностью. Модульных тестов должно быть много (основание пирамиды), а дорогих и медленных E2E-тестов — меньше (верхушка).
Пример на Python с pytest:
# 5. Unit Test (быстрый, изолированный)
def test_calculate_discount():
assert calculate_discount(100, 10) == 90
# 4. Component Test (тестируем сервис в изоляции с заглушками)
def test_payment_service_with_mock():
mock_gateway = Mock()
service = PaymentService(mock_gateway)
result = service.process(amount=50)
assert result.success is True
mock_gateway.charge.assert_called_once()
# 3. Integration Test (проверяем взаимодействие с реальной БД)
def test_user_repository_saves_to_db(db_session):
repo = UserRepository(db_session)
user = User(name="Test")
saved_user = repo.save(user)
assert saved_user.id is not None
assert db_session.query(User).count() == 1
# 2. System / 1. E2E Test (используем Selenium для UI или API-клиент)
# Пример API E2E-теста:
def test_full_order_flow(api_client):
response = api_client.post("/api/orders", json={"item": "book"})
assert response.status_code == 201
order_id = response.json()["id"]
# Проверяем, что заказ появился в системе
status_response = api_client.get(f"/api/orders/{order_id}")
assert status_response.json()["status"] == "PROCESSING"