Как запустить контрольные примеры в указанном файле?

205

Мои тестовые наборы пакетов разбросаны по нескольким файлам, если я запускаю, go test <package_name>он запускает все тестовые наборы в пакете.

Нет необходимости запускать все из них, хотя. Есть ли способ указать файл для go testзапуска, чтобы он запускал только тестовые наборы, определенные в файле?


источник

Ответы:

327

Есть два способа. Самый простой - использовать -runфлаг и предоставить шаблон, соответствующий названиям тестов, которые вы хотите запустить.

Пример:

$ go test -run NameOfTest

Смотрите документы для получения дополнительной информации.

Другой способ - назвать конкретный файл, содержащий тесты, которые вы хотите запустить:

$ go test foo_test.go

Но есть подвох. Это хорошо работает, если:

  • foo.goнаходится в package foo.
  • foo_test.goнаходится в package foo_testи импортирует 'Foo'.

Если foo_test.goи foo.goсовпадают пакеты (общий случай), то вы должны назвать все остальные файлы, необходимые для сборки foo_test. В этом примере это будет:

$ go test foo_test.go foo.go

Я бы рекомендовал использовать -runшаблон. Или, где / когда это возможно, всегда запускайте все тесты пакетов.

ZZZZ
источник
1
Не могли бы вы остановиться на первом (простом) пути, -runпожалуйста? Я не могу найти ручную ссылку на это.
1
Вы также можете найти информацию об этом сgo help testflag
Джеффри Мартинес
Когда я использую команду, go test utils.go utils_test.goвывод ok command-line-arguments 0.002s. Он не запускает тест. Причина, по которой я хочу использовать этот тестовый режим, заключается в том, что пакет содержит много файлов, и они еще не компилируются, за исключением утилит. Поэтому я хотел бы завершить использование утилит перед работой над другими файлами. Как я могу это сделать ?
chmike
Если вы хотите увидеть, что записывается при тестировании, стоит упомянуть -vфлаг (подробный). Из документов-v Verbose output: log all tests as they are run. Also print all text from Log and Logf calls even if the test succeeds.
robstarbuck
121

Ответ @ zzzz в основном полный, но просто для того, чтобы избавить других от необходимости копаться в ссылочной документации, вы можете запустить один тест в пакете следующим образом:

go test packageName -run TestName

Обратите внимание, что вы хотите передать имя теста, а не имя файла, в котором существует тест.

-runФлаг на самом деле принимает регулярное выражение , так что вы можете ограничить испытательный пробег к классу тестов. Из документов:

-run regexp
    Run only those tests and examples matching the regular
    expression.
TomDotTom
источник
28
Стоит отметить, что имя пакета - это полное имя пакета, например, «github.com/you/stuff/a/b/c»
garbagecollector
1.9.3 также принимает относительный путь пакета.
2
Не знаю почему, но по какой-то причине я должен указать «./» перед названием пакета
Roozbeh Zabihollahi
12

При выполнении одного теста я обычно делаю:

go test -run TestSomethingReallyCool ./folder1/folder2/ -v -count 1

-count 1также гарантирует, что тест выполняется каждый раз вместо кэширования. Полезно, когда вы проводите тестирование в условиях гонки и у вас есть тест, который иногда дает сбой. В версиях Go, не использующих модули, то же самое можно было бы достичь путем настройки, GOCACHE=offно это плохо взаимодействует с модулями Go.

Франческо Касула
источник
6

в плагине intelliJ IDEA go-lang (и я полагаю, в jetbrains Gogland) вы можете просто установить вид теста в файл при запуске> редактировать конфигурации

снимок экрана создать тестовый файл

Роберт Кинг
источник
2
В Gogland вы можете просто щелкнуть правой кнопкой мыши по тестовому файлу и выбрать «run foo_test.go», он соберет пакет с тестами, а затем передаст регулярное выражение, содержащее имена всех тестов в этом тестовом файле, в флаг -run. Действительно полезная функция.
Eloff
4
alias testcases="sed -n 's/func.*\(Test.*\)(.*/\1/p' | xargs | sed 's/ /|/g'"

go test -v -run $(cat coordinator_test.go | testcases)
user2865442
источник
2
go test -v ./<package_name> -run Test

Предотвращает кеширование результатов теста.

go test -count=1 ./<package_name> -run Test
вычеркивать знак
источник
0
go test -v -timeout 30s <path_to_package> -run ^(TestFuncRegEx)
  • TestFunc должен быть внутри goтестового файла в этом пакете
  • Мы можем предоставить регулярное выражение для сопоставления с набором тестовых случаев или просто функцию точного тестового случая для запуска одного тестового случая. Например-run TestCaseFunc
Абхишек Шривастава
источник