Тестирование

Писать программы — не просто. Даже самые лучшие программисты, зачастую, не в состоянии написать программу так, чтобы она работала как положено в любых случаях. Поэтому, важной частью процесса разработки является тестирование. Написание тестов для нашего кода является отличным способом повышения его качества и стабильности.

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из предыдущей главы.

results matching ""

    No results matching ""