Как вы печатаете в тесте Go, используя пакет тестирования?
Я запускаю тест в Go с инструкцией для печати чего-либо (т.е. для отладки тестов), но ничего не печатает.
func TestPrintSomething(t *testing.T) {
fmt.Println("Say hi")
}
Когда я запускаю проверку на этот файл, это результат:
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
Я googled и просмотрел руководство, но ничего не нашел.
Ответы
Ответ 1
В структурах testing.T
и testing.B
есть .Log
и .Logf
, которые звучат так, как вы ищите. .Log
и .Logf
похожи на fmt.Print
и fmt.Printf
соответственно.
Подробнее см.: http://golang.org/pkg/testing/#pkg-index
fmt.X
печатать утверждения do работать внутри тестов, но вы обнаружите, что их вывод, вероятно, не на экране, где вы ожидаете его найти, и, следовательно, почему вы должны использовать методы ведения журнала в testing
.
Если, как и в вашем случае, вы хотите видеть журналы для тестов, которые не терпят неудачу, вы предоставляете флаг go test
-v
(v для подробностей). Более подробную информацию о флажках тестирования можно найти здесь: http://golang.org/cmd/go/#hdr-Description_of_testing_flags
Ответ 2
Например,
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
Команда go
Описание флажков тестирования
-v
Verbose output: log all tests as they are run. Also print all
text from Log and Logf calls even if the test succeeds.
Тестирование пакетов
func (* T) Журнал
func (c *T) Log(args ...interface{})
Журнал форматирует свои аргументы с использованием форматирования по умолчанию, аналогично Println и записывает текст в журнал ошибок. Текст будет распечатывается только в том случае, если тест не выполняется или установлен флаг -test.v.
Ответ 3
Для тестирования иногда я делаю
fmt.Fprintln(os.Stdout, "hello")
Кроме того, вы можете распечатать на:
fmt.Fprintln(os.Stderr, "hello)
Ответ 4
Файл *_test.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()
}*/
}