go依赖管理与测试 | 青训营笔记

192 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

1 go依赖管理

1.1 Go依赖管理的三个阶段

1.1.1 GOPATH

Go 1.5之前,主要使用GOPATH来管理包的位置。此时如果使用go get命令安装第三方包,则该第三方依赖的源码会放到$GOPATH/src下,当你的项目进行编译时,则会自动去$GOPATH底下找到该依赖包。但是所有项目必须都在$GOPATH下,否则编译器找不到对应的依赖包;否则的话,你就要将你的项目路径添加到$GOPATH中,这对于开发者来说无疑是做了很多重复无意义的工作的。

1.1.2 Vendor

基于以上GOPATH依赖管理存在的问题,在Go 1.5提出在项目目录下引入vendor文件夹存放第三方包,将第三方依赖的源码放到该文件夹底下,不同的项目有属于他们自己的vendor文件夹。 但是每个项目都有一个vendor文件夹,随着项目越来越大,代码库也会越来越大,有时只是依赖某个第三包的某个小功能,却需要将整个第三方依赖都下载下来放在项目目录下,造成冗余。

1.1.3 mod

go module是 Go 1.11 版本之后官方推出的版本管理工具,在 Go 1.13以后成为Go语言默认的依赖管理工具。

1.2 go mod

1.2.1 go.mod文件

go.mod文件定义module路径以及列出其他需要在build时引入的模块的特定的版本,还可以指定要替换和排除的版本。

1.2.2 GO111MODULE环境变量

要启用go module模式需要设置环境变量 GO111MODULE,通过它了开启或关闭模块支持,其有三种模式onoffauto,默认值为auto

go env -w GO111MODULE=on

1.2.3 三种模式

  • off:禁用MODULE支持,编译时会从GOPATH和vendor文件下寻找包
  • on:启用MODULE支持,编译时会忽略GOPATH和vendor,使用go.mod下载依赖。此时GOPATH不再充当导入的角色,当仍然承担存放第三方依赖源码的角色,会将第三方依赖源码放在$GOPATH/pkg/mod下
  • auto:当项目在$GOPATH/src目录外,且项目根目录有go.mod文件时,启用模块支持

2 go单元测试

Go程序主要包含三类测试: 功能测试(test)、基准测试(benchmark,也称性能测试)以及示例测试。 测试源码文件的主名称应该以被测试源码文件的主名称为前导, 并且必须以“_test”为后缀,如被测试的源码文件名是demo.go 那么测试源码文件名是demo_test.go

2.1 示例

main.go

package main

import (
    "fmt"
)

func main() {
    fmt.Println(Sum(4,5))
}

func Sum(a, b int) int {
    return a + b
}

main_test.go

package main

import "testing"

func TestSum(t *testing.T) {
   got := Sum(1, 2)
   want := 4
   if got != want {
      t.Errorf("sum(1,2) == %d,want %d", got, want)
   }
}

要运行测试,只需使用以下go test命令:

go test main_test.go

结果:

image.png