单元测试
规则
- 所有测试文件以-test.go结尾
- func TestXxx(t *testing.T)
- 初始化逻辑放到TestMain中
func TestMain(m *testing.M){
// 测试前:数据装载、配置初始化等前置工作
code := m.Run()
// 测试后:释放资源等收尾工作
os.Exit(code)
}
assert包
获取assert包
`go get github.com/stretchr/testify/assert`
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestSomething(t *testing.T) {
var a string = "Hello"
var b string = "Hello"
assert.Equal(t, a, b, "The two words should be the same.")
}
断言允是“assert”包中的全局函数。所有断言函数都将测试框架提供的*testing.T对象作为第一个参数。这允许断言函数将失败和其他详细信息写入正确的位置。每个断言函数还将可选的字符串消息作为最终参数,允许将自定义错误消息附加到断言方法输出的消息中。
代码覆盖率
go test -v -coverprofile=cover.out
- 一般覆盖率: 50%~60%, 较高覆盖率80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
Mock测试
- 为一个函数打桩
- 为一个方法打桩 Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。其最大的功能是帮助我们把单元测试的耦合分解开,代码对另一个类或者接口有依赖,它能够帮我们模拟这些依赖,并帮我们验证所调用的依赖的行为 通过Mock对函数和方法进行打桩测试,不再依赖本地文件。
基准测试
- 指定一个时间(默认是1秒),看测试对象在达到时间上限时,最多能被执行多少次和在此期间测试对象内存分配情况。
- 基准测试的代码文件必须以_test.go结尾
- 基准测试的函数必须以Benchmark开头
- 基准测试函数必须接受一个指向Benchmark类型的指针作为唯一参数
- 基准测试函数不能有返回值
- b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰
- 最后的for循环很重要,被测试的代码要放到循环里
- b.N是基准测试框架提供的,表示循环的次数