試用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)
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
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
}
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)