依赖管理
Go的依赖管理历经GOPATH->GO Vendor->GO Module
GOPATH:相当于一个工作区,我们创建一个项目时需要指定GOPATH,这样在需要依赖某个包时会去GOPATH目录下去查找,其中go get下载的包都会在GOPATH的src目录下, go install都会把对应的包编译到bin目录下
缺点:无法完成对某个包的多版本控制,依赖的包在GOPATH的
src目录下只能存在一个版本
Go Vendor:这是在项目目录下增加一个vendor文件,所有依赖包的副本都会存在这里,寻址方式是vendor->GOPATH 。通过这种方式避免了GOPATH只能存放一个版本包的问题
无法精确的引用外部包进行版本控制,不能指定引用某个特定版本的外部包,只是在开发时将其拷贝过来,但是一旦外部包升级,vendor 下面的包会跟着升级,而且 vendor 下面没有完整的引用包的版本信息, 对包升级带来了无法评估的风险。
GO Module:
有GO Module后在我们运行go run xxx.go时,会自动下载没有安装的依赖。go build、go test 等命令也能自动下载相关依赖包。
go get是先下载依赖。下载所有依赖可以使用 go mod download 命令。依赖升级使用go get -u
删除相关代码片段后并没有在 go.mod 文件中自动移出。需使用go mod tidy,它会扫描目录下的所有依赖重新添加到go.mod文件中
测试
测试分为回归测试、集成测试和单元测试,从上到小覆盖逐渐变大。
回归测试:测试人员通过常见主流的测试场景进行测试
集成测试:通过自动化等手段进行功能测试验证
单元测试:单独对函数和模块做验证
代码覆盖率:用好衡量代码是否都经过测试
比如:
func JudgePassLine(score int16)bool{
if score >= 60{
return true
}
return false
}
JudgePassLine(70)
输入go test judgment_test.go judgment.go --cover会输出代码覆盖率,这里是coverage:66.7%,因为70只会执行2、3两行,第5行不会执行,所以结果就是2/3。
单测侧需要保证稳定性和幂等性,稳定是指相互隔离,能在任何时间,任何环境,运行测试。幂等是指每一次测试运行都应该产生与之前一样的结果而要实现这一目的就要用到mock机制。
比如说要把文件的某类值进行替换,加入删除了改文件,我们写的测试函数就可能失效或不一致,所以需要对函数进行打桩
单元测试的函数名要以Test开头,形参为t *testingT
基准测试的函数名要以Benchmark开头,形参为t *testingB