Если вам нравится читать статьи на Medium и вы заинтересованы в том, чтобы стать участником, я буду рад поделиться с вами своей реферальной ссылкой!
В Go теги сборки (также известные как ограничения сборки) предлагают мощный способ условного включения файлов в вашу сборку. Они часто используются для включения исходных файлов для конкретной платформы в вашу сборку, но их также можно использовать в целях тестирования, чтобы включить или исключить определенные тесты из вашего тестового прогона.
Введение в теги сборки
Тег сборки — это строчный комментарий, начинающийся с //go:build
или // +build
, за которым следует список тегов, разделенных пробелом или запятой. Имейте в виду, что поскольку Go 1.17 //go:build является текущим стандартом. Вот пример:
//go:build linux,386
За тегом сборки должна следовать пустая строка. Обычно он помещается вверху вашего файла .go, прямо перед объявлением package
.
Приведенный выше тег сборки указывает, что файл .go следует включать в сборку только в том случае, если целевой операционной системой является Linux, а целевой архитектурой является 386.
Использование тегов сборки для тестирования
Теги сборки также можно использовать для целей тестирования. Например, у вас могут быть некоторые интеграционные тесты, выполнение которых занимает много времени, и вы не хотите запускать их каждый раз, когда запускаете модульные тесты.
Вы можете использовать тег сборки, чтобы классифицировать эти тесты как интеграционные:
//go:build integration package main import ( "testing" ) func TestIntegrationAdd(t *testing.T) { a := 5 b := 6 expected := 11 if result := Add(a, b); result != expected { t.Errorf("Add(%d, %d) = %d; want %d", a, b, result, expected) } }
Затем, когда вы запускаете свои тесты, вы можете использовать флаг -tags
, чтобы указать, какие теги включить в тестовый запуск:
go test -v -tags=integration
Это запустит только те тесты, которые имеют тег сборки integration
, и те, которые не имеют тега сборки.
Если вы запустите свои тесты без флага -tags
, Go исключит тесты с тегом сборки integration
.
Использование Makefile для различных тестовых конфигураций
Вы также можете использовать Makefile для определения различных тестовых конфигураций. Вот пример Makefile:
.PHONY: test unit_test integration_test test: unit_test integration_test unit_test: go test -v ./... integration_test: go test -v -tags=integration ./...
Этот Makefile определяет три цели: test
, unit_test
и integration_test
.
- Цель
unit_test
запускает все тесты, кроме тех, которые имеют тег сборкиintegration
. - Цель
integration_test
запускает только тесты с тегом сборкиintegration
. - Цель
test
работает как сunit_test
, так и сintegration_test
.
Вы можете запустить тесты следующим образом:
- Чтобы запустить все тесты:
make test
- Чтобы запустить только модульные тесты:
make unit_test
- Чтобы запустить только интеграционные тесты:
make integration_test
Однако другие файлы должны будут включать отрицательный тег, например !integration. При запуске тестов с указанными тегами сборки запускаются все тесты с этим тегом и все остальные без тега сборки. Следовательно, мы должны отрицать то, что мы хотим запустить, с помощью тега сборки.
//go:build !integration package main import ( "testing" ) func TestAdd(t *testing.T) { a := 5 b := 6 expected := 11 if result := Add(a, b); result != expected { t.Errorf("Add(%d, %d) = %d; want %d", a, b, result, expected) } }
Заключение
Теги сборки в Go предлагают мощный способ условного включения файлов в вашу сборку, и они могут быть особенно полезны для управления вашими тестами. Используя теги сборки, вы можете отделить модульные тесты от интеграционных и запускать их по отдельности или вместе по мере необходимости. В сочетании с Makefile вы можете легко определить различные тестовые конфигурации для вашего проекта.