Ответ
Модульное тестирование (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 (мокирование).