Golang中测试包专用的外部模块会在发布版本中被编译吗?
Golang中测试包专用的外部模块会在发布版本中被编译吗? 例如,我想使用 go-cmp 包,但我仅在测试中需要它。如果我在测试之外从未使用过它,它会被包含在编译后的二进制文件中吗?
2 回复
测试文件(以 *_test.go 结尾的文件)在编译过程中会被特殊对待。它们会被单独链接,并且可以访问用于测试目的的内部包,例如 go-cmp。
更多关于Golang中测试包专用的外部模块会在发布版本中被编译吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,专用于测试的外部模块不会包含在最终发布版本的二进制文件中。Go编译器通过文件后缀和构建约束来区分测试代码,确保测试依赖不会增加生产二进制文件的大小。
具体来说:
- 以
_test.go结尾的文件仅在运行测试时编译 go test命令会编译测试文件和被测试的包go build命令会忽略所有测试文件
示例:
// main.go - 生产代码
package main
func main() {
result := Add(2, 3)
println(result)
}
func Add(a, b int) int {
return a + b
}
// main_test.go - 测试代码
package main
import (
"testing"
"github.com/google/go-cmp/cmp"
)
func TestAdd(t *testing.T) {
result := Add(2, 3)
expected := 5
if diff := cmp.Diff(result, expected); diff != "" {
t.Errorf("Add() mismatch (-want +got):\n%s", diff)
}
}
在这个例子中:
- 运行
go build时,只会编译main.go,不会包含go-cmp包 - 运行
go test时,会编译main_test.go并包含go-cmp依赖 - 最终的二进制文件大小不会受到测试依赖的影响
验证方法:
# 查看二进制文件是否包含go-cmp符号
go build -o app
strings app | grep -i cmp # 应该没有输出
# 对比测试编译
go test -c -o app.test
strings app.test | grep -i cmp # 会有go-cmp相关的字符串
因此,你可以安全地在测试中使用 go-cmp 或其他测试专用依赖,它们不会影响生产环境的二进制文件。

