Что такое модульное тестирование (unit-тесты)?
Модульное тестирование — проверка отдельной небольшой части кода — функции или класса — в изоляции от остальной системы. Такой тест не обращается к базе данных и внешним сервисам: вместо них подставляют заглушки.
Unit-тесты — самый быстрый и дешёвый уровень проверки. Они выполняются за миллисекунды, запускаются сотнями при каждой сборке и точно указывают место поломки: упавший тест сразу называет конкретную функцию.
Пишет их обычно сам разработчик. Помимо защиты от ошибок, они дают свободу рефакторинга: код можно переписывать, зная, что нарушение поведения будет замечено сразу.
Где применяется
Модульные тесты пишет сам разработчик, обычно вместе с кодом функции. Их запускают локально перед отправкой изменений и автоматически в конвейере CI — прогон сотен таких тестов занимает секунды, поэтому они и служат первой линией защиты от поломок.
Покрывают ими прежде всего логику, где легко ошибиться: расчёт цены со скидками и налогами, валидацию данных, обработку дат и валют, граничные условия. Сетевые вызовы и обращения к базе при этом подменяют заглушками — иначе тест перестаёт быть модульным и становится медленным.
Пример
Функция считает стоимость заказа со скидкой. Тесты закрывают обычный случай, нулевую сумму, скидку в сто процентов и отрицательное количество. Любая будущая правка формулы моментально покажет, какое из этих условий перестало выполняться.
@Test
void appliesPercentDiscount() {
Order order = new Order(new BigDecimal("1000"));
BigDecimal total = pricing.applyDiscount(order, 15);
assertEquals(new BigDecimal("850"), total);
}
@Test
void rejectsNegativeDiscount() {
Order order = new Order(new BigDecimal("1000"));
assertThrows(IllegalArgumentException.class,
() -> pricing.applyDiscount(order, -5));
} Частые вопросы
Кто пишет модульные тесты — разработчик или тестировщик?
Как правило разработчик, вместе с кодом: только он знает внутреннее устройство модуля и может изолировать его от остальной системы. QA-инженеры отвечают за более высокие уровни — интеграционные и E2E-проверки, где система рассматривается снаружи.
Что такое моки и заглушки?
Подставные объекты, заменяющие реальные зависимости: вместо обращения к базе или платёжному сервису тест использует упрощённую замену с заранее известным ответом. Это делает тест быстрым, независимым от внешних систем и повторяемым при каждом запуске.
Какое покрытие тестами считается достаточным?
Универсального числа нет, и сама метрика обманчива: можно иметь восемьдесят процентов покрытия и не проверять ни одного важного сценария. Практичнее ориентироваться на риск — плотно закрывать сложную логику и денежные расчёты, а тривиальный код оставлять без тестов.
Что такое TDD?
Разработка через тестирование: сначала пишут падающий тест, затем минимальный код, чтобы он прошёл, затем улучшают решение. Подход дисциплинирует и улучшает структуру кода, но требует привычки и подходит не каждой задаче — особенно там, где требования ещё меняются.