Go语言工程实践之测试
测试是避免事故的最后一道屏障。
测试的主要分类
单元测试
单元测试的规则:
- 所有的测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
举例:
func HelloTom() string {
return "Jerry"
}
func TestHelloTom(t *testing.T) {
output := HelloTom()
expectOutput := "Tom"
if output != expectOutput := "Tom"{
t.Errorf( format: "Expected %s do not match actual %s",expectOutput,output)
}
}
代码覆盖率
命令:go test xxx_test.go --cover
Tips:
- 实际开发中,一般覆盖率:50%~60%,较高覆盖率80%+。
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责。
依赖
幂等性:当重复多次运行某个单元时,运行的结果与第一次运行后的结果是一样的。
稳定性:单元测试相互之间是隔离的,任何时间任何函数是可以独立的运行,并且多次运行结果是一致的。
Mock
monkey : github.com/bouk/monkey
快速Mock函数
- 为一个函数打桩
- 为一个方法打桩
基准测试
- 优化代码,需要对当前代码分析。
- 内置的测试框架提供了基准测试的能力。
func BenchmarkSelect(b *testing.B){
InitServerIndex()
b.ResetTimerO()
for i := 0; i < b.N; i {
select()
}
}
func BenchmarkSelectParallel(b *testing.B){
InitServerIndex()
b.ResetTimerO()
b.RunParallel(func(pb *testing.PB){
for pb.Next() {
select()
}
}
项目实践
需求描述
社区话题页面
- 展示话题(标题,文字描述)和回帖列表
- 暂不考虑前端页面实现,仅仅实现一个本地web服务
- 话题和回帖数据用文件存储
需求用例
E-R图(实体关系图)
分层结构
- 数据层: 数据Model,外部数据的增删改查。
- 逻辑层: 业务Entity,处理核心业务逻辑输出。
- 视图层: 视图view,处理和外部的交互逻辑。
对于查询数据,建立索引(内存Map),实现快速查找。
项目运行启动,查询某个Topic