Метод testing.T.Run

Метод T.Run выполняет функцию теста как субтест (подтест) с указанным именем. Он принимает два параметра: имя субтеста (тип string) и функцию, которая получает указатель на T для выполнения проверок внутри субтеста. Метод возвращает bool, указывающее, завершился ли субтест успешно (true) или с ошибкой (false).

Синтаксис

gofunc (t *T) Run(name string, f func(t *T)) bool

Пример

Создадим субтест с именем "subtest1" внутри основного теста:

gopackage main

import (
  "testing"
)

func TestMain(t *testing.T) {
  t.Run("subtest1", func(t *testing.T) {
    // Проверка внутри субтеста
    if 2+2 != 4 {
      t.Error("2+2 должно быть 4")
    }
  })
}

Пример

Метод T.Run позволяет выполнять несколько субтестов последовательно. Результат каждого субтеста возвращается отдельно:

gopackage main

import (
  "fmt"
  "testing"
)

func TestMain(t *testing.T) {
  res1 := t.Run("subtest1", func(t *testing.T) {
    if 3*3 != 9 {
      t.Error("3*3 должно быть 9")
    }
  })

  res2 := t.Run("subtest2", func(t *testing.T) {
    if 4+4 != 8 {
      t.Error("4+4 должно быть 8")
    }
  })

  fmt.Println("subtest1 результат:", res1)
  fmt.Println("subtest2 результат:", res2)
}

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

go"subtest1 результат: true"
"subtest2 результат: true"

Пример

Субтесты могут быть вложенными — внутри одного субтеста можно запускать другие субтесты:

gopackage main

import (
  "testing"
)

func TestMain(t *testing.T) {
  t.Run("group", func(t *testing.T) {
    t.Run("subtest1", func(t *testing.T) {
      if 1+1 == 2 {
        // проверка пройдена
      }
    })
    t.Run("subtest2", func(t *testing.T) {
      if 2*3 == 6 {
        // проверка пройдена
      }
    })
  })
}

Пример

С помощью T.Run удобно запускать параллельные тесты вместе с T.Parallel:

gopackage main

import (
  "testing"
)

func TestMain(t *testing.T) {
  t.Run("parallel1", func(t *testing.T) {
    t.Parallel()
    if 5*5 != 25 {
      t.Error("5*5 должно быть 25")
    }
  })

  t.Run("parallel2", func(t *testing.T) {
    t.Parallel()
    if 10/2 != 5 {
      t.Error("10/2 должно быть 5")
    }
  })
}

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

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