测试:
回归测试
集成测试
单元测试
输入
测试单元
函数和模块可以保证质量,可以定位问题所在
输出
期望
校对
单元测试的规则
所有则是文件以——test.go结尾
func TestXxx(*testing.T)
初始化逻辑放到TestMain中
如果规则错的话,如果如果正确命名函数会有一个标志,如果有问题的话就没有标志
TestMain是在高纬度去生效的,数据装载,配置初始化等前置工作都可以在这里去执行
接下来是code := m.Run();
这个意思是跑code的所有单元册
run完以后就做一些收尾工作
代码
这样可以验证一个代码的正确性
如何衡量代码是否经过了足够的测试?
如何评价项目的测试水准?
如何评估项目是否达到了高水准测试等级?
代码覆盖率,越完备就对代码越有保障
提升覆盖率:测试分支相互独立、全面覆盖,测试单元粒度足够小,函数单一职责
3.1.5 单元测试-覆盖率
jfunc JudgePassLine(score int16)bool{
if score > 60 {
return true
}
return false
}
func TestJudgePassLineTrue(t *testing.T){
isPass := JudgePassLine( score: 70)
assert.Equal(t,expected:true,isPass)
}
结果:
test git:(Vo)x go test judgment_test.go judgment.go --cover
command-line-arguments1.296s
coverage:66.7% of statements
因为在JudgePassLine中是70大于60 所以执行第二行
结果返回下面的代码并不执行,代码覆盖率就是2/3
下面就是要提升覆盖率
如果输入50的话就是1,这样就保证了测试的覆盖性保证了代码,这样对代码是有信心的
一般覆盖率:50%~60%,(主流程是没有问题的,但是一些副流程的分支是没有覆盖到的)较高覆盖率80%+
提升覆盖率是比较有成本的
测试分支相互独立、全面覆盖,
测试单元粒度足够小,函数单一职责,
要求函数是足够小,能更好提升覆盖度
依赖
强依赖:依赖数据表和组件等,这些属于项目的强依赖。
依赖一些数据表还有一些组件等,这些都属于是项目的强依赖
幂等和稳定、
幂等每次重复执行一个测试,结果是与之前是一样的
幂等性确保每次重复执行测试结果一致,稳定性确保单元测试相互隔离。
稳定性,单元测试是相互隔离的
快速mock函数
常用到的包是monkey(开源的)
快速mock函数:使用monkey包进行运行时函数地址替换。
monkey :github.com/bouk/monkey
主要是运行时,将内存是函数的地址改为运行时函数的地址
这样可以任意时间,地点去进行
基准测试
性能优化:内置测试框架提供基准测试能力,FastSelect函数解决随机函数性能问题
优化代码,需要对当前代码分析
内置的测试框架提供了基准测试的能力
run函数为了保证全局的随机性和全局安全持有了一把全局锁,这样就在一定程度上是并行情况下他的性能就直接劣化了、
为了解决随机函数的性能问题
FastSelect函数可以解决,整体的性能可以解决
但是牺牲了一点随机序列的一致性
组件工具
Gin 高性能 go web 框架
高性能的Go Web框架,通过go mod进行依赖管理。
Go Mod
go mod init
go get gopkg.in/gin-gonic/gin.v1@v1.3.0
实现两个基本的查询操作,通过id查询的话题信息
第二个是通过id可以查询所有话题列表
可以通过全扫描遍历的方式,但是并不是最高效的方式
有一个索引的概念
通过把数据行映射成内存的map来实现内存的索引
因为map的时间复杂度o1
索引概念:通过将数据行映射成内存的map来实现内存索引,map的时间复杂度为O(1)。
下面是两个索引
var(
topicIndexMap map[int64]*Topic
postIndexMap map[int64][]*Post
)