我想测试一个函数 callProgram
执行二进制文件并正确处理输出。
为此,我最初的想法是像这样编译原始代码:
package mytest
import (
"testing"
)
const (
binary_code = `
package main
func main() {
// Glorious processing ...
}
`
)
func TestCall(t *testing.T) {
p := buildTestProgram(binary_code, "~/testbinary")
defer p.Delete()
callProgram("~/testbinary")
}
我查看了 build 命令 (runBuild
),它的实现非常简单。问题是,它存在于 internal
命名空间中,cmd/go
似乎没有公开任何调用 runBuild
或类似方法的方式。
所以我的问题是如何测试某个二进制文件并尽可能少地与托管系统交互。
是的,我可以下载一个预构建的二进制文件,执行 go build
等,但我真的很乐意将潜在错误/复杂性的可能性降到最低,并尽可能保持可移植性。
最佳答案
没有公共(public)编译器 API。
测试您的应用程序的最简单方法是调用/运行系统上的现有二进制文件。
如果您不想依赖它,另一种选择是让您的测试创建/写入一个二进制文件到一个临时文件夹中,测试您的功能,然后删除该临时文件。这可以使用 ioutil.TempFile()
轻松/自动完成。功能。
创建这个临时二进制文件可能是也可能不是 Go 编译过程。由于这是 Go 测试的一部分,Go SDK 应该已经安装在您的系统中,因此调用 go
应该不是问题。
您的测试还可能包含一个微小的、可运行的可执行文件的内容,测试可以将其“转储”到一个临时文件中。这种微小的二进制文件可能只有 100 个字节,例如,请参见 Smallest x86 ELF Hello World .有关如何将数据捆绑到 Go 应用程序中的信息,请参阅 What's the best way to bundle static resources in a Go program?
关于go - 如何构建程序作为测试的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56218649/