我在Go中运行一个测试,用语句打印一些东西(即用于调试测试),但它没有打印任何东西。
func TestPrintSomething(t *testing.T) {
fmt.Println("Say hi")
}
当我在这个文件上运行go test时,输出如下:
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
我用谷歌搜索过手册,但什么也没找到。
* _t。go文件和其他文件一样是一个go源文件,如果你需要转储复杂的数据结构,你可以每次初始化一个新的日志记录器,这里有一个例子:
// initZapLog is delegated to initialize a new 'log manager'
func initZapLog() *zap.Logger {
config := zap.NewDevelopmentConfig()
config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
config.EncoderConfig.TimeKey = "timestamp"
config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
logger, _ := config.Build()
return logger
}
然后,每次,在每次测试中:
func TestCreateDB(t *testing.T) {
loggerMgr := initZapLog()
// Make logger avaible everywhere
zap.ReplaceGlobals(loggerMgr)
defer loggerMgr.Sync() // flushes buffer, if any
logger := loggerMgr.Sugar()
logger.Debug("START")
conf := initConf()
/* Your test here
if false {
t.Fail()
}*/
}
警告:这里的答案不适用于同时测试多个包。
来自@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/…将按预期输出流。
例如,
package verbose
import (
"fmt"
"testing"
)
func TestPrintSomething(t *testing.T) {
fmt.Println("Say hi")
t.Log("Say bye")
}
go test -v
=== RUN TestPrintSomething
Say hi
--- PASS: TestPrintSomething (0.00 seconds)
v_test.go:10: Say bye
PASS
ok so/v 0.002s
命令去
测试标志的描述
- v
详细输出:在运行所有测试时记录它们。同时打印所有
即使测试成功,也会调用Log和Logf中的文本。
包测试
func (*T) Log
func (c *T) Log(参数…接口{})
Log使用默认格式(类似于Println)格式化其参数,并在错误日志中记录文本。对于测试,只有在测试失败或-test时才会打印文本。设置V标志。对于基准测试,文本总是打印出来,以避免性能依赖于-test的值。v标志。
* _t。go文件和其他文件一样是一个go源文件,如果你需要转储复杂的数据结构,你可以每次初始化一个新的日志记录器,这里有一个例子:
// initZapLog is delegated to initialize a new 'log manager'
func initZapLog() *zap.Logger {
config := zap.NewDevelopmentConfig()
config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
config.EncoderConfig.TimeKey = "timestamp"
config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
logger, _ := config.Build()
return logger
}
然后,每次,在每次测试中:
func TestCreateDB(t *testing.T) {
loggerMgr := initZapLog()
// Make logger avaible everywhere
zap.ReplaceGlobals(loggerMgr)
defer loggerMgr.Sync() // flushes buffer, if any
logger := loggerMgr.Sugar()
logger.Debug("START")
conf := initConf()
/* Your test here
if false {
t.Fail()
}*/
}