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

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

Ответ

Модульное тестирование (Unit Testing) — это уровень автоматизированного тестирования, направленный на проверку корректности работы отдельных, изолированных единиц (юнитов) кода, таких как функция, метод или класс.

Цели и характеристики:

  • Раннее обнаружение ошибок в логике.
  • Изоляция: Тестируемый модуль изолируется от зависимостей (баз данных, сетевых сервисов, других классов) с помощью моков (Mock) и стабов (Stub).
  • Скорость: Тесты должны выполняться быстро, чтобы их можно было запускать часто.
  • Детерминированность: Результат теста должен быть одинаковым при каждом запуске.

Пример на Java с JUnit и Mockito:

public class UserService {
    private UserRepository repository;
    public UserService(UserRepository repository) {
        this.repository = repository;
    }
    public User getUserById(Long id) {
        return repository.findById(id).orElseThrow();
    }
}

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
    @Mock
    private UserRepository userRepositoryMock;
    @InjectMocks
    private UserService userService;

    @Test
    void getUserById_ShouldReturnUser_WhenUserExists() {
        // 1. Arrange (Подготовка)
        User expectedUser = new User(1L, "John");
        when(userRepositoryMock.findById(1L)).thenReturn(Optional.of(expectedUser));

        // 2. Act (Действие)
        User actualUser = userService.getUserById(1L);

        // 3. Assert (Проверка)
        assertEquals(expectedUser, actualUser);
        verify(userRepositoryMock).findById(1L); // Проверка вызова мока
    }
}

Best Practices:

  • Один тест — одна ответственность.
  • Понятные имена тестов по шаблону [MethodUnderTest]_[Scenario]_[ExpectedResult].
  • Использование AAA-паттерна (Arrange-Act-Assert).
  • Не тестировать фреймворки, сторонние библиотеки или тривиальные геттеры/сеттеры.

Популярные инструменты: JUnit, TestNG (фреймворки), Mockito, EasyMock (мокирование).