Подтвердить что ты не робот

Как вы печатаете в тесте 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 и просмотрел руководство, но ничего не нашел.

4b9b3361

Ответ 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()
    }*/
}