Sobes.tech
Назад к вопросам
Junior
661
questionbank

Чем юнит-тесты отличаются от интеграционных тестов?

Ответ от нейросети

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. Это юнит-тест, потому что он не обращается к базе, сети или другим сервисам.

Шаги такие:

  1. Вызывается функция с конкретными входными данными.
  2. Получается фактический результат got.
  3. Сравнивается с ожидаемым значением want.
  4. Если значения не совпали, тест падает через t.Fatalf.

Если бы это был интеграционный тест, код был бы сложнее: пришлось бы поднять зависимость, например тестовую БД, выполнить сохранение данных и проверить цепочку целиком. Код не требуется для объяснения самого различия, потому что здесь важнее понять уровень проверки и состав зависимостей.

Ключевые моменты:

  • Юнит-тесты проверяют логику в изоляции.
  • Интеграционные тесты проверяют взаимодействие между компонентами.
  • Юнит-тесты обычно быстрее и проще в отладке.
  • Интеграционные тесты медленнее, но лучше ловят проблемы на стыке модулей.
  • Юнит-тесты чаще используют моки или заглушки, чтобы убрать внешние зависимости.
  • Хорошая тестовая стратегия обычно сочетает оба типа тестов.