Golang测试要求详解与最佳实践

Golang测试要求详解与最佳实践 我正在开发一个Go库,它非常轻量。其功能实现不需要任何外部依赖。

不过,为了方便起见,我在我的 *_test.go 文件中使用了 github.com/stretchr/testify/assert

现在,这个库被列在了我的 go.mod 文件的依赖项中。

我在想,使用我库的开发者是否会被强制安装这个依赖项,尽管它仅在测试时需要?

1 回复

更多关于Golang测试要求详解与最佳实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go模块系统中,go.mod文件中的依赖项分为两种:

  1. 普通依赖(代码中直接import的包)
  2. 测试依赖(仅在*_test.go文件中import的包)

当你运行go mod tidy时,Go工具链会自动分析代码,并将仅用于测试的依赖标记为// indirect(如果它是间接依赖)或保留在go.mod中,但其他项目引用你的库时不会下载这些测试依赖

验证示例
假设你的库mylibgo.mod如下:

module github.com/you/mylib

go 1.21

require github.com/stretchr/testify v1.8.4

而你的测试文件mylib_test.go

package mylib

import (
    "testing"
    "github.com/stretchr/testify/assert"
)

func TestAdd(t *testing.T) {
    assert.Equal(t, 3, Add(1, 2))
}

当其他项目引用github.com/you/mylib时,Go工具链只会下载mylib的源代码(不包括testify),因为testify仅出现在*_test.go文件中。

你可以通过以下命令验证

# 在另一个项目中执行
go mod init testapp
echo 'import "github.com/you/mylib"' > main.go
go mod tidy
cat go.mod  # 检查是否包含testify

此时go.mod不会出现testify依赖。

结论

  • 开发者使用你的库时不会强制安装testify
  • Go的模块系统会自动区分生产依赖与测试依赖,确保测试依赖不会传递给下游用户。

注意
如果你的库的非测试代码(如*.go文件)中import了testify,那么它将成为普通依赖,此时所有用户都会被迫下载。请确保testify仅出现在*_test.go文件中。

回到顶部