0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: go, golang, black box-тестирование, тесты, go test</p>
1
<p>Теги: go, golang, black box-тестирование, тесты, go test</p>
2
<p>Обычно тесты находятся на одном уровне с тестируемым кодом, таким образом получая доступ к деталям имплементации. Однако<strong>go test</strong>поддерживает модули с суффиксом "_test", которые собираются в отдельный пакет.</p>
2
<p>Обычно тесты находятся на одном уровне с тестируемым кодом, таким образом получая доступ к деталям имплементации. Однако<strong>go test</strong>поддерживает модули с суффиксом "_test", которые собираются в отдельный пакет.</p>
3
<p>Пример:</p>
3
<p>Пример:</p>
4
// 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) } }<p>Единственный сценарий, оправдывающий dot-import (. "bitbucket.org/splice/blog/example") - как раз black box-тестирование, во всех остальных случаях его следует избегать.</p>
4
// 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) } }<p>Единственный сценарий, оправдывающий dot-import (. "bitbucket.org/splice/blog/example") - как раз black box-тестирование, во всех остальных случаях его следует избегать.</p>
5
<h2>Пропуск тестов</h2>
5
<h2>Пропуск тестов</h2>
6
<p>Некоторые тесты должны проходить только в определённых контекстах, например, при наличии в системе внешней утилиты, переменной окружения, файла и пр. Пропустить тесты при невыполнении этих условий можно следующим образом:</p>
6
<p>Некоторые тесты должны проходить только в определённых контекстах, например, при наличии в системе внешней утилиты, переменной окружения, файла и пр. Пропустить тесты при невыполнении этих условий можно следующим образом:</p>
7
func TestSomeProtectedResource(t *testing.T) { if os.Getenv("SOME_ACCESS_TOKEN") == "" { t.Skip("skipping test; $SOME_ACCESS_TOKEN not set") } // ... the actual test }<p>Если тесты запущены с ключом<strong>-v</strong>, о пропуске теста будет упомянуто:</p>
7
func TestSomeProtectedResource(t *testing.T) { if os.Getenv("SOME_ACCESS_TOKEN") == "" { t.Skip("skipping test; $SOME_ACCESS_TOKEN not set") } // ... the actual test }<p>Если тесты запущены с ключом<strong>-v</strong>, о пропуске теста будет упомянуто:</p>
8
=== RUN TestSomeProtectedResource --- SKIP: TestSomeProtectedResource (0.00 seconds) example_test.go:17: skipping test; $SOME_ACCESS_TOKEN not set<p>Вместе с ключом пропуска тестов часто используется флаг<strong>-short</strong>, наличие которого можно проверить функцией testing.Short(), которая возвращает true, когда флаг выставлен (аналогично testing.Verbose() для<strong>-v</strong>, который увеличивает количество отладочной информации).</p>
8
=== RUN TestSomeProtectedResource --- SKIP: TestSomeProtectedResource (0.00 seconds) example_test.go:17: skipping test; $SOME_ACCESS_TOKEN not set<p>Вместе с ключом пропуска тестов часто используется флаг<strong>-short</strong>, наличие которого можно проверить функцией testing.Short(), которая возвращает true, когда флаг выставлен (аналогично testing.Verbose() для<strong>-v</strong>, который увеличивает количество отладочной информации).</p>
9
<p>Когда заранее известно, что прохождение тестов займёт некоторое время, и вы торопитесь - можно использовать флаг<strong>-short</strong>и, при условии, что разработчик пакета реализовал такую возможность, долгие тесты будут пропущены. Именно это и происходит при установке из источников. Вот пример из стандартной библиотеки:</p>
9
<p>Когда заранее известно, что прохождение тестов займёт некоторое время, и вы торопитесь - можно использовать флаг<strong>-short</strong>и, при условии, что разработчик пакета реализовал такую возможность, долгие тесты будут пропущены. Именно это и происходит при установке из источников. Вот пример из стандартной библиотеки:</p>
10
func TestCountMallocs(t *testing.T) { if testing.Short() { t.Skip("skipping malloc count in short mode") } // rest of test... }<p>Помимо возможности пропустить тесты при помощи флага<strong>-short</strong>, есть флаг<strong>-timeout</strong>, который заставляет тест паниковать при превышении указанного тайм-аута.</p>
10
func TestCountMallocs(t *testing.T) { if testing.Short() { t.Skip("skipping malloc count in short mode") } // rest of test... }<p>Помимо возможности пропустить тесты при помощи флага<strong>-short</strong>, есть флаг<strong>-timeout</strong>, который заставляет тест паниковать при превышении указанного тайм-аута.</p>
11
<p>Например, команда go test -timeout 1s для следующего теста:</p>
11
<p>Например, команда go test -timeout 1s для следующего теста:</p>
12
func TestWillTimeout(t *testing.T) { time.Sleep(2 * time.Second) // pass if timeout > 2s }<p>будет паниковать:</p>
12
func TestWillTimeout(t *testing.T) { time.Sleep(2 * time.Second) // pass if timeout > 2s }<p>будет паниковать:</p>
13
=== RUN TestWillTimeout panic: test timed out after 1s<p>Можно запустить только тесты,<strong>удовлетворяющие регулярному выражению</strong>:</p>
13
=== RUN TestWillTimeout panic: test timed out after 1s<p>Можно запустить только тесты,<strong>удовлетворяющие регулярному выражению</strong>:</p>
14
go test -run TestNameRegexp<p><em>Вот и всё, жду ваших комментариев!</em></p>
14
go test -run TestNameRegexp<p><em>Вот и всё, жду ваших комментариев!</em></p>
15
15