单元测试,web框架,索引,强依赖,幂等

66 阅读4分钟

测试:

回归测试

集成测试

单元测试

输入

测试单元

函数和模块可以保证质量,可以定位问题所在

输出

期望

校对

单元测试的规则

所有则是文件以——test.go结尾

func TestXxx(*testing.T)

初始化逻辑放到TestMain中

如果规则错的话,如果如果正确命名函数会有一个标志,如果有问题的话就没有标志

TestMain是在高纬度去生效的,数据装载,配置初始化等前置工作都可以在这里去执行

接下来是code := m.Run();

这个意思是跑code的所有单元册

run完以后就做一些收尾工作

代码

0

这样可以验证一个代码的正确性

如何衡量代码是否经过了足够的测试?

如何评价项目的测试水准?

如何评估项目是否达到了高水准测试等级?

代码覆盖率,越完备就对代码越有保障

提升覆盖率:测试分支相互独立、全面覆盖,测试单元粒度足够小,函数单一职责

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进行依赖管理。

github.com/gin-gonic/g…

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