将仅在测试文件中引用的测试代码编译为二进制文件吗?

sno*_*uis 3 testing compilation go

我想知道如果使用编译二进制文件,什么代码将被编译成go二进制文件go build ./...。这将编译具有cli程序的二进制文件。对于此cli程序,我有测试代码和非测试代码。我目前有几种测试代码:

  • foo_test.go 包装内 foo_test
  • foo_internal_test.go 包装内 foo
  • testutil.gotestutil提供测试实用程序功能的软件包中

非测试代码中实际上没有引用任何测试代码。testutil函数仅导入测试文件中。

如果测试代码实际上已编译为二进制文件,那么这有多少问题?

小智 7

我相信,如果您在一个无法访问的文件中有一个 init() 函数,它仍然会链接到可执行文件中。

_test.go 文件仍将被排除。

当我们有一些不在 _test 文件中的测试帮助程序代码时,这让我们感到困扰。其中一个有一个 init() 函数,它在可执行文件启动时运行。


Adr*_*ian 5

go二进制文件仅包含从其main()入口点可访问的代码。对于测试二进制文件,main()是测试运行程序。

至于“问题有多严重”,是否包含在内……没有。它会稍微增加二进制文件的大小和编译时间,但不会产生影响-根据定义,未执行的代码无效。

  • 有趣的边缘情况是使用辅助函数进行测试时。这些助手可以导入额外的包。当您仅具有测试依赖项时,它可能会对 prod 与测试代码的大小产生显着差异。我同意,Go 应该消除所有死代码。但是最好明确说明这一点而不是依靠魔法。 (2认同)