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

gol*_*her 7 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())

}
Run Code Online (Sandbox Code Playgroud)

din*_*lad 10

输出可以是 可以通过运行测试来抑制go test .

$ go help test

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

在本地目录模式下,go test 编译并测试当前目录中找到的包源,然后运行生成的测试二进制文件。在此模式下,缓存(下面讨论)被禁用。包测试完成后,go test 会打印一个摘要行,显示测试状态(“ok”或“FAIL”)、包名称和已用时间。

在包列表模式下,go test 编译并测试命令行上列出的每个包。如果包测试通过,则 go test 仅打印最后的“ok”摘要行。如果包测试失败, go test 会打印完整的测试输出。如果使用 -bench 或 -v 标志调用,go test 即使通过包测试也会打印完整的输出,以便显示请求的基准测试结果或详细日志记录。


Grz*_*Żur 9

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

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)
 }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*hov 8

os.Stdoutfmt.Printf和其他人使用的只是一个变量.因此,您可以随时覆盖它,并在必要时将其恢复.https://golang.org/pkg/os/#pkg-variables

  • 如果只想丢弃它,请使用:`os.Stdout,_ = os.Open(os.DevNull)` (5认同)

kos*_*tya 5

不完全是您所要求的,但仍然可能有帮助。

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

我还建议使用log包打印到控制台myshow.LoadPath。然后,您可以通过使用设置自定义编写器来禁用(或捕获)测试中的输出log.SetOutput