首页 > 解决方案 > 如何构建程序作为测试的一部分

问题描述

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

我查看了构建命令 ( runBuild),它的实现非常简单。问题是,它存在于internal名称空间中,并且cmd/go似乎没有公开任何调用方式runBuild或类似方式。

所以我的问题是如何测试某个二进制文件并且还必须尽可能少地与托管系统交互。

是的,我可以下载预构建的二进制文件、执行go build等,但我真的很高兴将潜在错误/复杂性的可能性降到最低,并且尽可能地便携。

标签: gobuild

解决方案


没有公共编译器 API。

测试您的应用程序的最简单方法是调用/运行系统上的现有二进制文件。

如果您不想依赖它,另一种选择是让您的测试创建/将二进制文件写入临时文件夹,测试您的功能,然后删除临时文件。这可以使用该ioutil.TempFile()功能轻松/自动完成。

创建这个临时二进制文件可能是也可能不是 Go 编译过程。由于这是 Go 测试的一部分,因此 Go SDK 应该已经安装在您的系统中,因此调用go应该不成问题。

您的测试还可能包含一个很小的、可运行的可执行文件的内容,测试可以将其“转储”到临时文件中。此类微小的二进制文件可能小至 100 字节,例如,请参阅Smallest x86 ELF Hello World。有关如何将数据捆绑到 Go 应用程序中,请参阅在 Go 程序中捆绑静态资源的最佳方式是什么?


推荐阅读