Ginkgo 测试框架学习笔记
一、安装Ginkgo
$ go get github.com/onsi/ginkgo/ginkgo
$ go get github.com/onsi/gomega/...
然后会有一个ginkgo.exe安装在GOPATH路径的bin里
二、框架拆解
Ginkgo 提供了一些example
1、Bootstrapping a Suite
$ cd path/to/books
$ ginkgo bootstrap
package books_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"testing"
)
func TestBooks(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "Books Suite")
}
- 新建两个package books_test 进行测试,一个文件用于写测试用例,一个文件放启动测试套件的函数.
- 导入Ginkgo和Gomega包时在包名前加一个[.],这样可以直接使用包中的方法函数,不用再【包名.函数名】
- 执行文件的时候,可以用go test方法也可以用ginkgo
- RegisterFailHandler(Fail): ginkgo通过调用Fail(description string)函数来发出fail信号。我们用RegisterFailHandler() 将Fail函数传递给Gomega。RegisterFailHandler()是连接ginkgo和gomega的唯一途径。
- RunSpecs(t *testing.T, suiteDescription string):用于启动测试套件,如果任何一个specs失败,该套件则自动返回失败。
执行结果
$ ginkgo #or go test
=== RUN TestBootstrap
Running Suite: Books Suite
==========================
Random Seed: 1378936983
Will run 0 of 0 specs
Ran 0 of 0 Specs in 0.000 seconds
SUCCESS! -- 0 Passed | 0 Failed | 0 Pending | 0 Skipped
--- PASS: TestBootstrap (0.00 seconds)
PASS
ok books 0.019s
2、Adding Specs to a Suite
$ ginkgo generate book
package books_test
import (
"/path/to/books"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Book", func() {
var (
longBook Book
shortBook Book
)
BeforeEach(func() {
longBook = Book{
Title: "Les Miserables",
Author: "Victor Hugo",
Pages: 1488,
}
shortBook = Book{
Title: "Fox In Socks",
Author: "Dr. Seuss",
Pages: 24,
}
})
Describe("Categorizing book length", func() {
Context("With more than 300 pages", func() {
It("should be a novel", func() {
Expect(longBook.CategoryByLength()).To(Equal("NOVEL"))
})
})
Context("With fewer than 300 pages", func() {
It("should be a short story", func() {
Expect(shortBook.CategoryByLength()).To(Equal("SHORT STORY"))
})
})
})
})
- 我们添加了一个顶层的描述容器,用Ginkgo的【Describe(text string, body func() ) bool 】函数。使用【var _ = …】允许我们直接描述填充顶层的Describe() 不需要用【func init(){}】初始化包装它。
- 【Describe() {}】中的函数包含了我们的使用规范。
- 为了共享BeforeEach和It之间的状态,Ginkgo使用闭包函数变量来构建顶层的Describe()和Context()
- Ginkgo中使用【Descirbe()】和【Context()】来描述代码的测试行为,将一个或多个测试用例It归类。
- Ginkgo中使用【BeforceEach()】来为specs设置状态,执行每个测试用例It前执行该段代码,使用【It()】来指定单个spec,是测试用例的基本单位,即It中包含的代码就算一个测试用例。
- 使用Gomega中的【Expect()】函数来设置期望。
执行结果
$ ginkgo # or go test
=== RUN TestBootstrap
Running Suite: Books Suite
==========================
Random Seed: 1378938274
Will run 2 of 2 specs
••
Ran 2 of 2 Specs in 0.000 seconds
SUCCESS! -- 2 Passed | 0 Failed | 0 Pending | 0 Skipped
--- PASS: TestBootstrap (0.00 seconds)
PASS
ok books 0.025s
3、Marking Specs as Failed
虽然通常使用匹配器库(如Gomega)在规范中进行断言,但Ginkgo提供了一个简单的、全局的失败函数,它允许您将一个spec标记为失败。
Fail("Failure reason")
① Fail() 标志该测试用例运行结果为失败,并打印里面的信息。
② Fail和Gomega(Gomega也调用了Fail)将会把当前的Space和panic记录为失败。同时Ginkgo会停止当前进度中的spec,包括后续所有与该时间相关的断言和代码。
③ 通常Ginkgo会自动挽救这种panic,并进入下一段测试。
④ 如果测试启动的一个线程调用了Fail,或调用了Gomega的失败断言,那么Ginkgo没有办法挽救错误引起的panic。这会导致后续的测试内容中断。为了避免这种情况,需要使用【GinkgoRecover】来挽救panic。
Example:
It("panics in a goroutine", func(done Done)