Тесты для начинающих в Golang

Сначала давайте начнем с простой проблемы деления.

Наш главный:

import (
    "errors"
    "fmt"
    "log"
)

func main() {

    result, err := divide(100.0, 10.0)
    if err != nil {
        log.Println(err)
        return
    }
    fmt.Println("Result: ", result)
}

func divide(x, y float32) (float32, error) {

    var result float32

    if y == 0 {
        return result, errors.New("divisor cannot be zero")
    }
    result = x / y
    return result, nil
}
Войдите в полноэкранный режим Выход из полноэкранного режима

divide() — это функция, которую мы будем тестировать.
Сначала создадим файл с именем main _test .go, тесты в Go должны следовать этой схеме именования, всегда заканчиваясь _test.go, поэтому, когда мы запускаем тест, компилятор будет знать, что нужно запустить тесты проекта.

Файл *main_test.go

var tests = []struct {
    name     string
    dividend float32
    divisor  float32
    expected float32
    isErr    bool
}{
    {"valid-data", 100.0, 10.0, 10.0, false},
    {"invalid-data", 100.0, 0.0, 0.0, true},
    {"expect-5", 50.0, 10.0, 5.0, false},
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Каждой тестовой функции должен быть присвоен указатель **testing.T*.

func TestDivision(t *testing.T) {
    for _, testCase := range tests {
        got, err := divide(testCase.dividend, testCase.divisor)

        if testCase.isErr {
            if err == nil {
                t.Error("expected an error but did not get one")
            }
        } else {
            if err != nil {
                t.Error("did not expected an error but got one", err.Error())
            }
        }

        if got != testCase.expected {
            t.Errorf("the result we got %f is different than the expected %f result", got, testCase.expected)
        }

    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

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

Это альтернатива, вместо того, чтобы иметь отдельную функцию для каждого теста, мы можем создать фрагмент struct со всеми тестовыми случаями, которые нам нужны.

var tests = []struct {
    name     string
    dividend float32
    divisor  float32
    expected float32
    isErr    bool
}{
// casos de teste 
    {"valid-data", 100.0, 10.0, 10.0, false},
    {"invalid-data", 100.0, 0.0, 0.0, true},
    {"expect-5", 50.0, 10.0, 5.0, false},
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Чтобы выполнить тесты, просто выполните команду:

go test
Войдите в полноэкранный режим Выход из полноэкранного режима

На данный момент я использую стандартную библиотеку go для тестирования. Моя идея в этом репозитории https://github.com/bbwithpointers/golang-tests-study состоит в том, чтобы протестировать некоторые тестовые фреймворки, помимо стандартных lib и сделать небольшую документацию по их использованию здесь. Любые предложения приветствуются =)

Оцените статью
devanswers.ru
Добавить комментарий