Тестирование

15 вопросов

Встроенная система тестирования Go: пакет testing, файлы _test.go, бенчмарки, параллельные тесты. Всё работает из коробки без внешних фреймворков.

1 Какой пакет используется для тестирования в Go? 🟢 Лёгкий
Ответ: B) testing

Пакет testing - стандартный для юнит-тестов, бенчмарков и примеров. Запуск: go test. Go не использует внешние фреймворки - всё встроено в стандартную библиотеку.

Подробнее →
2 Как должна начинаться тестовая функция? 🟢 Лёгкий
Ответ: B) Test*(t *testing.T)

Тестовые функции начинаются с Test, принимают *testing.T. Пример: func TestAdd(t *testing.T). Бенчмарки начинаются с Benchmark, фаззинг - с Fuzz.

Подробнее →
3 Какое расширение у файлов с тестами? 🟢 Лёгкий
Ответ: B) _test.go

Файлы *_test.go исключаются из обычной сборки и компилируются только при go test. Это позволяет держать тесты рядом с кодом без увеличения размера бинарника.

Подробнее →
4 Какой паттерн тестирования наиболее идиоматичен в Go? 🟢 Лёгкий
Ответ: B) Table-driven tests (табличные тесты)

Table-driven tests: массив структур с входными данными и ожидаемым результатом + цикл с t.Run(name, func). Легко добавить новый кейс, чётко видны все сценарии, удобный вывод. Это стандарт в Go-сообществе и стандартной библиотеке.

Подробнее →
5 Что делает флаг -race при запуске go test -race? 🟢 Лёгкий
Ответ: B) Включает детектор гонок данных (data race detector)

Race detector инструментирует код и при выполнении обнаруживает одновременный несинхронизированный доступ к памяти. Замедляет в 2-20 раз. Рекомендуется в CI. Находит только гонки, которые реально произошли при выполнении - не статический анализ.

Подробнее →
6 Как запустить бенчмарк в Go? 🟢 Лёгкий
Ответ: B) go test -bench=.

go test -bench=. запускает все BenchmarkXxx(b *testing.B). Тело выполняется b.N раз (Go подбирает N). -benchmem показывает аллокации. -count=5 запускает несколько раз для статистики. benchstat сравнивает результаты до и после оптимизации.

Подробнее →
7 Что такое fuzz-тестирование в Go 1.18+? 🟢 Лёгкий
Ответ: B) Автоматическая генерация случайных входных данных для поиска паник, ошибок и неожиданного поведения

Фаззинг автоматически генерирует случайные входные данные и ищет входы, вызывающие панику или ошибку. Встроен в Go с версии 1.18.

Подробнее →
8 Что делает t.Parallel()? 🟡 Средний
Ответ: B) Разрешает параллельное выполнение теста

t.Parallel() в начале теста разрешает запускать его параллельно с другими "параллельными" тестами. По умолчанию тесты выполняются последовательно. Полезно для ускорения.

Подробнее →
9 Что такое benchmark в Go? 🟡 Средний
Ответ: B) Тест производительности (Benchmark*)

Бенчмарки измеряют производительность. func BenchmarkX(b *testing.B) { for i := 0; i < b.N; i++ { ... } }. Запуск: go test -bench=. Go автоматически подбирает b.N.

Подробнее →
10 Как запустить только один конкретный тест? 🟡 Средний
Ответ: B) go test -run=X

Флаг -run принимает регулярное выражение. go test -run=TestAdd запустит только тесты, чьё имя совпадает с паттерном. Можно уточнять подтесты: -run=TestAdd/negative.

Подробнее →
11 Что делает вызов t.Helper() в тестовой функции? 🟡 Средний
Ответ: B) Помечает функцию как хелпер - ошибки покажут строку вызова

t.Helper() помечает функцию как вспомогательную. При вызове t.Error() или t.Fatal() в такой функции, в выводе будет показана строка вызывающего кода, а не строка внутри хелпера. Это делает сообщения об ошибках более полезными.

Подробнее →
12 Что такое testing.TB? 🟡 Средний
Ответ: B) Общий интерфейс для *testing.T и *testing.B

testing.TB - интерфейс, реализуемый и *testing.T (тесты), и *testing.B (бенчмарки). Позволяет писать хелперы, работающие и в тестах, и в бенчмарках: func setup(tb testing.TB) { tb.Helper(); ... }. Включает методы Error, Fatal, Log, Helper, Cleanup.

Подробнее →
13 Для чего используется пакет net/http/pprof? 🟡 Средний
Ответ: B) Для профилирования приложения в runtime (CPU, память, горутины)

net/http/pprof встраивает профайлер в HTTP-сервер. Эндпоинты: /debug/pprof/profile (CPU), /debug/pprof/heap (память), /debug/pprof/goroutine. go tool pprof визуализирует. Overhead минимален - можно использовать в production.

Подробнее →
14 Как объявить и запустить fuzz-тест в Go? 🟡 Средний
Ответ: B) func FuzzXxx(f *testing.F) с f.Add() и f.Fuzz(); запуск go test -fuzz FuzzXxx

Fuzz-тесты: FuzzXxx(f *testing.F), f.Add() задает seed-корпус, f.Fuzz() запускает генерацию. Запуск: go test -fuzz=FuzzXxx.

Подробнее →
15 Что произойдёт, если определить func TestMain(m *testing.M), но не вызвать m.Run()? 🔴 Сложный
Ответ: B) Ни один тест не выполнится

TestMain позволяет выполнить setup/teardown для всего пакета тестов. Если TestMain определена, go test вызывает её вместо автоматического запуска тестов. Без вызова m.Run() ни один Test* не выполнится. Паттерн: setup, code := m.Run(), teardown, os.Exit(code).

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.