如何在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())
}
答案 0 :(得分:8)
fmt.Printf
和其他人使用的{{1}}只是一个变量。因此,您可以随时覆盖它,并在必要时将其恢复。 https://golang.org/pkg/os/#pkg-variables
答案 1 :(得分:2)
不完全符合您的要求但仍有帮助。
您可以在测试方法中使用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
答案 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)
}
}