Чем юнит-тесты отличаются от интеграционных тестов?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Юнит-тесты проверяют маленький изолированный кусок кода, обычно одну функцию или метод, и не зависят от внешних систем. Интеграционные тесты проверяют, как несколько компонентов работают вместе, часто уже с БД, сетью или файловой системой. Важно показать понимание, что у них разные цели: скорость и локализация ошибки у юнит-тестов, а у интеграционных — проверка связки компонентов.
Определение:
Юнит-тест — это тест для минимальной единицы логики в изоляции. Он должен быстро выполняться и проверять только поведение конкретного участка кода без реальных зависимостей.
Интеграционный тест проверяет взаимодействие между несколькими частями системы. Он ближе к реальному сценарию работы приложения и может использовать настоящие или близкие к настоящим зависимости.
Пример использования:
Допустим, есть функция, которая рассчитывает скидку.
- Юнит-тест проверяет, что при входных данных
1000и скидке10%функция вернёт900. - Интеграционный тест проверяет, что заказ создаётся в сервисе, сохраняется в базу и затем корректно читается обратно.
package pricing
import "testing"
func Discount(price int, percent int) int {
return price - price*percent/100
}
func TestDiscount(t *testing.T) {
got := Discount(1000, 10)
want := 900
if got != want {
t.Fatalf("got %d, want %d", got, want)
}
}
Пояснение кода:
В примере тестируется одна чистая функция Discount. Это юнит-тест, потому что он не обращается к базе, сети или другим сервисам.
Шаги такие:
- Вызывается функция с конкретными входными данными.
- Получается фактический результат
got. - Сравнивается с ожидаемым значением
want. - Если значения не совпали, тест падает через
t.Fatalf.
Если бы это был интеграционный тест, код был бы сложнее: пришлось бы поднять зависимость, например тестовую БД, выполнить сохранение данных и проверить цепочку целиком. Код не требуется для объяснения самого различия, потому что здесь важнее понять уровень проверки и состав зависимостей.
Ключевые моменты:
- Юнит-тесты проверяют логику в изоляции.
- Интеграционные тесты проверяют взаимодействие между компонентами.
- Юнит-тесты обычно быстрее и проще в отладке.
- Интеграционные тесты медленнее, но лучше ловят проблемы на стыке модулей.
- Юнит-тесты чаще используют моки или заглушки, чтобы убрать внешние зависимости.
- Хорошая тестовая стратегия обычно сочетает оба типа тестов.