Метод testing.T.Fatalf

Метод testing.T.Fatalf используется для логирования фатальной ошибки в тестах Go. Он принимает строку формата и аргументы для подстановки, работая аналогично fmt.Printf. После вызова этого метода тест немедленно завершается, а все последующие проверки в текущей функции теста не выполняются.

В первый параметр передается строка шаблона с заполнителями вида %v, %d или другими спецификаторами из пакета fmt. Во второй параметр и далее передаются значения, которые будут подставлены в шаблон. Метод полезен для вывода детализированных сообщений об ошибках с конкретными значениями переменных.

Синтаксис

got.Fatalf(format string, args ...interface{})

Пример

Давайте проверим, что функция вычисления суммы работает правильно. Если результат не совпадает с ожидаемым, завершим тест с сообщением:

gopackage main

import (
  "testing"
)

func sum(a, b int) int {
  return a + b
}

func TestSum(t *testing.T) {
  result := sum(10, 20)
  expected := 30

  if result != expected {
    t.Fatalf("sum(%d, %d) = %d; expected %d", 10, 20, result, expected)
  }
}

Если тест завершится ошибкой, в выводе будет сообщение:

go"sum(10, 20) = 25; expected 30"

Пример

Продемонстрируем использование t.Fatalf с несколькими типами данных при тестировании функции деления на ноль:

gopackage main

import (
  "fmt"
  "testing"
)

func divide(a, b int) (int, error) {
  if b == 0 {
    return 0, fmt.Errorf("division by zero")
  }
  return a / b, nil
}

func TestDivide(t *testing.T) {
  testCases := []struct {
    name string
    a  int
    b  int
    want int
  }{
    {"positive", 10, 2, 5},
    {"negative", -10, 2, -5},
    {"zero denominator", 10, 0, 0},
  }

  for _, tc := range testCases {
    t.Run(tc.name, func(t *testing.T) {
      got, err := divide(tc.a, tc.b)

      if err != nil {
        t.Fatalf("divide(%d, %d) returned error: %v", tc.a, tc.b, err)
      }

      if got != tc.want {
        t.Fatalf("divide(%d, %d) = %d; want %d", tc.a, tc.b, got, tc.want)
      }
    })
  }
}

При выполнении теста с ошибкой будет выведено сообщение:

go"divide(10, 0) returned error: division by zero"

Пример

Рассмотрим ситуацию, где необходимо проверить наличие элемента в слайсе. Если элемент отсутствует, тест должен завершиться:

gopackage main

import (
  "testing"
)

func contains(s []string, elem string) bool {
  for _, e := range s {
    if e == elem {
      return true
    }
  }
  return false
}

func TestContains(t *testing.T) {
  slice := []string{"a", "b", "c", "d", "e"}
  elem := "z"

  if !contains(slice, elem) {
    t.Fatalf("slice %v does not contain element %q", slice, elem)
  }
}

Результат выполнения теста с ошибкой:

go"slice [a b c d e] does not contain element \"z\""

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

  • метод testing.T.Fatal,
    который логирует сообщение без форматирования и завершает тест
  • метод testing.T.Errorf,
    который логирует отформатированную ошибку, но не завершает тест
  • метод testing.T.Error,
    который логирует ошибку без форматирования и не завершает тест
  • метод testing.T.Logf,
    который логирует отформатированное сообщение без ошибки