ããã¯ããªã«ãããããŠæžãããã®ïŒ
Goã«ããããã¢ãµãŒã·ã§ã³ãªã©ã®æ©èœãæäŸããtestifyãšããã©ã€ãã©ãªãããã®ãç¥ããŸããŠã
ãã¡ããå°ãè©ŠããŠãããããªããšã
testify
testifyã¯ã以äžã®æ©èœãæäŸããã©ã€ãã©ãªã§ãã
- ã¢ãµãŒã·ã§ã³
- ã¢ãã¯
- ãã¹ãã¹ã€ãŒãåãã®æ©èœ
testing
ããã±ãŒãžã䜿ããgo test
ã§ãã¹ãããããšããã®ã¯éåžžã®Goã®ãã¹ããšå€ãããŸããã
testing - The Go Programming Language
APIããã¥ã¡ã³ãã¯ãã¡ãã
ä»åã¯ãã¢ãµãŒã·ã§ã³ãšãã¹ãã¹ã€ãŒãåãã®æ©èœãè©ŠããŠãããããšæããŸãã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
$ go version go version go1.15.6 linux/amd64
ã¢ãžã¥ãŒã«ã®äœæã
$ go mod init testify-assert-example go: creating new go.mod: module testify-assert-example
testifyã¯ã1.6.1ã䜿ããŸãã
go.mod
module testify-assert-example go 1.15 require github.com/stretchr/testify v1.6.1
go.sum
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
ãé¡
ã¢ãµãŒã·ã§ã³ã¯ãã£ãããªæ°ãããã®ã§ããããã²ãšã€ã²ãšã€è©ŠããŠãããããªããšã¯ããŸãããã©ã¡ãããšãããšã
ã©ã€ãã©ãªã®äœ¿ãæ¹ã®é°å²æ°ãå
šäœæãææ¡ããããªããšã
ãšããããã§ããã¹ã察象ã®ãœãŒã¹ã³ãŒãã¯ããã ãã«ããŸãã
calc.go
package main func Plus(a int, b int) int { return a + b }
assertããã±ãŒãž
ãŸãã¯ãã¢ãµãŒã·ã§ã³ããã§ããtestifyã®assertãšããããã±ãŒãžã䜿ããŸãã
assertããã±ãŒãžã¯ã以äžã®æ©èœãæã¡ãŸãã
- ç°¡åã«äœ¿ããã¢ãµãŒã·ã§ã³
- ã¢ãµãŒã·ã§ã³ã®å€±ææã«ãããããããã¡ãã»ãŒãžã衚瀺ãã
- ä»»æã®ã«ã¹ã¿ã ã¡ãã»ãŒãžãè¿œå å¯èœ
assertããã±ãŒãžã䜿ã£ããã¹ãã³ãŒãã¯ããããªæãã§äœæããŸããã
calc_test.go
package main import ( "github.com/stretchr/testify/assert" "testing" ) func TestPlusSimply(t *testing.T) { result := Plus(1, 3) expect := 4 assert.Equal(t, expect, result) } func TestPlusAssertFailContinue(t *testing.T) { result1 := Plus(1, 3) expect1 := 4 assert.Equal(t, expect1, result1) result2 := Plus(1, 3) badExpect2 := 5 // miss assert.Equal(t, badExpect2, result2) result3 := Plus(3, 5) expect3 := 8 assert.Equal(t, expect3, result3, "not equal") result4 := Plus(3, 5) badExpect4 := 9 // miss assert.Equal(t, badExpect4, result4, "not equal") } func TestPlusFormat(t *testing.T) { result1 := Plus(1, 3) expect1 := 4 assert.Equalf(t, expect1, result1, "not equal, collect = %d", expect1) result2 := Plus(1, 3) badExpect2 := 5 // miss assert.Equalf(t, badExpect2, result2, "not equal, collect = %d", 4) result3 := Plus(3, 5) expect3 := 8 assert.Equalf(t, expect3, result3, "not equal, collect = %d", expect3) result4 := Plus(3, 5) badExpect4 := 9 // miss assert.Equalf(t, badExpect4, result4, "not equal, collect = %d", 8) }
説æããŠãããŸãã
æäœéãtesting
ãštestify/assert
ã®2ã€ãå¿
èŠã§ãã
import ( "github.com/stretchr/testify/assert" "testing" )
䜿ãæ¹ãšããŠã¯ãassert.[䜿ãããã¢ãµãŒã·ã§ã³é¢æ°]
ãšãªããŸãã
func TestPlusSimply(t *testing.T) { result := Plus(1, 3) expect := 4 assert.Equal(t, expect, result) }
æåã®åŒæ°ã«testing
ã®T
ãããšã¯æåŸ
å€ãå®éã®å€ãšããé ã§æžããŠãããŸãã
ä»å䜿ã£ãŠããã®ã¯ãæåŸ
å€ãšå®éã®å€ãçããããšã確èªããEqual
ã§ããã
ã¡ãªã¿ã«ãæ»ãå€ãšããŠã¯bool
ãè¿ã£ãŠããŸãâŠã
4çªç®ã®åŒæ°ãšããŠã«ã¹ã¿ã ã¡ãã»ãŒãžãå
¥ãããšã倱ææã«ã¡ãã»ãŒãžãå
¥ããããšãã§ããŸãã
以äžã§ã¯ãåŸãã®2ã€ã«ã¡ãã»ãŒãžãå
¥ããŸããã
func TestPlusAssertFailContinue(t *testing.T) { result1 := Plus(1, 3) expect1 := 4 assert.Equal(t, expect1, result1) result2 := Plus(1, 3) badExpect2 := 5 // miss assert.Equal(t, badExpect2, result2) result3 := Plus(3, 5) expect3 := 8 assert.Equal(t, expect3, result3, "not equal") result4 := Plus(3, 5) badExpect4 := 9 // miss assert.Equal(t, badExpect4, result4, "not equal") }
ãã®ãã¹ãã§ã¯ãæå³çã«å€±æãããã¹ããæžããŠããŸãããã¹ããå®è¡ãããšããããªæãã«ãªããŸãã
$ go test --- FAIL: TestPlusAssertFailContinue (0.00s) --- FAIL: TestPlusAssertFailContinue (0.00s) calc_test.go:24: Error Trace: calc_test.go:24 Error: Not equal: expected: 5 actual : 4 Test: TestPlusAssertFailContinue calc_test.go:34: Error Trace: calc_test.go:34 Error: Not equal: expected: 9 actual : 8 Test: TestPlusAssertFailContinue Messages: not equal
ã«ã¹ã¿ã ã¡ãã»ãŒãžãæå®ããæ¹ã«ã¯ãMessages
ãšããé
ç®ãè¿œå ãããŸãã
ãããããèŠãããããããã«ã-v
ãä»ããªããŠãååã«æ
å ±ãåºãŸãã
-v
ãä»ãããšããããªæãã«ãªããŸãã
=== RUN TestPlusAssertFailContinue calc_test.go:24: Error Trace: calc_test.go:24 Error: Not equal: expected: 5 actual : 4 Test: TestPlusAssertFailContinue calc_test.go:34: Error Trace: calc_test.go:34 Error: Not equal: expected: 9 actual : 8 Test: TestPlusAssertFailContinue Messages: not equal --- FAIL: TestPlusAssertFailContinue (0.00s)
ãã®æç¹ã§ããããŸãããassertã䜿ã£ãŠã¢ãµãŒã·ã§ã³ã«å€±æããå Žåããã¹ãã«ã¯å€±æããŸãããã¹ãèªäœã¯ç¶è¡ããŸãã
testing
ã®Error
ã®æåã§ããã
å®éãassertããã±ãŒãžã®åé¢æ°ã¯Error
ã䜿ã£ãŠäœæãããŠããŸãã
https://github.com/stretchr/testify/blob/v1.6.1/assert/assertions.go#L240-L265
ãŸããæ«å°Ÿãf
ã®æ¹ã®é¢æ°ã䜿ããšãã«ã¹ã¿ã ã¡ãã»ãŒãžã®ãã©ãŒããããæå®ã§ããããšã«ãªã£ãŠããŸãã
func TestPlusFormat(t *testing.T) { result1 := Plus(1, 3) expect1 := 4 assert.Equalf(t, expect1, result1, "not equal, collect = %d", expect1) result2 := Plus(1, 3) badExpect2 := 5 // miss assert.Equalf(t, badExpect2, result2, "not equal, collect = %d", 4) result3 := Plus(3, 5) expect3 := 8 assert.Equalf(t, expect3, result3, "not equal, collect = %d", expect3) result4 := Plus(3, 5) badExpect4 := 9 // miss assert.Equalf(t, badExpect4, result4, "not equal, collect = %d", 8) }
å®è¡çµæã
--- FAIL: TestPlusFormat (0.00s) calc_test.go:46: Error Trace: calc_test.go:46 Error: Not equal: expected: 5 actual : 4 Test: TestPlusFormat Messages: not equal, collect = 4 calc_test.go:56: Error Trace: calc_test.go:56 Error: Not equal: expected: 9 actual : 8 Test: TestPlusFormat Messages: not equal, collect = 8
ãªãã§ãããf
ãªãã®ã¢ãµãŒã·ã§ã³é¢æ°ã§ãããã©ãŒãããã¯äœ¿ããã£ãœãã§ããâŠïŒ
æçµçã«ã¯ãfmt#Sprintf
ã䜿ãããããã§ããã
https://github.com/stretchr/testify/blob/v1.6.1/assert/assertions.go#L191
testing
ãšããšåããããªãããã©ãŒããããæå®ããå Žåã¯f
ä»ãã®æ¹ã䜿ãã®ãç¡é£ã§ããããã
ãšãŸããé°å²æ°ã¯ãããªæãã¿ããã§ãããã®ä»ã®ã¢ãµãŒã·ã§ã³çšã®é¢æ°ã«ã€ããŠã¯ãAPIããã¥ã¡ã³ããçºããŸãããã
æåŸã«ããã¹ãå®è¡çµæã®å šäœã貌ã£ãŠãããŸãã
$ go test --- FAIL: TestPlusAssertFailContinue (0.00s) calc_test.go:24: Error Trace: calc_test.go:24 Error: Not equal: expected: 5 actual : 4 Test: TestPlusAssertFailContinue calc_test.go:34: Error Trace: calc_test.go:34 Error: Not equal: expected: 9 actual : 8 Test: TestPlusAssertFailContinue Messages: not equal --- FAIL: TestPlusFormat (0.00s) calc_test.go:46: Error Trace: calc_test.go:46 Error: Not equal: expected: 5 actual : 4 Test: TestPlusFormat Messages: not equal, collect = 4 calc_test.go:56: Error Trace: calc_test.go:56 Error: Not equal: expected: 9 actual : 8 Test: TestPlusFormat Messages: not equal, collect = 8 FAIL exit status 1 FAIL testify-assert-example 0.003s ## -vä»ã $ go test -v === RUN TestPlusSimply --- PASS: TestPlusSimply (0.00s) === RUN TestPlusAssertFailContinue calc_test.go:24: Error Trace: calc_test.go:24 Error: Not equal: expected: 5 actual : 4 Test: TestPlusAssertFailContinue calc_test.go:34: Error Trace: calc_test.go:34 Error: Not equal: expected: 9 actual : 8 Test: TestPlusAssertFailContinue Messages: not equal --- FAIL: TestPlusAssertFailContinue (0.00s) === RUN TestPlusFormat calc_test.go:46: Error Trace: calc_test.go:46 Error: Not equal: expected: 5 actual : 4 Test: TestPlusFormat Messages: not equal, collect = 4 calc_test.go:56: Error Trace: calc_test.go:56 Error: Not equal: expected: 9 actual : 8 Test: TestPlusFormat Messages: not equal, collect = 8 --- FAIL: TestPlusFormat (0.00s) FAIL exit status 1 FAIL testify-assert-example 0.002s
ãã®åŸãå¥ã®testifyããã±ãŒãžãä»ããã®ã§ããã®ãã¹ããã¡ã€ã«ã¯ãªããŒã ããŠãããŸãã
$ mv calc_test.go _calc_test.go
requireããã±ãŒãž
assertããã±ãŒãžã®æ¬¡ã¯ãrequireããã±ãŒãžã«ã€ããŠã
ãã¡ãã¯ãassertããã±ãŒãžãšäœ¿ãæ¹ãéåžžã«ãã䌌ãŠããŸãã
assert
ãšæžããŠãããšãããrequire
ã«ãããšãã»ãŒçœ®ãæããããŸãã以äžã¯ãå
ã»ã©ã®assertããã±ãŒãžã䜿ã£ã
ãã¹ãã³ãŒããrequireããã±ãŒãžã«çœ®æããŠãã¹ãé¢æ°åãå°ãå€æŽãããã®ã§ãã
calc_require_test.go
package main import ( "github.com/stretchr/testify/require" "testing" ) func TestPlusSimplyUsingRequire(t *testing.T) { result := Plus(1, 3) expect := 4 require.Equal(t, expect, result) } func TestPlusRequireFailContinueUsingRequire(t *testing.T) { result1 := Plus(1, 3) expect1 := 4 require.Equal(t, expect1, result1) result2 := Plus(1, 3) badExpect2 := 5 // miss require.Equal(t, badExpect2, result2) result3 := Plus(3, 5) expect3 := 8 require.Equal(t, expect3, result3, "not equal") result4 := Plus(3, 5) badExpect4 := 9 // miss require.Equal(t, badExpect4, result4, "not equal") } func TestPlusFormatUsingRequire(t *testing.T) { result1 := Plus(1, 3) expect1 := 4 require.Equalf(t, expect1, result1, "not equal, collect = %d", expect1) result2 := Plus(1, 3) badExpect2 := 5 // miss require.Equalf(t, badExpect2, result2, "not equal, collect = %d", 4) result3 := Plus(3, 5) expect3 := 8 require.Equalf(t, expect3, result3, "not equal, collect = %d", expect3) result4 := Plus(3, 5) badExpect4 := 9 // miss require.Equalf(t, badExpect4, result4, "not equal, collect = %d", 8) }
å®è¡çµæã
$ go test --- FAIL: TestPlusRequireFailContinueUsingRequire (0.00s) calc_require_test.go:24: Error Trace: calc_require_test.go:24 Error: Not equal: expected: 5 actual : 4 Test: TestPlusRequireFailContinueUsingRequire --- FAIL: TestPlusFormatUsingRequire (0.00s) calc_require_test.go:46: Error Trace: calc_require_test.go:46 Error: Not equal: expected: 5 actual : 4 Test: TestPlusFormatUsingRequire Messages: not equal, collect = 4 FAIL exit status 1 FAIL testify-assert-example 0.002s ## -vä»ã $ go test -v === RUN TestPlusSimplyUsingRequire --- PASS: TestPlusSimplyUsingRequire (0.00s) === RUN TestPlusRequireFailContinueUsingRequire calc_require_test.go:24: Error Trace: calc_require_test.go:24 Error: Not equal: expected: 5 actual : 4 Test: TestPlusRequireFailContinueUsingRequire --- FAIL: TestPlusRequireFailContinueUsingRequire (0.00s) === RUN TestPlusFormatUsingRequire calc_require_test.go:46: Error Trace: calc_require_test.go:46 Error: Not equal: expected: 5 actual : 4 Test: TestPlusFormatUsingRequire Messages: not equal, collect = 4 --- FAIL: TestPlusFormatUsingRequire (0.00s) FAIL exit status 1 FAIL testify-assert-example 0.003s
assertããã±ãŒãžãšã®éãã¯ã次ã®2ã€ã§ãã
- æ»ãå€ããªã
- ã¢ãµãŒã·ã§ã³ã«å€±æãããšããã¹ãé¢æ°ãå³çµäºãã
ãªã®ã§ãå
ã»ã©ã®assertããã±ãŒãžã䜿ã£ããã¹ãã³ãŒããšéããã¢ãµãŒã·ã§ã³ã«å€±æããæç¹ã§åŸç¶ã®ã¢ãµãŒã·ã§ã³ã®åŒã³åºãã¯
è¡ããããåŸç¶ã§ãšã©ãŒã«ãªãã¯ãã®ã¢ãµãŒã·ã§ã³ã®èšé²ãæ®ã£ãŠããŸããã
ããã¯ãrequireã®äžèº«ãèŠããšããããŸãããå
éšçã«ã¯assertãåŒã³åºããã¢ãµãŒã·ã§ã³ã«å€±æãããštesting
ã®T#FailNow
ã
åŒã³åºãããã«ãªã£ãŠããããã§ãã
https://github.com/stretchr/testify/blob/v1.6.1/require/require.go
ããã«èšããšãrequireããã±ãŒãžã¯assertããã±ãŒãžã䜿ã£ãŠèªåçæãããããã«ãªã£ãŠããŸãã
https://github.com/stretchr/testify/blob/v1.6.1/require/require.go#L1-L4
https://github.com/stretchr/testify/blob/v1.6.1/_codegen/main.go#L31-L35
https://github.com/stretchr/testify/blob/v1.6.1/require/require.go.tmpl
ãªã®ã§ãassertããã±ãŒãžãšã»ãŒåãããšãã§ããããšããããã§ããã
ãã®ãã¡ã€ã«ããåŸç¶ã®ãã¹ãã®ãžã£ãã«ãªããªãããã«ãªããŒã ããŠãããŸãã
$ mv calc_require_test.go _calc_require_test.go
suiteããã±ãŒãž
æåŸã¯suiteããã±ãŒãžã§ããsuiteããã±ãŒãžã䜿çšãããšããªããžã§ã¯ãæåèšèªã«äŒŒã圢ã§ãã¹ãã®éã«SetUpãTearDown
ãšããããšãè¡ããŸãã
ããã¯ãå®éã«æžããŠãã£ãæ¹ãããã§ãããã
æå°æ§æã¯ããããªæãã§ãããããããã§ã¯ãæåã«äœã£ãcalc.go
ã¯ç¡èŠããŸããâŠã
calc_suite_test.go
package main import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "testing" ) type MyTestSuiteStruct struct { suite.Suite } func (suite *MyTestSuiteStruct) TestHello() { assert.Equal(suite.T(), 1, 1) } func TestFirstTestSuite(t *testing.T) { suite.Run(t, new(MyTestSuiteStruct)) }
ãšãããããsuite
ããã±ãŒãžã¯import
ãããšããŠ
import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "testing" )
æåã«ãsuite#Suite
ãåã蟌ãã æ§é äœãå®çŸ©ããŸãã
type MyTestSuiteStruct struct { suite.Suite }
ãã¹ãé¢æ°ãäœæããsuite#Run
ã«testing#T
ãšå®çŸ©ããæ§é äœãåæåããŠæž¡ããŸãã
func TestFirstTestSuite(t *testing.T) { suite.Run(t, new(MyTestSuiteStruct)) }
ããšã¯ãå®çŸ©ããæ§é äœãã¬ã·ãŒããŒãšããã¡ãœãããå®çŸ©ããŠãããŸããã¡ãœããåã¯ãTest
ã§å§ããŠãã ããã
func (suite *MyTestSuiteStruct) TestHello() { assert.Equal(suite.T(), 1, 1) }
ã¢ãµãŒã·ã§ã³ã¯ãä»åã¯assertããã±ãŒãžã䜿ããŸãããassertã䜿ãã«ã¯testing#T
ãå¿
èŠã§ãããããã¯suite#T
ã§
ååŸã§ããŸãã
ãŸããsuite#Assert
ã䜿ã£ãŠãOKã§ããåãçå±ã§ãsuite#Require
ã䜿ããŸãã
å®è¡çµæã
$ go test PASS ok testify-assert-example 0.003s ## -vä»ã $ go test -v === RUN TestFirstTestSuite === RUN TestFirstTestSuite/TestHello --- PASS: TestFirstTestSuite (0.00s) --- PASS: TestFirstTestSuite/TestHello (0.00s) PASS ok testify-assert-example 0.003s
ãã¹ãçšã®ã¡ãœããããæåã«å®çŸ©ãããã¹ãé¢æ°ã®ãµããã¹ãã®ãããªåœ¢æ
ã§å®è¡ãããŠããŸããã
ããããŸãšããŠããåäœãããã¹ãã¹ã€ãŒããªã®ã§ããããã
ã²ãšã€ããã¹ãã¡ãœããã足ããŠã¿ãŸããããããã¯ã倱æãããã¹ãã§ãã
func (suite *MyTestSuiteStruct) TestBool() { assert.True(suite.T(), false) }
確èªã
$ go test -v === RUN TestFirstTestSuite === RUN TestFirstTestSuite/TestBool calc_suite_test.go:18: Error Trace: calc_suite_test.go:18 Error: Should be true Test: TestFirstTestSuite/TestBool === RUN TestFirstTestSuite/TestHello --- FAIL: TestFirstTestSuite (0.00s) --- FAIL: TestFirstTestSuite/TestBool (0.00s) --- PASS: TestFirstTestSuite/TestHello (0.00s) FAIL exit status 1 FAIL testify-assert-example 0.003s
ãã¹ãé¢æ°å ã«ãã²ãšã€ãã¹ããè¿œå ãããŸããã
ãã®ç¶æ
ã§ãå®è¡ãããã¹ãã¡ãœããã-run
ã§ã³ã³ãããŒã«ããããšãã§ããã¿ããã§ããã
$ go test -run TestFirstTestSuite/TestHello -v === RUN TestFirstTestSuite === RUN TestFirstTestSuite/TestHello --- PASS: TestFirstTestSuite (0.00s) --- PASS: TestFirstTestSuite/TestHello (0.00s) PASS ok testify-assert-example 0.003s
次ã«ããã¹ãã®ååŸã«ã¡ãœããåŒã³åºããæãã§ã¿ãŸãããã
ãã¹ãã®ååŸã«ã¡ãœããåŒã³åºããè¿œå ããå Žåã¯ãæå®ã®ã€ã³ã¿ãŒãã§ãŒã¹ã«å®çŸ©ãããã¡ãœãããå®è£
ããŸãã
ãã®ãããã§ããã
- type SetupAllSuite
- type SetupTestSuite
- type BeforeTest
- type AfterTest
- type TearDownTestSuite
- type TearDownAllSuite
ã©ã®ã€ã³ã¿ãŒãã§ãŒã¹ã«å®çŸ©ãããã¡ãœãããå®è£
ãããã§ãåŒã³åºãã¿ã€ãã³ã°ãå€ãããŸãã
ãªããã€ã³ã¿ãŒãã§ãŒã¹åãã¡ãœããåã£ãœãã§ãããå®è£
ãã¹ãã¡ãœããåãšå¿
ãããäžèŽããŠããªãã®ã§ãã©ã®ã¡ãœããã
å®è£
ãã¹ããã¯ã¡ãããšå®çŸ©ãèŠãæ¹ãããã§ãâŠã
ä»åã¯ãã¹ãåäœã®ååŸã«å
¥ããŠã¿ãŸãããããã®ç®çã®å ŽåãSetupTestSuite
ãšBeforeTest
ãAfterTest
ãšTearDownTestSuite
ã
䜿ããã®ã§ãããä»åã¯BeforeTest
ãšAfterTest
ã䜿ããŸãããã
ãããªæãã§ãã
func (suite *MyTestSuiteStruct) BeforeTest(suiteName string, testName string) { suite.T().Log("BeforeTest!!") } func (suite *MyTestSuiteStruct) AfterTest(suiteName string, testName string) { suite.T().Log("AfterTest!!") } func (suite *MyTestSuiteStruct) TestHello() { suite.T().Log("run TestHello!!") assert.Equal(suite.T(), 1, 1) } func (suite *MyTestSuiteStruct) TestBool() { suite.T().Log("run TestBool!!") assert.True(suite.T(), false) }
BeforeTest
ãAfterTest
ãšãã«ãåŒæ°ã«ãã¹ãã¹ã€ãŒãåãšãã¹ãåãåããŸãã
ä»åã¯åŒã³åºãã¿ã€ãã³ã°ãããããããããã«ãã°åºåããŠã¿ãŸããã
確èªã
$ go test -v === RUN TestFirstTestSuite === RUN TestFirstTestSuite/TestBool calc_suite_test.go:14: BeforeTest!! calc_suite_test.go:27: run TestBool!! calc_suite_test.go:28: Error Trace: calc_suite_test.go:28 Error: Should be true Test: TestFirstTestSuite/TestBool calc_suite_test.go:18: AfterTest!! === RUN TestFirstTestSuite/TestHello calc_suite_test.go:14: BeforeTest!! calc_suite_test.go:22: run TestHello!! calc_suite_test.go:18: AfterTest!! --- FAIL: TestFirstTestSuite (0.00s) --- FAIL: TestFirstTestSuite/TestBool (0.00s) --- PASS: TestFirstTestSuite/TestHello (0.00s) FAIL exit status 1 FAIL testify-assert-example 0.003s
ãããªæãã§ããã¹ãååŸã«åŒã³åºããå ¥ã£ãŠããã®ã確èªã§ããŸãã
ãŸãããã¹ãã¹ã€ãŒããå®çŸ©ããéã®æ§é äœã¯ãåã蟌ãã suite.Suite
以å€ã«ãã¡ã³ããŒãæã€ããšãã§ããŸãã
type SampleTestStruct struct { suite.Suite ExecutedTestMethodNames []string CallSetupSuiteCount int CallSetupTestCount int CallBeforeTestCounts map[string]int runTestMethodNames []string CallAfterTestCounts map[string]int CallTearDownTestCount int CallTearDownSuiteCount int }
å
ã»ã©æžãããµã³ãã«ãšã¯å¥ã«ãããã²ãšã€ãã¹ãã¹ã€ãŒããèµ·ãããŠã¿ãŸããããä»åã¯ããã¹ãã®ååŸã«å®è¡ã§ããã¡ãœããã
ãã¹ãŠå®è£
ããŸãã
calc_suite2_test.go
package main import ( "encoding/json" "fmt" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "testing" ) type SampleTestStruct struct { suite.Suite ExecutedTestMethodNames []string CallSetupSuiteCount int CallSetupTestCount int CallBeforeTestCounts map[string]int runTestMethodNames []string CallAfterTestCounts map[string]int CallTearDownTestCount int CallTearDownSuiteCount int } func (suite *SampleTestStruct) SetupSuite() { suite.T().Logf("===== SetupSuite =====") suite.CallSetupSuiteCount += 1 } func (suite *SampleTestStruct) SetupTest() { suite.T().Logf("===== SetupTest =====") suite.CallSetupTestCount += 1 } func (suite *SampleTestStruct) BeforeTest(suiteName string, testName string) { suite.T().Logf("===== BeforeTest suite[%s] test[%s] =====", suiteName, testName) if suite.CallBeforeTestCounts == nil { suite.CallBeforeTestCounts = make(map[string]int) } suite.CallBeforeTestCounts[suiteName+"/"+testName] += 1 } func (suite *SampleTestStruct) AfterTest(suiteName string, testName string) { suite.T().Logf("===== AfterTest suite[%s] test[%s] =====", suiteName, testName) if suite.CallAfterTestCounts == nil { suite.CallAfterTestCounts = make(map[string]int) } suite.CallAfterTestCounts[suiteName+"/"+testName] += 1 } func (suite *SampleTestStruct) TearDownTest() { suite.T().Logf("===== TearDownTest =====") suite.CallTearDownTestCount += 1 } func (suite *SampleTestStruct) TearDownSuite() { suite.T().Logf("===== TearDownSuite =====") suite.CallTearDownSuiteCount += 1 beforeTestCounts, _ := json.Marshal(suite.CallBeforeTestCounts) afterTestCounts, _ := json.Marshal(suite.CallAfterTestCounts) runTestMethodNames, _ := json.Marshal(suite.runTestMethodNames) fmt.Printf(`---------------------------------------------------------------------- SetupSuiteCount = %d SetupTestCount = %d BeforeTestCounts = ( %s ) runTestMethods = %s AfterTestCounts = ( %s ) TearDownTestCount = %d TearDownSuiteCount = %d ---------------------------------------------------------------------- `, suite.CallSetupSuiteCount, suite.CallSetupTestCount, beforeTestCounts, runTestMethodNames, afterTestCounts, suite.CallTearDownTestCount, suite.CallTearDownSuiteCount, ) } func (suite *SampleTestStruct) TestPlus() { suite.T().Logf("run %s", suite.T().Name()) if suite.runTestMethodNames == nil { suite.runTestMethodNames = make([]string, 0) } suite.runTestMethodNames = append(suite.runTestMethodNames, suite.T().Name()) assert.Equal(suite.T(), 1, 1) } func (suite *SampleTestStruct) TestBool() { suite.T().Logf("run %s", suite.T().Name()) if suite.runTestMethodNames == nil { suite.runTestMethodNames = make([]string, 0) } suite.runTestMethodNames = append(suite.runTestMethodNames, suite.T().Name()) assert.True(suite.T(), true) } func TestSuiteExample(t *testing.T) { suite.Run(t, new(SampleTestStruct)) }
æ§é äœã«ã¯ãã¡ãœããåŒã³åºãæã«ãã®ã¿ã€ãã³ã°ã«å¿ããã«ãŠã³ã¿ãŒãèšããèšé²ããŠããããã«ããŸããã
type SampleTestStruct struct { suite.Suite ExecutedTestMethodNames []string CallSetupSuiteCount int CallSetupTestCount int CallBeforeTestCounts map[string]int runTestMethodNames []string CallAfterTestCounts map[string]int CallTearDownTestCount int CallTearDownSuiteCount int }
çµæã2ã€ã®ãã¹ãã¹ã€ãŒããå®è¡ããŸããã
$ go test -v === RUN TestSuiteExample calc_suite2_test.go:26: ===== SetupSuite ===== === RUN TestSuiteExample/TestBool calc_suite2_test.go:31: ===== SetupTest ===== calc_suite2_test.go:36: ===== BeforeTest suite[SampleTestStruct] test[TestBool] ===== calc_suite2_test.go:105: run TestSuiteExample/TestBool calc_suite2_test.go:46: ===== AfterTest suite[SampleTestStruct] test[TestBool] ===== calc_suite2_test.go:56: ===== TearDownTest ===== === RUN TestSuiteExample/TestPlus calc_suite2_test.go:31: ===== SetupTest ===== calc_suite2_test.go:36: ===== BeforeTest suite[SampleTestStruct] test[TestPlus] ===== calc_suite2_test.go:93: run TestSuiteExample/TestPlus calc_suite2_test.go:46: ===== AfterTest suite[SampleTestStruct] test[TestPlus] ===== calc_suite2_test.go:56: ===== TearDownTest ===== === CONT TestSuiteExample calc_suite2_test.go:61: ===== TearDownSuite ===== ---------------------------------------------------------------------- SetupSuiteCount = 1 SetupTestCount = 2 BeforeTestCounts = ( {"SampleTestStruct/TestBool":1,"SampleTestStruct/TestPlus":1} ) runTestMethods = ["TestSuiteExample/TestBool","TestSuiteExample/TestPlus"] AfterTestCounts = ( {"SampleTestStruct/TestBool":1,"SampleTestStruct/TestPlus":1} ) TearDownTestCount = 2 TearDownSuiteCount = 1 ---------------------------------------------------------------------- --- PASS: TestSuiteExample (0.00s) --- PASS: TestSuiteExample/TestBool (0.00s) --- PASS: TestSuiteExample/TestPlus (0.00s) === RUN TestFirstTestSuite === RUN TestFirstTestSuite/TestBool calc_suite_test.go:14: BeforeTest!! calc_suite_test.go:27: run TestBool!! calc_suite_test.go:28: Error Trace: calc_suite_test.go:28 Error: Should be true Test: TestFirstTestSuite/TestBool calc_suite_test.go:18: AfterTest!! === RUN TestFirstTestSuite/TestHello calc_suite_test.go:14: BeforeTest!! calc_suite_test.go:22: run TestHello!! calc_suite_test.go:18: AfterTest!! --- FAIL: TestFirstTestSuite (0.00s) --- FAIL: TestFirstTestSuite/TestBool (0.00s) --- PASS: TestFirstTestSuite/TestHello (0.00s) FAIL exit status 1 FAIL testify-assert-example 0.004s
è¿œå ããæ¹ã®ãã¹ãã¹ã€ãŒãã®è¡šç€ºã¯ããã¡ãã§ããã
=== RUN TestSuiteExample calc_suite2_test.go:26: ===== SetupSuite ===== === RUN TestSuiteExample/TestBool calc_suite2_test.go:31: ===== SetupTest ===== calc_suite2_test.go:36: ===== BeforeTest suite[SampleTestStruct] test[TestBool] ===== calc_suite2_test.go:105: run TestSuiteExample/TestBool calc_suite2_test.go:46: ===== AfterTest suite[SampleTestStruct] test[TestBool] ===== calc_suite2_test.go:56: ===== TearDownTest ===== === RUN TestSuiteExample/TestPlus calc_suite2_test.go:31: ===== SetupTest ===== calc_suite2_test.go:36: ===== BeforeTest suite[SampleTestStruct] test[TestPlus] ===== calc_suite2_test.go:93: run TestSuiteExample/TestPlus calc_suite2_test.go:46: ===== AfterTest suite[SampleTestStruct] test[TestPlus] ===== calc_suite2_test.go:56: ===== TearDownTest ===== === CONT TestSuiteExample calc_suite2_test.go:61: ===== TearDownSuite ===== ---------------------------------------------------------------------- SetupSuiteCount = 1 SetupTestCount = 2 BeforeTestCounts = ( {"SampleTestStruct/TestBool":1,"SampleTestStruct/TestPlus":1} ) runTestMethods = ["TestSuiteExample/TestBool","TestSuiteExample/TestPlus"] AfterTestCounts = ( {"SampleTestStruct/TestBool":1,"SampleTestStruct/TestPlus":1} ) TearDownTestCount = 2 TearDownSuiteCount = 1 ----------------------------------------------------------------------
ããã§ããã¹ãã®å®è¡ã¿ã€ãã³ã°ã確èªã§ãããšæããŸãã
äžå¿ãã¡ãœãããšå®è¡ã¿ã€ãã³ã°ã®å¯Ÿå¿ãæžããšã以äžã®ããã«ãªããŸãã
ã¡ãœããå | å®è¡ã¿ã€ãã³ã° |
---|---|
SetupSuite | ãã¹ãã¹ã€ãŒãã®å®è¡å |
SetupTest | ïŒãã¹ãã¹ã€ãŒãå ã®ïŒåãã¹ãã¡ãœããã®å®è¡å |
BeforeTest | ïŒãã¹ãã¹ã€ãŒãå ã®ïŒåãã¹ãã¡ãœããã®å®è¡å |
AfterTest | ïŒãã¹ãã¹ã€ãŒãå ã®ïŒåãã¹ãã¡ãœããã®å®è¡åŸ |
TearDownTest | ïŒãã¹ãã¹ã€ãŒãå ã®ïŒåãã¹ãã¡ãœããã®å®è¡åŸ |
TearDownSuite | ãã¹ãã¹ã€ãŒãã®å®è¡åŸ |
SetupTest
ãšBeforeTest
ãAfterTest
ãšTearDownTest
ã®éãã¯ãåŒæ°ã®æç¡ãšèããã°ããããã§ãã
ãã®ãããã®ããã¹ãã¡ãœãããšååŸã«å ¥ã蟌ãã¡ãœããã®å®è¡ã¿ã€ãã³ã°ã®å®çŸ©ã¯ä»¥äžã確èªãããšè¯ãã§ãããã
https://github.com/stretchr/testify/blob/v1.6.1/suite/suite.go#L112-L176
ãŸãããã¹ãã¹ã€ãŒãã®ã°ã«ãŒãã³ã°ã®åäœãsuite#Suite
ãåã蟌ãã æ§é äœã§ããããšã確èªã§ããŸãããã
ããšãsuiteããã±ãŒãžã®äœ¿ãæ¹ãšããŠã¯ããã¡ããèŠãŠãããã§ãããã
https://github.com/stretchr/testify/blob/v1.6.1/suite/suite_test.go
ãŸãšã
testifyã®assertïŒãšrequireïŒãsuiteã«é¢ããŠã¡ãã£ãšè©ŠããŠã¿ãŸããã
ãŸã Goèªäœã«æ
£ããªãã®ã§ãsuiteã®äœ¿ãæ¹ã¯ç¹ã«æéåã£ãã®ã§ãããtestifyã®ãœãŒã¹ã³ãŒããããã»ã©å€§ãããªãã£ãã®ã§
Goãèªãå匷ãšããŠãè¯ãã£ãã§ãã