Метод testing.T.Helper

Метод testing.T.Helper сигнализирует системе тестирования Go, что текущая функция является вспомогательной. Когда тест завершается с ошибкой внутри такой функции, фреймворк отображает сообщение об ошибке с указанием строки, где была вызвана вспомогательная функция, а не строки внутри нее. Это значительно упрощает отладку, так как разработчик видит реальное место проблемы в основном тесте.

Синтаксис

got.Helper()

Метод не принимает параметров и ничего не возвращает. Он вызывается внутри вспомогательной функции перед выполнением каких-либо проверок.

Пример

В этом примере мы создадим вспомогательную функцию для проверки четности числа и используем t.Helper, чтобы ошибка указывала на вызов в тесте, а не на код внутри функции:

gopackage main

import (
  "testing"
)

func assertEven(t *testing.T, num int) {
  t.Helper()
  if num%2 != 0 {
    t.Errorf("number %d is not even", num)
  }
}

func TestEvenNumbers(t *testing.T) {
  assertEven(t, 4)
  assertEven(t, 7)
}

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

go--- FAIL: TestEvenNumbers (0.00s)
  main_test.go:14: number 7 is not even

Сообщение об ошибке указывает на строку 14, где вызывается assertEven(t, 7), а не на строку внутри assertEven. Без вызова t.Helper ошибка указывала бы на строку с t.Errorf внутри вспомогательной функции.

Пример

Рассмотрим пример с несколькими вспомогательными функциями. Здесь мы проверяем длину строки и используем t.Helper для каждой из них:

gopackage main

import (
  "testing"
)

func assertLength(t *testing.T, str string, expected int) {
  t.Helper()
  if len(str) != expected {
    t.Errorf("length of '%s' is %d, expected %d", str, len(str), expected)
  }
}

func assertNotEmpty(t *testing.T, str string) {
  t.Helper()
  if len(str) == 0 {
    t.Error("string is empty")
  }
}

func TestStringLength(t *testing.T) {
  assertLength(t, "abcde", 5)
  assertNotEmpty(t, "abcde")

  assertLength(t, "12345", 6)
  assertNotEmpty(t, "12345")
}

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

go--- FAIL: TestStringLength (0.00s)
  main_test.go:20: length of '12345' is 5, expected 6

Как видно, ошибка указывает на строку 20, где вызывается assertLength(t, "12345", 6), что позволяет сразу увидеть неверное ожидание в тесте, а не копаться во вспомогательной функции.

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

  • метод testing.T.Error,
    который сообщает об ошибке в тесте без его остановки
  • метод testing.T.Fatal,
    который завершает тест с ошибкой
  • метод testing.T.Log,
    который выводит сообщение в лог теста
  • метод testing.T.Run,
    который запускает подтест