試用go test suite

2563 ワード

試用go test suite


(金慶のコラム2020.3)
github.com/stretchr/testify/suiteは、スイート全体の開始終了時に動作を実行したり、各テスト開始終了時に動作を実行したりするテストスイート機能を提供しています.
次の2つの関数をテストする必要があるとします.
func foo() {
	fmt.Printf("foo...
") } func goo() { fmt.Printf("goo...
") }

次のテストファイルを作成します.

import (
	"fmt"
	"testing"

	"github.com/stretchr/testify/suite"
)

type _Suite struct {
	suite.Suite
}

func (s *_Suite) AfterTest(suiteName, testName string) {
	fmt.Printf("AfterTest: suiteName=%s, testName=%s
", suiteName, testName) } func (s *_Suite) BeforeTest(suiteName, testName string) { fmt.Printf("BeforeTest: suiteName=%s, testName=%s
", suiteName, testName) } func (s *_Suite) SetupSuite() { fmt.Printf("SetupSuite()...
") } func (s *_Suite) TearDownSuite() { fmt.Printf("TearDownSuite()...
") } func (s *_Suite) SetupTest() { fmt.Printf("SetupTest()...
") } func (s *_Suite) TearDownTest() { fmt.Printf("TearDownTest()...
") } func (s *_Suite) TestFoo() { foo() } func (s *_Suite) TestGoo() { goo() } // go test func TestGooFoo(t *testing.T) { suite.Run(t, new(_Suite)) }

出力は次のとおりです.
=== RUN   TestGooFoo
SetupSuite()...
=== RUN   TestGooFoo/TestFoo
SetupTest()...
BeforeTest: suiteName=_Suite, testName=TestFoo
foo...
AfterTest: suiteName=_Suite, testName=TestFoo
TearDownTest()...
=== RUN   TestGooFoo/TestGoo
SetupTest()...
BeforeTest: suiteName=_Suite, testName=TestGoo
goo...
AfterTest: suiteName=_Suite, testName=TestGoo
TearDownTest()...
TearDownSuite()...
--- PASS: TestGooFoo (0.00s)
    --- PASS: TestGooFoo/TestFoo (0.00s)
    --- PASS: TestGooFoo/TestGoo (0.00s)
PASS

SetupSuite()/TearDownSuite()は1回のみ実行され、SetupTest()/TearDownTest()/BeforeTest()/AfterTest()はキットの各テストに対して1回実行されます.
デフォルトではSuiteはassert.Assertionは、Suite定義を参照して断言を実行します.
type Suite struct {
	*assert.Assertions
	require *require.Assertions
	t       *testing.T
}

複数のアサーションを実行し、失敗した場合も他のアサーションを実行できます.
func (m *MySuite) TestAdd() {
	m.Equal(1, Add(1, 1)) // FAIL
	m.Equal(0, Add(1, 1)) // FAIL
}

requireを使用するように再ロードできます.Assertion、失敗時に実行を中断します.
type MySuite struct {
	suite.Suite
	*require.Assertions
}

func (m *MySuite) TestAdd() {
	m.Equal(1, Add(1, 1)) // FAIL and return
	m.Equal(0, Add(1, 1)) //  
}

または任意の指定:
m.Assert().Equal(1, 2)
m.Require().Equal(1, 2)