Пропустите некоторые тесты с проверкой go

Можно ли пропустить/исключить некоторые тесты из go test?

У меня довольно большое количество тестов типа интеграции, которые вызывают службу отдыха, написанную как стандартные тесты go, и запускаются с go test. Когда разрабатывается новая функция, ее иногда полезно пропустить некоторые из тестов, например, если новая функция еще не развернута на сервере тестирования, и я все же хочу запустить все существующие тесты (кроме тех новых, которые тестируют новая функция).

Я знаю о -run, но я не хочу указывать все тесты, которые я хочу запустить, это будет длинный список. В то же время я не смог написать регулярное выражение для исключения тестов.

Другой вариант - не выполнять тесты, которые не запускаются в одной ветки, но было бы проще, если бы я мог просто указать, что исключить.

Ответы

Ответ 1

Как VonC, вы можете использовать теги +build

┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ ls
a_test.go  b_test.go  c_test.go

a_test.go:

package tags

import "testing"

func TestA(t *testing.T) {}

b_test.go:

// +build !feature1

package tags

import "testing"

func TestB(t *testing.T) {}

c_test.go:

// +build !feature1
// +build !feature2

package tags

import "testing"

func TestC(t *testing.T) {}

Затем запустите тест с параметром -tags:

┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ go test -v . | grep PASS:
--- PASS: TestA (0.00 seconds)
--- PASS: TestB (0.00 seconds)
--- PASS: TestC (0.00 seconds)
┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ go test -v -tags feature1 . | grep PASS:
--- PASS: TestA (0.00 seconds)
┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ go test -v -tags feature2 . | grep PASS:
--- PASS: TestA (0.00 seconds)
--- PASS: TestB (0.00 seconds)

//Обновление: другая логика:

a_test.go:

// +build all

package tags

import "testing"

func TestA(t *testing.T) {}

b_test.go:

// +build all feature1

package tags

import "testing"

func TestB(t *testing.T) {}

c_test.go:

// +build all feature2

package tags

import "testing"

func TestC(t *testing.T) {}


┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ go test -v -tags all | grep PASS:
--- PASS: TestA (0.00 seconds)
--- PASS: TestB (0.00 seconds)
--- PASS: TestC (0.00 seconds)
┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ go test -v -tags feature1 | grep PASS:
--- PASS: TestB (0.00 seconds)
┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ go test -v -tags="feature1 feature2" | grep PASS:
--- PASS: TestB (0.00 seconds)
--- PASS: TestC (0.00 seconds)

Или вы вызываете конкретные тесты по имени, например:

d_test.go:

package tags

import "testing"

func TestA1(t *testing.T) {}
func TestB1(t *testing.T) {}
func TestC1(t *testing.T) {}
func TestD1(t *testing.T) {}

Вывод:

┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ go test -run="(A|B)1" -v | grep PASS:
--- PASS: TestA1 (0.00 seconds)
--- PASS: TestB1 (0.00 seconds)
┌─ [email protected] [/t/tst-tag]                                                                                                      
└──➜ go test -run="D1" -v | grep PASS:
--- PASS: TestD1 (0.00 seconds)

Ответ 2

Пакет тестирования имеет SkipNow() и Skip(). Таким образом, отдельный тест может быть дополнен чем-то вроде этого:

func skipCI(t *testing.T) {
  if os.Getenv("CI") != "" {
    t.Skip("Skipping testing in CI environment")
  }
}

func TestNewFeature(t *testing.T) {
  skipCI(t)
}

Затем можно установить переменную среды или запустить CI=true go test чтобы установить CI в качестве локальной переменной команды.

Другой подход заключается в использовании короткого режима. Добавьте следующую защиту в тест

if testing.Short() {
  t.Skip("skipping testing in short mode")
}

а затем выполните свои тесты с помощью go test -short