Метод testing.T.Log

Метод T.Log записывает произвольное текстовое сообщение в лог теста. Этот метод особенно полезен для отладки — он позволяет сохранять промежуточную информацию о ходе выполнения теста, которая будет видна только в случае его падения или при подробном выводе (с флагом -v). Первый и единственный параметр метода — это сообщение типа any (обычно передают строку), которое необходимо записать в лог.

Синтаксис

got.Log(args ...any)

Метод принимает произвольное количество аргументов любого типа, аналогично fmt.Println. Аргументы объединяются в одну строку с пробелами между ними.

Пример

Рассмотрим простой тест, который проверяет вычисление суммы двух чисел. Внутри теста добавим несколько логов для отслеживания процесса:

gopackage main

import (
  "fmt"
  "testing"
)

func TestSum(t *testing.T) {
  a := 5
  b := 3
  expected := 8

  t.Log("Starting test with values:", a, b)

  result := a + b
  t.Log("Computed sum:", result)

  if result != expected {
    t.Errorf("Sum is incorrect: got %d, want %d", result, expected)
  }

  t.Log("Test completed successfully")
}

Результат выполнения теста с флагом -v:

go"=== RUN   TestSum"
"  sum_test.go:11: Starting test with values: 5 3"
"  sum_test.go:14: Computed sum: 8"
"  sum_test.go:20: Test completed successfully"
"--- PASS: TestSum (0.00s)"
"PASS"

Обратите внимание: логи выводятся только при использовании флага -v. Если запустить тест без него, сообщения не будут отображаться в консоли.

Пример

Продемонстрируем, как логи сохраняются при падении теста даже без флага -v. Создадим тест, который всегда падает:

gopackage main

import (
  "testing"
)

func TestFailWithLogs(t *testing.T) {
  t.Log("This message will be shown because test fails")
  t.Logf("Current value: %d", 42)
  t.Error("Test failed intentionally")
  t.Log("This message will NOT be shown")
}

Результат выполнения теста без флага -v:

go"--- FAIL: TestFailWithLogs (0.00s)"
"  fail_test.go:8: This message will be shown because test fails"
"  fail_test.go:9: Current value: 42"
"  fail_test.go:10: Test failed intentionally"
"FAIL"

Как видно, все сообщения, записанные до вызова Error, были выведены в лог, несмотря на отсутствие флага -v. Сообщение после Error не выводится, так как выполнение теста прерывается.

Пример

Метод T.Log также поддерживает форматирование с использованием аналогии с fmt.Print. Для форматированного вывода удобнее использовать метод T.Logf, но в данном примере покажем простой вывод нескольких значений в одном сообщении:

gopackage main

import (
  "fmt"
  "testing"
)

func TestMultipleLogArgs(t *testing.T) {
  name := "Alice"
  age := 30
  height := 1.75

  t.Log("User info:", "Name:", name, "Age:", age, "Height:", height)
  t.Log("String representation:", fmt.Sprintf("%s is %d years old", name, age))

  if age < 18 {
    t.Error("User is underage")
  }
}

Результат выполнения теста с падением (или с флагом -v):

go"=== RUN   TestMultipleLogArgs"
"  info_test.go:11: User info: Name: Alice Age: 30 Height: 1.75"
"  info_test.go:12: String representation: Alice is 30 years old"
"--- PASS: TestMultipleLogArgs (0.00s)"
"PASS"

Метод автоматически разделяет аргументы пробелами, что делает его удобным для быстрого логирования без лишнего форматирования.

Смотрите также

  • метод T.Logf,
    который позволяет логировать сообщения с форматированием
  • метод T.Error,
    который логирует сообщение об ошибке и продолжает выполнение теста
  • метод T.Fatal,
    который логирует сообщение и немедленно прерывает выполнение теста
  • метод T.Helper,
    который позволяет маркировать функцию как вспомогательную для более точного вывода ошибок