0%

Go 测试相关

单测中 Mock 数据库

Mock 数据库大概有以下几种方式:

  1. 用容器部署一个真实的数据库实例,前提是 CI 平台能够支持。
  2. 提供数据库驱动包的第三方库同时提供了 mock 包。
  3. 数据库驱动以 interface 而不是 struct 的形式提供功能 API,则可以基于 interface 编写 mock,此时可以在 mock 的结构体中嵌入数据库驱动 interface ,从而只 mock 使用到的相关接口,而不是全部。
  4. 如果数据库驱动直接通过 struct 提供功能 API,则应当在使用数据库驱动时封装一层 DAO interface,之后依据 DAO interface 编写 mock 代码,实际上增加一层 DAO 并没有带来特别的收益,除非后续有切换数据库的可能,否则也只是方便进行 mock 测试,在现代编程中,层层封装过于泛滥。
  5. 如果单测实现特别困难,则需考虑是不是应该在集成测试中对目标功能进行测试。

基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 通过不同颜色更清晰显示测试结果
go get -u github.com/rakyll/gotest
// 根据前缀匹配测试用例
gotest -v -run TestHelloE
// 指定测试文件
go test -v hello_test.go
// 输出测试覆盖率
go test -cover
gp test -coverprofile=cover.txt
// 转换为 html
go tool cover -html=cover.txt -o /tmp/cover.html
// 测试当前目录及子目录下所有 package
go test ./...
// 测试当前目录下 package
go test .
// 打印测试信息
t.Log("hi")
// go test 会自动多线程执行测试用例
// 有时候涉及到数据库操作的用例可能希望单线程执行
go test -p 1 ./...

自动生成 mock 代码

https://github.com/vektra/mockery

nolint 忽略部分代码的 lint

https://golangci-lint.run/usage/false-positives/

参考资料

  1. https://betterprogramming.pub/unit-testing-code-using-the-mongo-go-driver-in-golang-7166d1aa72c0
  2. https://medium.com/rungo/unit-testing-made-easy-in-go-25077669318
  3. https://adrianhesketh.com/2020/02/21/mocking-aws-sdk-calls-in-go/
本文到此结束  感谢您的阅读