October 27, 2021

Разделение тестов с помощью тегов сборки

В Go есть внутренний механизм для логического разделения тестов в зависимости от некоторых условий, в том числе условий на операционную систему или тип CPU. Так, например, можно отделить юнит тесты от интеграционных или от smoke тестов.

Что такое теги сборки?

Тег сборки - это комментарий в начале go-файла, который указывает компилятору, как стоит собирать этот конкретный файл.

Например, при таком теге файл будет включен в сборку только в том случае, если компиляция выполняется под линукс (GOOS=linux)

// +build linux

package mypackage
...

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

Также можно использовать оператор отрицания !. Таким образом, файл с тегом // +build !linux будет включен в сборку на всех платформах, кроме linux.

В тегах может быть несколько условий. Если условия расположены на одной строке, то они комбинируются через оператор OR. А если на нескольких строках, то через AND.

// +build linux darwin
// +build amd64

package mypackage
...

В примере выше файл будет включен в сборку только под linux/amd64 или darwin/amd64 платформы.

Разделение тестов

Через теги сборки можно разделять разные виды тестов.

Рассмотрим 2 файла тестов:
myfile_test.go:

package mypackage

import "testing"
...

myfile_integration_test.go:

// +build integration

package mypackage

import "testing"
...

В файле myfile_test.go будут расположены unit тесты, а в myfile_integration_test.go - интеграционные (более медленные).

Поэтому при запуске тестов через go test запустятся тесты только из myfile_test.go. А если нужно запустить тесты из myfile_integration_test.go, то надо добавить флаг —tags.

go test --tags=integration

Важно понимать, что при запуске go test --tags=integration так же запустятся unit тесты. Чтобы такого не произошло, надо добавить отрицание в теги сборки unit тестов.

myfile_test.go

// +build !integration

package mypackage

import "testing"
...

Итог

Есть несколько причин такого разделения тестов:

  1. Интеграционные тесты значительно медленней unit тестов, поэтому их обычно стоит запускать только после успешного запуска unit тестов
  2. Компиляция под разные платформы
  3. Smoke тесты, запускаемые на production приложение после деплоя.

Источник: https://mickey.dev/posts/go-build-tags-testing/