go - 如何构建程序作为测试的一部分
问题描述
我想测试一个函数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
等,但我真的很高兴将潜在错误/复杂性的可能性降到最低,并且尽可能地便携。
解决方案
没有公共编译器 API。
测试您的应用程序的最简单方法是调用/运行系统上的现有二进制文件。
如果您不想依赖它,另一种选择是让您的测试创建/将二进制文件写入临时文件夹,测试您的功能,然后删除临时文件。这可以使用该ioutil.TempFile()
功能轻松/自动完成。
创建这个临时二进制文件可能是也可能不是 Go 编译过程。由于这是 Go 测试的一部分,因此 Go SDK 应该已经安装在您的系统中,因此调用go
应该不成问题。
您的测试还可能包含一个很小的、可运行的可执行文件的内容,测试可以将其“转储”到临时文件中。此类微小的二进制文件可能小至 100 字节,例如,请参阅Smallest x86 ELF Hello World。有关如何将数据捆绑到 Go 应用程序中,请参阅在 Go 程序中捆绑静态资源的最佳方式是什么?
推荐阅读
- javascript - 从数组中删除所有出现的值的最快方法是拼接它最快还是过滤更快?
- javascript - 无法弄清楚如何根据用户的回答计算总分
- python - Web beautifulsoup 请求抓取速度太慢
- c - 我想知道如何在 C 中处理这些函数。我尝试解决它们但失败了
- google-cloud-platform - GCP:关于如何在长时间运行的过程完成后发布 pub/sub 消息的想法
- javascript - Django 中的通知
- sql - 如何使印刷符号与 sqlExecute 等 ODBC 查询一起使用?
- python - 获取Python矩阵数组中值的(i,j)索引的最快方法?
- git - 如何在从 13.1 开始的服务器端 Gitlab 全局挂钩中获取组和存储库名称
- python - Python3 AttributeError:模块“信号”没有属性“getsignal”