Сначала давайте начнем с простой проблемы деления.
Наш главный:
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 и сделать небольшую документацию по их использованию здесь. Любые предложения приветствуются =)