DEV Community

Yan.ts
Yan.ts

Posted on

Como escrever testes automatizados em GO

Exportando a função

Pra começar precisamos definir as funções que queremos exportar como publicas, o GO considera funções publicas todas as funções que começam com a letra maiúscula, e considera como privada todas as funções que começam com a letra minúscula

Criando o teste

No GO é convencionado que todos os arquivos de teste terminem com _test além disso o GO não precisa de uma lib externa como por exemplo jest no javascript para fazer os testes, ele já vem com a ferramenta de testes por padrão. Porem para facilitar na hora de fazer as comparações de resultados precisamos instalar a lib testify com o seguinte comando

go get github.com/stretchr/testify/require
Enter fullscreen mode Exit fullscreen mode

para o caso do teste vamos testar a função Enable que pertence a struct Product

type Product struct {
    ID     string
    Name   string
    Price  float64
    Status string
}

func (p *Product) Enable() error {
    if p.Price > 0 {
        p.Status = ENABLED
        return nil
    }
    return errors.New("Price must be greater than 0")
}
Enter fullscreen mode Exit fullscreen mode

A struct no go funciona semelhante a uma classe em linguagens orientadas a objetos, onde declaramos a struct com todos as valores que ela precisa, e associamos metodos a ela

E para criar o teste em sí vamos criar o arquivo product_test.go onde o package dele vai ser o mesmo package do arquivo original mas com um test no final e ai vamos declarar a função como
`Test{nome da Struct}
{nome do Metodo} (t *testing.T)`

func TestProduct_Enable(t *testing.T) {
    product := application.Product{}
    product.Name = "Hello"
    product.Status = application.DISABLED
    product.Price = 10

    err := product.Enable()
    require.Nil(t, err)

    product.Price = 0
    err = product.Enable()
    require.Equal(t, "Price must be greater than 0", err.Error())
}
Enter fullscreen mode Exit fullscreen mode

o primeiro require queremos garantir que não deu erro e no segundo queremos ver se deu erro. Podemos fazer ambos os testes na mesma função

Bonus: Validando campos

Nesse mesmo projeto utilizei a lib asaskevich/govalidator para validar se os campos estão vindo como eu espero no Product.

utilizei essa lib da seguinte forma

go get github.com/asaskevich/govalidator
Enter fullscreen mode Exit fullscreen mode
func init() {
    govalidator.SetFieldsRequiredByDefault(true)
}
Enter fullscreen mode Exit fullscreen mode

e na Struct onde defino os campos de Product ao lado coloquei as tags

type Product struct {
    ID     string  `valid:"uuidv4"`
    Name   string  `valid:"required"`
    Price  float64 `valid:"float,optional"`
    Status string  `valid:"required"`
}
Enter fullscreen mode Exit fullscreen mode

para validar se o id é uuidv4 se veio o nome e o status e se o preço é float

Top comments (0)