如何在Go(lang)测试中捕获或抑制stdout?

时间:2015-07-27 21:00:58

标签: go

如何在Go测试中捕获或抑制stdout?

我正在努力教自己去(郎)测试。在下面的代码中,myshow.LoadPath向stdout打印了大量信息(这是一种正常的副作用)。但是,当我运行“go test”时,它会产生非常嘈杂的输出吗?有没有办法来抑制或捕获标准输出?

为了比较,我正在考虑来自python世界的这样的东西。 http://pytest.org/latest/capture.html#captures

package slideshow_test

import (
    "os"
    "testing"

    "github.com/golliher/go-hpf/slideshow"
)

func setupTest() {
    myshow := slideshow.Slideshow{Name: "This is my show"}
    myshow.LoadPath("..")

}

func TestStub(t *testing.T) {
    if true == false {
        t.Fail()
    }
}

func TestMain(m *testing.M) {
    setupTest()
    os.Exit(m.Run())

}

4 个答案:

答案 0 :(得分:8)

fmt.Printf和其他人使用的

{{1}}只是一个变量。因此,您可以随时覆盖它,并在必要时将其恢复。 https://golang.org/pkg/os/#pkg-variables

答案 1 :(得分:2)

不完全符合您的要求但仍有帮助。

您可以在测试方法中使用t.Loghttp://golang.org/pkg/testing/#T.Log)和t.Logfhttp://golang.org/pkg/testing/#T.Logf)方法。仅当测试失败或设置了-test.v标志时才会打印输出。

我还建议使用log包打印到myshow.LoadPath中的控制台。然后,您可以通过使用log.SetOutput

设置自定义编写器来禁用(或捕获)测试中的输出

答案 2 :(得分:0)

输出可以为suppressed 通过使用go test .运行测试:

  

$ go help test

     

Go测试以两种不同的模式运行:本地   没有包参数的情况下调用目录模式(例如,   'go test'),以及使用包参数调用时的包列表模式   (例如“ go test math”,“ go test。/ ...”,甚至是“ go test。”)。

     

在本地目录模式下,进行测试以编译和测试程序包   在当前目录中找到源,然后运行结果   测试二进制文件。在这种模式下,缓存(如下所述)被禁用。   包测试完成后,去测试打印摘要行,显示   测试状态(“确定”或“失败”),软件包名称和经过时间。

     

在包列表模式下,测试编译并测试每个包   在命令行中列出。如果包装测试通过,请进行测试打印   只有最后的“确定”摘要行。如果套件测试失败,请进行测试   打印完整的测试输出。如果使用-bench或-v标志调用,请转到   测试即使通过包测试也可以按顺序打印完整的输出   以显示请求的基准测试结果或详细的日志记录。

答案 3 :(得分:0)

为了在测试期间抑制输出,我使用以下代码。我修复输出以及日志记录。测试完成后,它将重置输出流。

func TestStartStowWrongCommand(t *testing.T) {
 defer quiet()()   
 ...                      
}

func quiet() func() {
 null, _ := os.Open(os.DevNull)
 sout := os.Stdout
 serr := os.Stderr
 os.Stdout = null
 os.Stderr = null
 log.SetOutput(null)
 return func() {
  defer null.Close()
  os.Stdout = sout
  os.Stderr = serr
  log.SetOutput(os.Stderr)
 }
}