用于测试的库是否包含在最终构建中

Are libraries for testing incorporated in final build

我想知道我仅用于测试的库是否会包含在最终构建分发中。我在 go.mod/go.sum 文件中看到依赖项,但我无法检查最终二进制文件。

我猜想 Go 构建工具会以某种方式处理冗余代码,但我没有找到任何证据。

有人可以指出文档中的那个位置或描述行为吗?

官方文档:Command go: Compile packages and dependencies:

When compiling packages, build ignores files that end in '_test.go'.

也来自 testing 的包文档:

To write a new test suite, create a file whose name ends _test.go that contains the TestXxx functions as described here. Put the file in the same package as the one being tested. The file will be excluded from regular package builds but will be included when the “go test” command is run.

构建您的应用甚至不涉及测试文件。所以不,仅从测试中引用的依赖项不包含在可执行二进制文件中。

还有考试难不难?编写一个简单的应用程序,构建它。注意编译后的二进制文件的大小。

添加测试文件,引用一些lib。重新构建,大小不会改变。现在,如果您从应用程序中引用包并再次构建,它会增长。

示例:

package main

func main() {
    println("Hello world")
}

基于 linux (Go 1.13) 构建,大小为:1,148,861 字节.

添加测试:

package main

import (
    "fmt"
    "testing"
    "time"
)

func TestOne(t *testing.T) {
    fmt.Println(time.Now())
}

大小不变。现在将这个 TestOne() 函数(连同所需的导入)添加到主应用程序:大小增加到 2,165,259 字节 .

I'm wondering if the libraries that I use for tests only will be included in the final build distribution. I see dependencies in go.mod/go.sum files but I can't check final binary.

构建二进制文件时,它包含大量附加信息,包括 table 符号。其中符号是代码中可识别的名称。

阅读更多相关内容 https://www.grant.pizza/dissecting-go-binaries/

您可以使用 readelfobjdumpnm 等程序列出导入的包,对于 linux 类系统,对于 windows 系统, executable 文件格式被命名为 PE,您将需要特定的解释器。

查看那两个会话

[mh-cbon@Host-001 pyt] $ cat main.go 
package main

import "fmt"

func main() {
    fmt.Println("hello world!")
}
[mh-cbon@Host-001 pyt] $ go build -o bin
[mh-cbon@Host-001 pyt] $ nm bin | grep testing

使用 testing 包构建的程序

[mh-cbon@Host-001 pyt] $ cat main.go 
package main

import (
    "fmt"
    "testing"
)

func main() {
    fmt.Println("hello world!")
    _ = testing.T{}
}
[mh-cbon@Host-001 pyt] $ go build -o bin
[mh-cbon@Host-001 pyt] $ nm bin | grep testing
00000000004e30e0 R go.itab.*testing.benchTimeFlag,flag.Value
0000000000574b90 B testing.benchmarkMemory
00000000005614b0 D testing.benchTime
0000000000494320 T testing.(*benchTimeFlag).Set