如何在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 即使通过包测试也会打印完整的输出,以便显示请求的基准测试结果或详细日志记录。
为了在测试期间抑制输出,我使用以下代码。我修复了输出和日志记录。测试完成后,它会重置输出流。
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)
os.Stdout
fmt.Printf
和其他人使用的只是一个变量.因此,您可以随时覆盖它,并在必要时将其恢复.https://golang.org/pkg/os/#pkg-variables
不完全是您所要求的,但仍然可能有帮助。
您可以在测试方法中使用t.Log
(http://golang.org/pkg/testing/#T.Log)和t.Logf
(http://golang.org/pkg/testing/#T.Logf )方法。仅当测试失败或-test.v
设置了标志时才会打印输出。
我还建议使用log
包打印到控制台myshow.LoadPath
。然后,您可以通过使用设置自定义编写器来禁用(或捕获)测试中的输出log.SetOutput