Какую роль выполняют утверждения (assert) в модульном тестировании?

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

Ответ

Утверждения (asserts) — это методы в тестовых фреймворках, которые проверяют, соответствует ли фактическое поведение тестируемого кода ожидаемому. Они являются основным механизмом валидации в автоматизированных тестах.

Роль:

  • Автоматическая проверка: Заменяют визуальную проверку результатов.
  • Документирование ожиданий: Читаемый код теста показывает, что именно проверяется.
  • Формирование отчёта: При неудаче assert генерирует понятное сообщение об ошибке, указывая на расхождение.

Пример с JUnit 5:

import static org.junit.jupiter.api.Assertions.*;

@Test
void testAddition() {
    Calculator calc = new Calculator();
    int actualResult = calc.add(2, 3);

    // Основное утверждение: проверка равенства ожидаемого и фактического
    assertEquals(5, actualResult, "2 + 3 должно равняться 5");
}

@Test
void testListIsNotEmpty() {
    List<String> items = service.getItems();
    assertFalse(items.isEmpty(), "Список items не должен быть пустым");
}

Распространённые типы утверждений:

  • Проверка равенства: assertEquals(expected, actual), assertNotEquals()
  • Проверка условий: assertTrue(condition), assertFalse(condition)
  • Проверка на null: assertNull(object), assertNotNull(object)
  • Проверка ссылок: assertSame(expected, actual) (тот же объект), assertNotSame()
  • Проверка исключений: assertThrows(ExpectedException.class, () -> code)
  • Групповые проверки: assertAll() — выполняет несколько утверждений, даже если некоторые падают.

Почему это важно: Без утверждений тест не может автоматически определить успешность или провал. Они превращают код из простого исполнителя в самодостаточный критерий корректности.