Писать программы — не просто. Даже самые лучшие программисты, зачастую, не в состоянии написать программу так, чтобы она работала как положено в любых случаях. Поэтому, важной частью процесса разработки является тестирование. Написание тестов для нашего кода является отличным способом повышения его качества и стабильности.
Go содержит специальную программу, призванную облегчить написание тестов, так
что давайте напишем несколько тестов для пакета, который мы создали в предыдущей
главе. В папке chapter11/math
создайте файл под именем math_test.go
, который
будет содержать следующее:
package math
import "testing"
func TestAverage(t *testing.T) {
var v float64
v = Average([]float64{1,2})
if v != 1.5 {
t.Error("Expected 1.5, got ", v)
}
}
Теперь запустим эту команду:
go test
Вы должны увидеть:
$ go test
PASS
ok golang-book/chapter11/math 0.032s
Команда go test
найдет все тесты для всех файлов в текущей директории и
запустит их. Тесты определяются с помощью добавления Test
к имени функции и
принимают один аргумент типа *testing.T
. В нашем случае, поскольку мы
тестируем функцию Average
, тестирующая функция будет называться TestAverage
.
После определения тестирующей функции пишется код, который должен использовать
тестируемую функцию. Мы знаем, что среднее от [1, 2]
будет 1.5
, это и есть
то, что мы проверяем. Возможно, лучшей идеей будет проверить различные
комбинации чисел, так что давайте немного изменим тестирующую функцию:
package math
import "testing"
type testpair struct {
values []float64
average float64
}
var tests = []testpair{
{ []float64{1,2}, 1.5 },
{ []float64{1,1,1,1,1,1}, 1 },
{ []float64{-1,1}, 0 },
}
func TestAverage(t *testing.T) {
for _, pair := range tests {
v := Average(pair.values)
if v != pair.average {
t.Error(
"For", pair.values,
"expected", pair.average,
"got", v,
)
}
}
}
Это очень распространённый способ написания тестов (больше примеров можно найти
в исходном коде пакетов, поставляемых с Go). Мы создали struct
, представляющий
входы и выходы для функций. Затем мы создали список из этих структур (пар) и
вызвали тестируемую функцию в каждой итерации цикла.
Задачи
Написать хороший набор тестов не всегда легко, но даже сам процесс их написания, зачастую, может выявить много проблем для первой реализации функции. Например, что произойдет с нашей функцией
Average
, если ей передать пустой список ([]float64{}
)? Как нужно изменить функцию, чтобы она возвращала0
в таких случаях?Напишите серию тестов для функций
Min
иMax
из предыдущей главы.