如何为Go(lang)测试捕获或抑制标准输出?
Go测试如何捕获或抑制标准输出 我试着自学围棋(lang)测试。在下面的代码中,myshow.LoadPath将大量信息打印到stdout(这是正常的副作用)。然而,当我运行“go test”时,它确实会产生非常嘈杂的输出。有没有办法抑制或捕获标准输出 作为比较,我从python世界中想到了类似的东西如何为Go(lang)测试捕获或抑制标准输出?,go,Go,Go测试如何捕获或抑制标准输出 我试着自学围棋(lang)测试。在下面的代码中,myshow.LoadPath将大量信息打印到stdout(这是正常的副作用)。然而,当我运行“go test”时,它确实会产生非常嘈杂的输出。有没有办法抑制或捕获标准输出 作为比较,我从python世界中想到了类似的东西 fmt.Printf和其他人使用的os.Stdout只是一个变量。因此,您可以随时覆盖它,并在必要时恢复它 不完全是你想要的,但可能还是有帮助的 您可以在测试方法中使用t.Log()和t.Logf
fmt.Printf
和其他人使用的os.Stdout
只是一个变量。因此,您可以随时覆盖它,并在必要时恢复它 不完全是你想要的,但可能还是有帮助的
您可以在测试方法中使用t.Log
()和t.Logf
()方法。仅当测试失败或设置了-test.v
标志时,才会打印输出
我还建议使用log
包在myshow.LoadPath
中打印到控制台。然后,您可以通过使用log设置自定义writer来禁用(或捕获)测试中的输出。SetOutput
可以
通过使用“go test”运行测试。:
$go帮助测试
在两种不同模式下进行测试运行:本地
在没有包参数的情况下调用时的目录模式(例如,
“go test”)和使用包参数调用时的包列表模式
(例如“go test math”、“go test./…”甚至“go test”。)
在本地目录模式下,go test编译并测试包
在当前目录中找到源,然后运行生成的
测试二进制文件。在此模式下,将禁用缓存(如下所述)。
包测试完成后,go test打印一个摘要行,显示
测试状态(“正常”或“失败”)、包名称和运行时间
在包列表模式下,go test编译并测试每个包
在命令行上列出。如果包测试通过,则进行测试打印
只有最后的“确定”摘要行。如果包测试失败,请进行测试
打印完整的测试输出。如果使用-bench或-v标志调用,则转到
即使通过了包测试,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)
}
}
非常感谢。这很有帮助。我希望测试包中可能有一个可以捕获stdout(alapytest)的特性。这似乎是一件平常的事。如果不可能的话,你的建议看起来会让我向前迈进,我会接受这个答案。老实说,我不知道有什么。但你可以考虑。但是,我假设这正是您想要做的。如果您只想放弃它,请使用以下命令:
os.Stdout,=os.Open(os.DevNull)
虽然您是对的,但这不是我想要的,它通常很有用,而且我不知道这些函数。所以非常感谢。此外,您关于转换为使用myshow.LoadPath日志的建议也得到了很好的采纳。我也从其他人那里得到了这个建议,所以我会按照你的建议去做。
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)
}
}