我在Go语言中运行了一个测试,用一条语句来打印一些东西(例如,调试测试),但是它什么也没有打印。
func TestPrintSomething(t *testing.T) {
fmt.Println("Say hi")
}
当我在这个文件上运行go测试时,输出如下:
ok command-line-arguments 0.004s
据我所知,真正打印它的唯一方法是通过t.Error()打印它,如下所示:
func TestPrintSomethingAgain(t *testing.T) {
t.Error("Say hi")
}
它输出以下内容:
Say hi
--- FAIL: TestPrintSomethingAgain (0.00 seconds)
foo_test.go:35: Say hi
FAIL
FAIL command-line-arguments 0.003s
gom: exit status 1
我在谷歌上搜索了一下说明书,但什么也没找到。
8条答案
按热度按时间k3bvogb11#
*_test.go
文件和其他文件一样是Go语言的源代码,如果你需要转储复杂的数据结构,你可以每次初始化一个新的记录器,这里是一个例子:然后,每一次,每一次测试:
cetgtptt2#
结构体
testing.T
和testing.B
都有一个.Log
和.Logf
方法,听起来就是您要查找的。.Log
和.Logf
分别与fmt.Print
和fmt.Printf
类似。See more details here: http://golang.org/pkg/testing/#pkg-index
fmt.X
print语句确实在测试内部工作,但是您会发现它们的输出可能不在您期望找到它的屏幕上,因此,您应该使用testing
中的日志记录方法。If, as in your case, you want to see the logs for tests that are not failing, you have to provide
go test
the-v
flag (v for verbosity). More details on testing flags can be found here: https://golang.org/cmd/go/#hdr-Testing_flagsc86crjj03#
例如,
Command go
测试标志说明
Package testing
函数(*T)日志
日志使用默认格式设置其参数的格式(类似于Println),并在错误日志中记录文本。对于测试,仅当测试失败或设置了-test.v标志时才打印文本。对于基准,始终打印文本以避免性能依赖于-test.v标志的值。
iih3973s4#
t.Log()
在测试完成之前不会显示,因此如果您试图调试挂起或性能不佳的测试,似乎需要使用fmt
。是:包括Go 1.13(2019年8月)之前的情况。
在
golang.org
issue 24929中也是如此考虑以下(愚蠢的)自动化测试:
如果我运行
go test -v
,在TestFoo
全部完成之前没有日志输出,然后在TestBar
全部完成之前没有输出,再次在TestBaz
全部完成之前没有输出。如果测试正常运行,这是很好的,但是如果存在某种bug,那么在一些情况下缓冲日志输出会有问题:
如果
TestFoo
很慢(例如,它是一个集成测试),那么直到测试结束之前我都不会得到日志输出,这会显著地减慢迭代。TestFoo
有一个bug,导致它挂起并且永远无法完成,我将不会得到任何日志输出,在这种情况下,t.Log
和t.Logf
根本没有用。这使得调试非常困难。
所以现在我的测试被杀了,日志中没有任何东西可以告诉我发生了什么。
但对于(可能)Go 1.14(2020年第一季度):CL 127120
测试:详细模式下流日志输出
现在的输出为:
正如Dave切尼在“
go test -v
streaming output“中所证明的那样,Go语言1.14中确实存在这种情况:在Go语言1.14中,
go test -v
将在t.Log
输出发生时对其进行流式传输,而不是将其存储到测试运行结束时。在Go语言1.14中,
fmt.Println
和t.Log
行是交错的,而不是等待测试完成,这表明当使用go test -v
时,测试输出是流式传输的。优势,根据戴夫:
对于集成风格的测试来说,这是一个很大的生命质量改进,因为当测试失败时,集成风格的测试经常会长时间地重试。
流式
t.Log
输出将帮助地鼠调试那些测试失败,而不必等到整个测试超时才接收他们的输出。snz8szmq5#
为了测试有时候我会
此外,您还可以打印到:
jpfvwuh46#
t.Log
和t.Logf
确实会在您的测试中打印出来,但由于它们与测试打印在同一行上,因此经常会被忽略。其将其打印到终端,
wooyq4lh7#
如果您使用
testing.M
和相关的安装/拆卸;-v
在这里也是有效的。wpx232ag8#
警告:一次测试多个软件包时,此处的答案不适用。
来自@VonC和@voidlogic的答案非常棒,但我想提醒大家注意以下线索,以防有人正在运行
go test -v ./...
的排列:https://github.com/golang/go/issues/46959问题在于与从多个包运行测试相关的实现细微差别/困难。
例如,运行
go test -v -count=1 -run TestOnlyOneInstanceOfThisTestExists ./multiple/packages/exist/below/...
将仅在测试完成后打印日志。但是,运行
go test -v -count=1 -run TestOnlyOneInstanceOfThisTestExists ./this/path/points/to/one/package/only/...
将按预期流输出。