Метод testing.T.Fatalf
Метод testing.T.Fatalf используется для логирования фатальной ошибки
в тестах Go. Он принимает строку формата и аргументы для подстановки,
работая аналогично fmt.Printf. После вызова этого метода
тест немедленно завершается, а все последующие проверки в текущей
функции теста не выполняются.
В первый параметр передается строка шаблона с заполнителями вида
%v, %d или другими спецификаторами из пакета fmt.
Во второй параметр и далее передаются значения, которые будут подставлены
в шаблон. Метод полезен для вывода детализированных сообщений об ошибках
с конкретными значениями переменных.
Синтаксис
t.Fatalf(format string, args ...interface{})
Пример
Давайте проверим, что функция вычисления суммы работает правильно. Если результат не совпадает с ожидаемым, завершим тест с сообщением:
package 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)
}
}
Если тест завершится ошибкой, в выводе будет сообщение:
"sum(10, 20) = 25; expected 30"
Пример
Продемонстрируем использование t.Fatalf с несколькими типами данных
при тестировании функции деления на ноль:
package 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)
}
})
}
}
При выполнении теста с ошибкой будет выведено сообщение:
"divide(10, 0) returned error: division by zero"
Пример
Рассмотрим ситуацию, где необходимо проверить наличие элемента в слайсе. Если элемент отсутствует, тест должен завершиться:
package 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)
}
}
Результат выполнения теста с ошибкой:
"slice [a b c d e] does not contain element \"z\""
Смотрите также
-
метод
testing.T.Fatal,
который логирует сообщение без форматирования и завершает тест -
метод
testing.T.Errorf,
который логирует отформатированную ошибку, но не завершает тест -
метод
testing.T.Error,
который логирует ошибку без форматирования и не завершает тест -
метод
testing.T.Logf,
который логирует отформатированное сообщение без ошибки