我希望通过编写一些反向测试来锁定我的 golang 程序的面向用户的命令行API,这些测试将专注于测试我的二进制文件。什么测试"二进制作为一个整体"意味着go-test应该:
但是,对我来说,在 go 中执行此操作的最佳做法并不明显?如果有一个很好的 go 测试示例,你能指点我吗?
P.S。在过去,我一直在使用 autotools 。我正在寻找类似于AT_CHECK的东西,例如:
AT_CHECK([echo "XXX" | my_binary -e arg1 -f arg2], [1], [],
[-f and -e can't be used together])
答案 0 :(得分:5)
只需制作main()
单行:
import "myapp"
func main() {
myapp.Start()
}
正确测试myapp
包。
编辑: 例如,流行的etcd conf服务器使用这种技术:https://github.com/coreos/etcd/blob/master/main.go
答案 1 :(得分:2)
我觉得你太努力了:我只是尝试了以下内容
func TestMainProgram(t *testing.T) {
os.Args = []string{"sherlock",
"--debug",
"--add", "zero",
"--ruleset", "../scripts/ceph-log-filters/ceph.rules",
"../scripts/ceph-log-filters/ceph.log"}
main()
}
它工作得很好。我可以很容易地从中进行正常的表格测试或goConvey BDD ......
答案 2 :(得分:1)
如果您真的想在Go中进行此类测试,可以使用Go os/exec
package https://golang.org/pkg/os/exec/来执行二进制文件并将其作为一个整体进行测试 - 例如,执行{{1}命令。基本上它将相当于在Go中完成的shell脚本。您可以使用go run main.go
https://golang.org/pkg/os/exec/#Cmd.StdinPipe和StdinPipe
/ StdouPipe
(https://golang.org/pkg/os/exec/#Cmd.StdoutPipe和https://golang.org/pkg/os/exec/#Cmd.StderrPipe)来提供所需的输入并验证输出。包文档页面https://golang.org/pkg/os/exec/上的示例应该为您提供一个很好的起点。
但是,编译程序的测试超出了单元测试的范围,因此值得考虑更常用于功能/验收测试的其他工具(不一定是基于Go的),例如Cucumber http://cucumber.io。