Prog Academy
RU UA
QA и тестирование

Что такое модульное тестирование (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));
}
Тест на JUnit: подготовили данные, вызвали метод, сверили результат с ожидаемым.

Частые вопросы

Кто пишет модульные тесты — разработчик или тестировщик?

Как правило разработчик, вместе с кодом: только он знает внутреннее устройство модуля и может изолировать его от остальной системы. QA-инженеры отвечают за более высокие уровни — интеграционные и E2E-проверки, где система рассматривается снаружи.

Что такое моки и заглушки?

Подставные объекты, заменяющие реальные зависимости: вместо обращения к базе или платёжному сервису тест использует упрощённую замену с заранее известным ответом. Это делает тест быстрым, независимым от внешних систем и повторяемым при каждом запуске.

Какое покрытие тестами считается достаточным?

Универсального числа нет, и сама метрика обманчива: можно иметь восемьдесят процентов покрытия и не проверять ни одного важного сценария. Практичнее ориентироваться на риск — плотно закрывать сложную логику и денежные расчёты, а тривиальный код оставлять без тестов.

Что такое TDD?

Разработка через тестирование: сначала пишут падающий тест, затем минимальный код, чтобы он прошёл, затем улучшают решение. Подход дисциплинирует и улучшает структуру кода, но требует привычки и подходит не каждой задаче — особенно там, где требования ещё меняются.

Связанные термины