Загрузка…
Загрузка…
Юнит-тест в Go тестирует небольшую изолированную единицу поведения (функцию/метод) с четкими входными данными и ожидаемым результатом. Сила подхода – в детерминированности, скорости и прозрачности причин падения.
Одно поведение — одно тестовое намерение.
Изоляция от внешних систем (БД, сети, времени, файловой системы).
Детерминизм: одни и те же условия должны давать один и тот же результат.
Читаемость и диагностичность сообщений об ошибках.
Файл *_test.go.
Просмотр функций func TestXxx(t *testing.T).
Упорядочить → Действовать → Утвердить шаблон.
Для нескольких случаев — табличные тесты.
Позитивные сценарии (счастливый путь).
Негативные скрипты и баги.
Пограничные случаи (пустые данные, нули, большие значения, неправильный ввод).
Инварианты, которые нельзя нарушать ни при каких обстоятельствах.
Стандартный пакет testing.
go test ./... для обычного запуска.
-race для параллельных путей кода.
При необходимости - testify (утверждать/требовать), но без лишней магии.
Тесты, зависящие от времени/сети/порядка выполнения.
Проверка только "без паники", без содержательных утверждений.
Слишком большие интеграционные скрипты, замаскированные под модульные тесты.
Написание модульных тестов на Go означает разработку проверяемого поведения: минимальный объем, четкий контракт, изоляция от внешнего мира и надежные утверждения. Этот подход обеспечивает быструю и стабильную защиту от регрессии.
func TestSum(t *testing.T) {
tests := []struct {
name string
a, b int
want int
}{
{"pos", 2, 3, 5},
{"zero", 0, 7, 7},
}
for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
got := Sum(tc.a, tc.b)
if got != tc.want {
t.Fatalf("got %d, want %d", got, tc.want)
}
})
}
}Юнит-тест в Go тестирует небольшую изолированную единицу поведения (функцию/метод) с четкими входными данными и ожидаемым результатом.
