测试
最佳实践
- 应该使用简洁的语法, 可以使用第三方库封装好的, 例如
https://github.com/stretchr/testify
, 使用它可以减少大量的if..else
- 使用Mock数据来代替手懂编写的Mock数据,
https://github.com/stretchr/testify
提供Mock数据的功能 - 测试文件的文件名应该是:
名称_下划线.go
, 例如:main_test.go
- 单元测试的测试文件与被测试的文件存放在同一个文件夹
- 测试文件中的测试函数应该使用
Test开头+函数名
, 例如:TestCreateAccount
- 测试函数的参数必须是指向testing包的指针类型, 例如
TestCreateAccount(t *testing.M)
- 测试的函数应该相互独立的, 不要互相依赖, 维护将非常困难, 测试中一个简单的更改可能会影响其它的测试, 例如. 创建和查询应使用不同的函数来编写它们
onsi/ginkgo
stretchr/testify
编写测试
*testing.T
: 单元测试, 使用*testing.M
: 这个类型用于在测试开始之前和所有测试完成后执行特定的设置和清理操作。它通常用在一个特定的TestMain
函数中*testing.B
: 这个类型用于基准测试,用来测量和报告函数的性能,在基准测试中,代码块会重复执行多次,以便测量性能
func TestCreateAccount(t *testing.T) {
arg := CreateAccountParams{
Owner: "",
Balance: 100.
Currency: "USD",
}
account, err:= testQueries.CreateAccount(context,Background(), arg)
require.NoError(t, err) //测试是否无错误
require.Error(t, err) //测试是否为错误
require.Empty(t, account) // 测试是否为空
require.NotEmpty(t, account) // 测试是否不为空
require.Equal(t, arg.Owner, account.Owner) // 测试是否相等
require.NotZero(t, arg.ID ,account.ID) // 测试ID是否不为空, 一般ID都是自增的
require.NotZero(t, arg.CreateAt, account.CreateAt) // // 测试创建时间是否不为空, 一般时间都不为0
require.WithinDuration(t, arg.CreateAt, account.CreateAt, time.Second) // 相差不超过n秒
require.EqualError(t. err, sql.ErrNoRows.Error()) // 是否包含错误
运行测试
Makefile
test:
go test -v -cover ./...
命令行
go test -v -cover ./...