Go Ginkgo로 테스트 작성하기
References
설치
go get github.com/onsi/ginkgo/v2
go get github.com/onsi/gomega
mise use ginkgo@2
Bootstrapping
테스트를 수행할 디렉토리로 이동하여 부트스트랩을 위한 코드를 추가합니다.
xxx_suite_test.go
package xxx_test
import (
"testing"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)
func TestXxx(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Xxxx Suite")
}
var _ = BeforeSuite(func() {
// setup code
})
var _ = AfterSuite(func() {
// teardown code
})
테스트 설명하기
var _ = Describe("...", func () {
Context("...", func () {
When("...", func () {
It("...", func () {
By("...")
// test code
})
It("...", func () {
By("...")
// test code
})
})
})
})
테스트 코드를 작성할 때, container node (Describe, Context, When), setup node (It), subject node (By)와 text 인자를 활용하여 테스트의 구조를 명확히 할 수 있습니다. 잘 구조화된 테스트는 개발자의 이해를 도와 유지보수를 쉽게하며, 테스트 실패 시 문제를 빠르게 파악할 수 있게 합니다.
Context는 Describe의 alias이고, When은 Describe와 같지만 when 을 text 앞에 붙여준다는 점이 다릅니다.
테스트가 실패한 경우 아래와 같은 메시지가 출력됩니다.
• [FAILED] [<duration>]
<describe>[ <describe>] [It] <it>
# ...
STEP: <by> @ <time>
STEP: <by> @ <time>
# error message
테스트 작성하기
반복되는 테스트 설정 분리하기
BeforeEach와 AfterEach는 소속된 container node 내의 모든 subject node가 실행되기 전/후에 실행됩니다.
var _ Describe("...", func () {
var sharedVar Type
BeforeEach(func () {
// setup code for sharedVar
})
AfterEach(func () {
// teardown code for sharedVar
})
It("...", func () {
// test code using sharedVar
})
It("...", func () {
// test code using sharedVar
})
})
위 코드는 BeforeEach -> It -> AfterEach 순으로 실행됩니다.
var _ = Describe("...", func () {
var sharedVar sharedType
BeforeEach(func () {
// setup code for sharedVar
})
AfterEach(func () {
// teardown code for sharedVar
})
Context("...", func () {
It("...", func () {
// test code using sharedVar
})
It("...", func () {
// test code using sharedVar
})
})
Context("...", func () {
BeforeEach(func () {
// additional setup code for this context
})
AfterEach(func () {
// additional teardown code for this context
})
It("...", func () {
// test code using sharedVar
})
It("...", func () {
// test code using sharedVar
})
})
})
위 코드의 두 번째 subject가 실행될 때는 BeforeEach -> Context의 BeforeEach -> It -> Context의 AfterEach -> AfterEach 순으로 실행됩니다.
BeforeEach와 It 사이에 실행되는 JustBeforeEach라는 것도 있습니다. 마찬가지로 It과 AfterEach 사이에 실행되는 JustAfterEach도 있습니다.