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

如何为Go(lang)测试捕获或抑制标准输出?,go,Go,Go测试如何捕获或抑制标准输出 我试着自学围棋(lang)测试。在下面的代码中,myshow.LoadPath将大量信息打印到stdout(这是正常的副作用)。然而,当我运行“go test”时,它确实会产生非常嘈杂的输出。有没有办法抑制或捕获标准输出 作为比较,我从python世界中想到了类似的东西 fmt.Printf和其他人使用的os.Stdout只是一个变量。因此,您可以随时覆盖它,并在必要时恢复它 不完全是你想要的,但可能还是有帮助的 您可以在测试方法中使用t.Log()和t.Logf

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

我试着自学围棋(lang)测试。在下面的代码中,myshow.LoadPath将大量信息打印到stdout(这是正常的副作用)。然而,当我运行“go test”时,它确实会产生非常嘈杂的输出。有没有办法抑制或捕获标准输出

作为比较,我从python世界中想到了类似的东西


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)
 }
}