DEV Community

Yan.ts
Yan.ts

Posted on

5 3

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

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay