如何在 Go(lang) 测试中捕获或抑制标准输出?

如何在 Go 测试中捕获或抑制标准输出?


我正在尝试自学 go(lang) 测试。在下面的代码中,myshow.LoadPath 将大量信息打印到标准输出(这是正常的副作用)。然而,当我运行“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())


}


慕后森
浏览 348回答 3
3回答

喵喵时光机

为了在测试期间抑制输出,我使用以下代码。我修复了输出和日志记录。测试完成后,它会重置输出流。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) }}

慕慕森

可以 通过使用以下命令运行测试来抑制输出go test .:$ go help testGo 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 也会打印完整输出,以显示请求的基准测试结果或详细日志记录。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go