这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
二、依赖管理
gopath、govender、go mod中go mod依赖管理三要素如下:
- 配置文件 go.mod
- 中心仓库管理依赖库
- 本地工具 go get/mod
go.mod文件里面有三个部分,第一行表示该依赖管理的基本单元。下面是使用的go的版本。最下面是依赖的其他库,放在了require里面。
modoule example/project/app
go 1.16
require(
example/lib1 v1.1.2
example/lib2 v0.1.0-20190725025543-bacd9c7ef1dd
)
require里的信息有两部分,一部分是库的路径,另一个部分是版本号。这里版本号又有两种,第一种是标准的版本号:{Major}.{Minor}.{Patch}。其中major表示大版本,同一个大版本下面的库是兼容的。minor表示小版本,一般新增一些功能和函数,patch是小补丁。第二种是基于commit伪版本号,这种版本号会在后面附上git提交的版本hash。
go get和go mod是依赖管理的两个工具,其中go get能直接拉取需要的依赖。
go get example.org/pkg
还可以在后面加上@v1.1.1来拉取指定版本的依赖
go mod是管理项目中的依赖,有几个常用的命令:
- go mod init 初始化项目,用go mod管理
- go mod download 下载依赖到缓存
- go mod tidy 下载没有的依赖,并且删除不需要的依赖
三 测试
3.1 单元测试
所有的测试文件都以_test.go结尾;所有的测试函数都以Test开头;初始化逻辑放到TestMain中。
代码覆盖率:指的是测试的时候测试了多少行代码,在实际应用中一般50%~60%,较高80%
下面是一个例子,这里判断结果与预期是否符合用了一个第三方库:github.com/stretchr/te…
func TestJudgePassLineTrue(t *testing.T) {
isPass := JudgePassLine(70)
if isPass != true {
t.Errorf("Expect %t, get %t", true, false)
}
}
func TestJudgePassLineFalse(t *testing.T) {
isPass := JudgePassLine(50)
if isPass != false {
t.Errorf("Expect %t, get %t", true, false)
}
}
3.2 Mock
外部依赖用mock测试,这里介绍了monkey这个第三方库github.com/bouk/monkey
打桩就是当测试代码里面有一些库函数没有实现,这时候需要我们用一个桩函数替换来测试这些代码。桩函数是一些非常简单的函数,只是为了保持接口返回值什么的匹配而已。比如一个a+b的函数func1,库函数还没有实现这个函数,那么我们可以设置一个桩函数,接口与a+b一样,但是直接返回0。