Расположи уровни тестирования сверху вниз (от высокоуровневых к низкоуровневым)

«Расположи уровни тестирования сверху вниз (от высокоуровневых к низкоуровневым)» — вопрос из категории Основы тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В классической пирамиде тестирования уровни располагаются следующим образом (сверху вниз):

  1. Приёмочное тестирование (Acceptance Testing / E2E) — проверка готовности системы для использования заказчиком. Часто включает UI-тесты, имитирующие действия пользователя.
  2. Системное тестирование (System Testing) — тестирование полностью интегрированной системы на соответствие требованиям.
  3. Интеграционное тестирование (Integration Testing) — проверка взаимодействия между модулями, сервисами или системами.
  4. Компонентное тестирование (Component / Module Testing) — тестирование отдельных, изолированных частей приложения (например, сервиса или модуля).
  5. Модульное тестирование (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"