Тестирование
Писать программы — не просто. Даже самые лучшие программисты, зачастую, не в состоянии написать программу так, чтобы она работала как положено в любых случаях. Поэтому, важной частью процесса разработки является тестирование. Написание тестов для нашего кода является отличным способом повышения его качества и стабильности.
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из предыдущей главы.