Функция TestXxx

Функция TestXxx представляет собой тестовую функцию в пакете testing. Она должна начинаться с префикса Test и принимать единственный параметр типа *testing.T. Первым параметром функция принимает указатель на структуру T, которая предоставляет методы для управления ходом выполнения теста и вывода ошибок.

Синтаксис

gofunc TestXxx(t *testing.T) {
  // код теста
}

Имя тестовой функции должно начинаться с Test, за которым следует любая строка, начинающаяся с заглавной буквы. Например, TestSum, TestDivision или TestIsValid.

Пример простого теста

Давайте напишем тест для функции, которая складывает два числа:

gopackage main

import (
  "testing"
)

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

func TestAdd(t *testing.T) {
  res := Add(2, 3)
  if res != 5 {
    t.Errorf("Add(2, 3) = %d; want 5", res)
  }
}

Результат выполнения команды go test:

go"PASS"

Если тест проваливается, мы увидим сообщение об ошибке, переданное через t.Errorf.

Пример с несколькими тестами

Используя t.Run, можно запускать подтесты в одной функции:

gopackage main

import (
  "testing"
)

func IsEven(x int) bool {
  return x%2 == 0
}

func TestIsEven(t *testing.T) {
  tests := []struct {
    name string
    arg  int
    want bool
  }{
    {"even number", 4, true},
    {"odd number", 5, false},
  }
  for _, tt := range tests {
    t.Run(tt.name, func(t *testing.T) {
      res := IsEven(tt.arg)
      if res != tt.want {
        t.Errorf("IsEven(%d) = %v; want %v", tt.arg, res, tt.want)
      }
    })
  }
}

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

go"PASS"

Такой подход позволяет выполнять каждый подтест независимо и видеть, какой именно из них провалился.

Пример с использованием t.Log

Для отладки теста можно использовать t.Log и t.Logf, чтобы выводить дополнительную информацию:

gopackage main

import (
  "testing"
)

func Max(a, b int) int {
  if a > b {
    return a
  }
  return b
}

func TestMax(t *testing.T) {
  res := Max(10, 20)
  t.Logf("Max(10, 20) = %d", res)
  if res != 20 {
    t.Errorf("Max(10, 20) = %d; want 20", res)
  }
}

Результат выполнения команды go test -v:

go"=== RUN   TestMax\n  TestMax: testing_test.go:12: Max(10, 20) = 20\n--- PASS: TestMax (0.00s)\nPASS"

Флаг -v выводит всё, что передано в t.Log, что помогает отслеживать промежуточные результаты выполнения теста.

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

  • структуру testing.T,
    которая предоставляет методы для управления тестом и вывода ошибок
  • метод testing.T.Error,
    который отмечает тест как проваленный с выводом сообщения
  • метод testing.T.Errorf,
    который форматирует сообщение об ошибке по шаблону
  • метод testing.T.Log,
    который выводит лог-сообщение при выполнении теста