Что такое «юнит» (unit) в контексте модульного тестирования?

«Что такое «юнит» (unit) в контексте модульного тестирования?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Юнит (Unit) в модульном тестировании — это минимальная, логически завершённая и изолируемая часть программного кода, предназначенная для независимой проверки. Чаще всего это один метод или функция, но может быть и небольшой класс, если его методы тесно связаны.

Ключевые характеристики юнита:

  • Минимальность: Проверяет одну конкретную ответственность или путь выполнения.
  • Изолированность: Не зависит от внешних систем (БД, сетевых сервисов, файловой системы). Зависимости заменяются заглушками (stubs) или макетами (mocks).
  • Скорость: Выполняется очень быстро (миллисекунды).
  • Детерминированность: Результат всегда одинаковый при одинаковых входных данных.

Пример:

Класс для тестирования:

public class Calculator {
    public int add(int a, int b) {
        return a + b; // Этот метод — кандидат в "юнит"
    }
}

Модульный тест для этого юнита:

@Test
public void add_TwoPositiveNumbers_ReturnsSum() {
    // 1. Arrange (Подготовка)
    Calculator calc = new Calculator();
    int a = 2, b = 3;
    int expected = 5;

    // 2. Act (Действие) — тестируем ОДНУ функцию
    int actual = calc.add(a, b);

    // 3. Assert (Проверка)
    assertEquals(expected, actual);
}

Что НЕ является юнитом? Тест, который обращается к реальной базе данных, вызывает REST API или читает файл с диска — это уже интеграционный или системный тест.