Go имеет встроенное тестирование через пакет testing и команду go test — не требуется внешних фреймворков. Тесты находятся в файлах _test.go, и Go сильно упирает на табличные тесты, бенчмарки и хорошие инструменты как встроенные возможности.
Go имеет встроенное тестирование через пакет testing и команду go test — не требуется внешних фреймворков. Тесты находятся в файлах _test.go, и Go сильно упирает на табличные тесты, бенчмарки и хорошие инструменты как встроенные возможности.
// math.go
func Add(a, b int) int { return a + b }
// math_test.go — same package, _test.go suffix
import "testing"
func TestAdd(t *testing.T) { // Test prefix + *testing.T parameter
result := Add(2, 3)
if result != 5 {
t.Errorf("Add(2,3) = %d; want 5", result) // report failure (continues)
// t.Fatalf stops the test immediately
}
}
// run with: go test (or `go test -v` for verbose, `go test ./...` for all packages)
Функция теста начинается с Test, принимает *testing.T и сообщает об ошибках через t.Errorf/t.Fatalf. Нет никаких ключевых слов для assertions — вы проверяете условия простым if и сообщаете об ошибках (Go предпочитает этот явный стиль).
func TestAdd(t *testing.T) {
tests := []struct { // a table of test CASES
name string
a, b int
expected int
}{
{"positives", 2, 3, 5},
{"with zero", 0, 5, 5},
{"negatives", -1, -1, -2},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { // a SUBTEST per case (named, isolated)
if got := Add(tt.a, tt.b); got != tt.expected {
t.Errorf("Add(%d,%d) = %d; want %d", tt.a, tt.b, got, tt.expected)
}
})
}
}
Табличные тесты — доминирующий идиом Go — определите срез случаев, итерируйте по ним с помощью подтестов t.Run. Это делает добавление новых случаев тривиальным и дает четкие индивидуальные отчеты о результатах по каждому случаю.
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ { // the framework chooses b.N for statistical accuracy
Add(2, 3)
}
}
// go test -bench=. → reports ns/op (and -benchmem for allocations)
go test -cover # coverage percentage
go test -coverprofile=c.out # then: go tool cover -html=c.out (visual report)
go test -race # the RACE DETECTOR — finds data races (crucial for concurrency)
go test -run TestAdd # run specific tests
Флаг -race особенно важен — он обнаруживает гонки данных в параллельном коде, критический инструмент в контексте акцента Go на параллелизме.
func TestMain(m *testing.M) { // package-level setup/teardown
setup()
code := m.Run()
teardown()
os.Exit(code)
}
// t.Helper() marks a function as a test helper (better failure line reporting)
// httptest package for testing HTTP handlers; interfaces for mocking dependencies
Тестирование — встроенная, первоклассная часть Go — пакет testing и команда go test не требуют внешних фреймворков, отражая акцент Go на тестирование как базовую практику.
Понимание соглашений — существенные повседневные знания: структура файла _test.go и TestXxx(t *testing.T), явный (без assertions) стиль сообщения об ошибках, и особенно паттерн табличных тестов, который доминирует в идиоматичном Go (компактно охватывая много случаев с четким сообщением о результатах per case через подтесты).
Эдак же важны встроенные бенчмарки Go (производительность как проверяемая забота) и мощный инструментарий — анализ покрытия и особенно детектор гонок race, который находит гонки данных в параллельном коде (критично в контексте интенсивного использования параллелизма Go).
Умение писать эффективные, идиоматичные Go тесты, использовать детектор гонок и рычаги httptest/интерфейсов для тестирования реальных компонентов — отличительная черта профессиональной разработки на Go и частая тема, отражающая беглость в качестве кода.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать