Функция TestXxx
Функция TestXxx представляет собой тестовую функцию в пакете testing.
Она должна начинаться с префикса Test и принимать единственный параметр
типа *testing.T. Первым параметром функция принимает указатель на
структуру T, которая предоставляет методы для управления ходом выполнения
теста и вывода ошибок.
Синтаксис
func TestXxx(t *testing.T) {
// код теста
}
Имя тестовой функции должно начинаться с Test, за которым следует любая
строка, начинающаяся с заглавной буквы. Например, TestSum,
TestDivision или TestIsValid.
Пример простого теста
Давайте напишем тест для функции, которая складывает два числа:
package 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:
"PASS"
Если тест проваливается, мы увидим сообщение об ошибке, переданное через
t.Errorf.
Пример с несколькими тестами
Используя t.Run, можно запускать подтесты в одной функции:
package 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)
}
})
}
}
Результат выполнения кода:
"PASS"
Такой подход позволяет выполнять каждый подтест независимо и видеть, какой именно из них провалился.
Пример с использованием t.Log
Для отладки теста можно использовать t.Log и t.Logf,
чтобы выводить дополнительную информацию:
package 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:
"=== 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,
который выводит лог-сообщение при выполнении теста