Go 使用 Testing、Ginkgo、GoMock、Gomega、Testify、Mockery 做单元测试的例子。
- Ginkgo 是一个 Go 语言的 BDD 测试框架,它提供了一个类似于 RSpec 的 DSL,让开发者可以用更自然的语言来描述测试用例。
- GoMock 是一个 Go 语言的 Mock 生成器,可以帮助开发者创建 Ginkgo Mock 对象。
- Gomega 是一个 Go 语言的断言库,它提供了一系列的匹配器,让开发者可以用更自然、更易读的方式来编写断言语句。
- Testify 是一个 Go 语言测试框架,可以很好地与标准库配合使用。
- Mockery 是一个 Go 语言的 Mock 生成器,可以帮助开发者创建 Testify Mock 对象。
go install github.com/onsi/ginkgo/v2/ginkgo
go install go.uber.org/mock/mockgen@latest
go install github.com/vektra/mockery/[email protected]
在需要 mock 的 interface 所在目录执行生成命令,记得修改命令中的 xxx,每次修改 interface 都需要执行。
xxx 为 interface 所在的文件名称
mockgen -source=xxx.go -destination=mocks/gomock_struct.go -package=mocks
xxx 为 interface 名称
mockery --name xxx --filename testify_struct.go --outpkg mocks
在需要 mock 的 interface 上添加注释,然后在项目根目录执行生成命令。每次修改 interface 都需要执行。
go generate ./...
xxx 为 interface 所在的文件名称
//go:generate mockgen -source=xxx.go -destination=mocks/gomock_struct.go -package=mocks
xxx 为 interface 名称
//go:generate mockery --name xxx --filename testify_struct.go --outpkg mocks
- 生成 suite
在需要测试的文件所在目录执行。必须生成 suite,否则 specs 无法运行。
ginkgo bootstrap
- 生成 specs
记得修改命令中的 xxx,使用 Ginkgo 插件要将 suite 和 specs 合并为一个文件。
ginkgo generate xxx
GoLand 可以一键生成测试文件,手动创建步骤如下:
- 创建一个名为 *_test.go 的文件,例如 mypackage_test.go。
- 在文件中定义测试函数,函数名必须以 Test 开头,例如 TestMyFunction。
- 在测试函数中使用 testing.T 类型来进行断言和错误处理。
package xx_test
import (
"testing"
)
func TestMyFunction(t *testing.T) {
}
go test ./...
go test -v ./...
go test -v -cover ./...
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html