В чем разница между модульными (Unit), интеграционными и сквозными (End-to-End) тестами?

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

Ответ

Это основные уровни тестирования, образующие тестовую пирамиду. Они различаются по объему проверяемого кода, скорости выполнения и сложности поддержки.

Модульные тесты (Unit Tests)

  • Цель: Проверить корректность работы отдельной функции, метода или класса в полной изоляции.
  • Объем: Минимальный. Все внешние зависимости (база данных, API, файловая система) заменяются моками или стабами.
  • Скорость: Очень высокие.
  • Пример (Python/pytest):
    def test_calculate_discount():
    # Изолированный тест чистой функции
    assert calculate_discount(100, 10) == 90
    assert calculate_discount(0, 10) == 0

Интеграционные тесты (Integration Tests)

  • Цель: Проверить взаимодействие между несколькими компонентами системы (например, сервис + база данных, два микросервиса).
  • Объем: Средний. Используются реальные или приближенные к реальным зависимости (тестовая БД, заглушки сервисов).
  • Скорость: Средние.
  • Пример (проверка работы с БД):
    def test_user_repository_saves_to_db(db_session):
    repo = UserRepository(db_session)
    user = User(name="Alice")
    saved_user = repo.save(user)
    # Проверяем реальное взаимодействие с БД
    assert saved_user.id is not None
    assert db_session.query(User).filter_by(id=saved_user.id).first() is not None

Сквозные тесты (End-to-End / E2E Tests)

  • Цель: Имитировать полный путь пользователя через приложение, проверяя всю систему целиком (UI, бэкенд, БД, сети).
  • Объем: Максимальный. Запускается всё приложение в среде, максимально близкой к продакшену.
  • Скорость: Низкие.
  • Пример (Cypress для веб-приложения):
    describe('Пользовательский поток покупки', () => {
    it('пользователь может добавить товар в корзину и оформить заказ', () => {
    cy.visit('/products');
    cy.get('[data-testid="product-card"]').first().click();
    cy.get('[data-testid="add-to-cart"]').click();
    cy.visit('/cart');
    cy.contains('Оформить заказ').click();
    cy.url().should('include', '/checkout');
    cy.get('[data-testid="order-success"]').should('be.visible');
    });
    });

Ключевое правило (Пирамида тестов): Много быстрых и дешёвых модульных тестов в основании, меньше интеграционных и совсем мало медленных и дорогих E2E-тестов на вершине.