Неочевидные возможности go test
2026-03-10 01:42 Diff

Теги: go, golang, black box-тестирование, тесты, go test

Обычно тесты находятся на одном уровне с тестируемым кодом, таким образом получая доступ к деталям имплементации. Однако go test поддерживает модули с суффиксом «_test», которые собираются в отдельный пакет.

Пример:

// in example.go package example var start int func Add(n int) int { start += n return start } // in example_test.go package example_test import ( "testing" . "bitbucket.org/splice/blog/example" ) func TestAdd(t *testing.T) { got := Add(1) if got != 1 { t.Errorf("got %d, want 1", got) } }

Единственный сценарий, оправдывающий dot-import (. "bitbucket.org/splice/blog/example") — как раз black box-тестирование, во всех остальных случаях его следует избегать.

Пропуск тестов

Некоторые тесты должны проходить только в определённых контекстах, например, при наличии в системе внешней утилиты, переменной окружения, файла и пр. Пропустить тесты при невыполнении этих условий можно следующим образом:

func TestSomeProtectedResource(t *testing.T) { if os.Getenv("SOME_ACCESS_TOKEN") == "" { t.Skip("skipping test; $SOME_ACCESS_TOKEN not set") } // ... the actual test }

Если тесты запущены с ключом -v, о пропуске теста будет упомянуто:

=== RUN TestSomeProtectedResource --- SKIP: TestSomeProtectedResource (0.00 seconds) example_test.go:17: skipping test; $SOME_ACCESS_TOKEN not set

Вместе с ключом пропуска тестов часто используется флаг -short, наличие которого можно проверить функцией testing.Short(), которая возвращает true, когда флаг выставлен (аналогично testing.Verbose() для -v, который увеличивает количество отладочной информации).

Когда заранее известно, что прохождение тестов займёт некоторое время, и вы торопитесь — можно использовать флаг -short и, при условии, что разработчик пакета реализовал такую возможность, долгие тесты будут пропущены. Именно это и происходит при установке из источников. Вот пример из стандартной библиотеки:

func TestCountMallocs(t *testing.T) { if testing.Short() { t.Skip("skipping malloc count in short mode") } // rest of test... }

Помимо возможности пропустить тесты при помощи флага -short, есть флаг -timeout, который заставляет тест паниковать при превышении указанного тайм-аута.

Например, команда go test -timeout 1s для следующего теста:

func TestWillTimeout(t *testing.T) { time.Sleep(2 * time.Second) // pass if timeout > 2s }

будет паниковать:

=== RUN TestWillTimeout panic: test timed out after 1s

Можно запустить только тесты, удовлетворяющие регулярному выражению:

go test -run TestNameRegexp

Вот и всё, жду ваших комментариев!