Если вам нравится читать статьи на 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 вы можете легко определить различные тестовые конфигурации для вашего проекта.