这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天。今天,我们学习了Go中的依赖管理与测试相关的知识。
Go依赖管理
作为一个对Go有一点了解,又不是那么了解的同学,一直都对Go的依赖管理不甚了解,只知道在需要某个包的时候go get ...下来,对于版本号的意义、依赖标识、依赖冲突的处理都不甚了解,通过本次青训营的学习,让我对这些知识有了更深刻的了解。
Go依赖管理的发展历程
Go依赖管理历经了GOPATH、Go Vendor、Go Module三个阶段,从Go 1.16开始,默认使用Go Module进行依赖管理,所以我们只需要学好Go Module就好了。
版本号与依赖配置
Go Module中支持两种方式配置依赖版本。语义化版本中,版本规则与github版本规则相似,MAJOR表示一个主版本,通常来说,即使是相同的库,不同MAJOR版本也可以认为是不同的模块(有点像Python2与Python3的关系),两个MAJOR版本之间不保证兼容性。MINOR版本通常是新增函数或者功能,需要保证向后的兼容。PATCH则通常是补丁修复。基于commit的伪版本中,可以具体指定到某一次commit的内容,前缀是语义化版本,中间是commit的时间戳,后面则是12位的commit哈希前缀。
在进行编译的时候,Go会选择最低兼容版本的库来进行编译,而不是我们认为中的使用各个子模块自己依赖的库进行编译。
Go测试
测试是保证程序质量最重要的方法。
Go单元测试
Go中集成了一个单元测试的框架,我们只需要将测试文件以_test.go结尾,所有的测试函数都以Test开头,就可以很方便地编写单元测试用例。
assert
Go没有自带的断言,需要依赖第三方库
覆盖率
在go test命令后面加上 --cover,就可以打印出测试的覆盖率,如go test -run 2A --cover
Mock
测试的时候,通常需要保证幂等性,即对同一个接口的多次调用都会返回相同的结果,但是,有些接口会有外部依赖,如数据库、文件系统等,这个时候我们就没法保证接口的稳定,因此需要Mock出一些虚拟的数据库、文件调用等,这个时候就可以用到monkey这个库,他可以让我们很方便地模拟出一些接口调用,具体方式是通过反射将函数地址替换为运行时地址来实现的。通过monkey,我们可以轻易地解除测试对本地文件的依赖。
基准测试
Go同样提供了Benckmark的工具,使用方式和单元测试差不多,只不过函数需要以Benchmark开头。