Обычно тесты находятся на одном уровне с тестируемым кодом, таким образом получая доступ к деталям имплементации.
Однако 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