Написание модульных тестов с testing
Функции TestXxx, t.Error, t.Fatal и t.Helper
«Написание модульных тестов с testing» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Пакет testing
Встроенный пакет Go testing предоставляет всё необходимое для модульных тестов: функции тестов, сообщения о сбоях и исполняемые файлы тестов. Внешняя платформа не требуется.
Сигнатура функции теста
Имена функций тестов должны начинаться с Test, принимать *testing.T и находиться в файлах, оканчивающихся на _test.go.
func TestAdd(t *testing.T) {
got := Add(2, 3)
if got != 5 {
t.Errorf("Add(2,3) = %d; want 5", got)
}
}t.Error и t.Fatal
t.Error отмечает сбой и продолжает выполнение; t.Fatal отмечает сбой и немедленно останавливает текущий тест. Используйте Fatal, если последующие проверки зависят от неудачной проверки.
Запуск тестов
Запустите все тесты: go test ./.... Запустите конкретный тест: go test -run TestAdd. Добавьте -v для подробного вывода.
go test -v -run TestAdd ./...t.Helper
Помечайте вспомогательные функции проверок вызовом t.Helper(), чтобы в сообщениях об ошибках указывалась строка вызывающего кода, а не вспомогательной функции.
func assertEqual(t *testing.T, got, want int) {
t.Helper()
if got != want {
t.Errorf("got %d; want %d", got, want)
}
}TestMain
TestMain(m *testing.M) — необязательная точка входа для настройки и очистки до и после запуска всего набора тестов, например для запуска тестовой базы данных.
func TestMain(m *testing.M) {
setup()
code := m.Run()
teardown()
os.Exit(code)
}Подтесты с t.Run
Группируйте связанные сценарии с помощью t.Run. Каждый подтест выполняется независимо, и его можно запустить отдельно с помощью -run TestFoo/SubcaseName.
func TestMath(t *testing.T) {
t.Run("addition", func(t *testing.T) { /* ... */ })
t.Run("subtraction", func(t *testing.T) { /* ... */ })
}Структура файлов тестов
Тесты в том же пакете могут обращаться к неэкспортируемым идентификаторам. Тесты в пакете _test (тесты «чёрного ящика») могут обращаться только к экспортируемым идентификаторам.
// white-box: package mylib
// black-box: package mylib_testgo test -cover
Измеряйте покрытие кода с помощью go test -cover. Для подробного HTML-отчёта: go test -coverprofile=c.out ./... && go tool cover -html=c.out.
Тестирование с интерфейсами
Проектируйте код на основе интерфейсов, чтобы в тестах можно было передавать поддельные реализации вместо запуска настоящих сервисов.
t.Parallel
Вызовите t.Parallel() в начале теста, чтобы отметить его как безопасный для одновременного выполнения с другими параллельными тестами и ускорить набор тестов.
func TestRead(t *testing.T) {
t.Parallel()
// ...
}Быстрая проверка
В чём разница между t.Error и t.Fatal?
Итоги: модульное тестирование с testing
Основные положения:
- Функции тестов: TestXxx(t *testing.T) в файлах _test.go
- t.Error продолжает выполнение; t.Fatal останавливает тест
- t.Helper() обеспечивает корректные номера строк ошибок во вспомогательных функциях
- t.Run используется для подтестов; t.Parallel — для параллельных тестов
Часто задаваемые вопросы
Урок «Написание модульных тестов с testing» бесплатный?
Да — полный текст урока «Написание модульных тестов с testing» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Написание модульных тестов с testing»?
Функции TestXxx, t.Error, t.Fatal и t.Helper Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Написание модульных тестов с testing»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Написание модульных тестов с testing
- Тесты на основе таблиц
- Тестовые двойники: имитации и заглушки
- Покрытие тестами и testify