0Pricing
Go Academy · Урок

Написание модульных тестов с 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_test

go 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 — локальная установка не требуется.

Все уроки этого курса

  1. Написание модульных тестов с testing
  2. Тесты на основе таблиц
  3. Тестовые двойники: имитации и заглушки
  4. Покрытие тестами и testify
← Назад к Go Academy