web-dev-qa-db-ja.com

go testでいくつかのテストをスキップします

いくつかのテストをgo testで実行することからスキップ/除外することは可能ですか?

標準のgoテストとして記述されたrestサービスを呼び出し、go testで実行する統合タイプのテストがかなり大量にあります。新しい機能が開発されるとき、たとえば、テストサーバーに新しい機能がまだ展開されておらず、既存のすべてのテストを実行したい場合(テストする新しいテストを除く)新しい機能)。

私は-runについて知っていますが、実行したいすべてのテストを指定したくありません。それは長いリストになります。同時に、テストを除外するための正規表現を書くことができませんでした。

別のオプションは、同じブランチで実行されないテストをコミットしないことですが、除外するものを指定する方が簡単です。

40
viblo

VonC のように、+buildタグを使用できます

┌─ oneofone@Oa [/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パラメーターを使用してテストを実行します。

┌─ oneofone@Oa [/t/tst-tag]                                                                                                      
└──➜ go test -v . | grep PASS:
--- PASS: TestA (0.00 seconds)
--- PASS: TestB (0.00 seconds)
--- PASS: TestC (0.00 seconds)
┌─ oneofone@Oa [/t/tst-tag]                                                                                                      
└──➜ go test -v -tags feature1 . | grep PASS:
--- PASS: TestA (0.00 seconds)
┌─ oneofone@Oa [/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) {}


┌─ oneofone@Oa [/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)
┌─ oneofone@Oa [/t/tst-tag]                                                                                                      
└──➜ go test -v -tags feature1 | grep PASS:
--- PASS: TestB (0.00 seconds)
┌─ oneofone@Oa [/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) {}

出力:

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

テストパッケージ には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を使用してテストを実行します

31
Vadym Tyemirov