DEV Community

Bruno Barros
Bruno Barros

Posted on

Iniciante testes em Golang

Primeiro vamos começar com um simples problema de devisão.

Nosso main.go:

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
}
Enter fullscreen mode Exit fullscreen mode

divide() é a função que vamos testar.
Primeiramente, vamos criar um arquivo chamado main _test .go, teste em Go devem seguir este padrão de nome, finalizando sempre com o _test.go, assim, ao executarmos o teste, o compilador saberá que deve rodar os testes do projeto.

Arquivo *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},
}
Enter fullscreen mode Exit fullscreen mode

Toda função de teste deve receber o ponteiro **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)
        }

    }
}
Enter fullscreen mode Exit fullscreen mode

Esta parte do nosso código é onde estamos definindo os dados que rodaremos no nosso loop, logo abaixo.

Essa é uma alternativa, ao invés de ter uma função separada para cada teste, podemos criar um slice de struct com todos os casos de testes que queremos.

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},
}
Enter fullscreen mode Exit fullscreen mode

Para executar os testes, basta executar o comando:

go test
Enter fullscreen mode Exit fullscreen mode

Neste primeiro momento, estou utilizando a biblioteca padrão do go para testar. Minha ideia neste repositório https://github.com/bbwithpointers/golang-tests-study é testar alguns frameworks de testes, além da lib padrão e fazer pequenas documentações de uso por aqui. Qualquer sugestão é bem vinda. =)

Top comments (0)