go - 如何构建程序作为测试的一部分

标签 go build

我想测试一个函数 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/

相关文章:

go - go 模块是否意味着作为可执行程序或包安装?

在 Mac OS X 10.6.8 上构建 android 2.1 期间出现 java.lang.OutOfMemoryError

java - Gradle 找不到tools.jar

java - 将 Eclipse 项目划分为几个模块后,构建性能下降

build - 如何从 TeamCity 上的 Artifact 路径中排除文件夹?

go - 当我将外部结构的实例传递给外部结构实现的接口(interface) slice 时,无法访问嵌入式结构

Golang slice 附加和重新分配

http - 发送 POST 请求时出现意外的 EOF

go - 如何正确模拟导入的库?

c - 在 C 中包含源文件