如何测试" main()"常规来自"去测试"?

时间:2016-07-26 07:52:12

标签: testing go

我希望通过编写一些反向测试来锁定我的 golang 程序的面向用户的命令行API,这些测试将专注于测试我的二进制文件。什么测试"二进制作为一个整体"意味着go-test应该:

  1. 能够将STDIN提供给我的二进制文件
  2. 能够检查我的二进制文件是否产生正确的STDOUT
  3. 能够确保二进制
  4. 正确处理错误案例

    但是,对我来说,在 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])
    

3 个答案:

答案 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.StdinPipeStdinPipe / StdouPipehttps://golang.org/pkg/os/exec/#Cmd.StdoutPipehttps://golang.org/pkg/os/exec/#Cmd.StderrPipe)来提供所需的输入并验证输出。包文档页面https://golang.org/pkg/os/exec/上的示例应该为您提供一个很好的起点。

但是,编译程序的测试超出了单元测试的范围,因此值得考虑更常用于功能/验收测试的其他工具(不一定是基于Go的),例如Cucumber http://cucumber.io