Como executar testes rápidos em Go

Se você trabalha ou já trabalhou em um grande projeto com uma alta cobertura de testes, com certeza você já passou raiva na hora de executar os testes da aplicação localmente.

Isso por que, quanto maior o projeto e mais bem coberto por testes, maior o tempo para executar todas as validações.

Pois bem, hoje venho te mostrar duas formas de continuar com uma ótima cobertura de testes, porém economizar um bom tempo na hora de executá-los localmente ou na abertura de PRs.

Leia mais »
gray and brown mountain

Testes unitários com Testify Suite e sqlmock

Alguns meses atrás, eu estava escrevendo uma aplicação. Quando fui escrever os testes do meu repositório, fiquei incomodado em ficar copiando e colando parte do código para gerar uma nova instância do repositório para cada ação do CRUD que eu queria testar. Foi então que, procurando na documentação do testify, descobri sobre o package suite.

Se você nunca utilizou o testify, recomendo que leia primeiro o nosso post “Como escrever testes com testify”.

Nesse post, vou mostrar como podemos escrever testes unitários utilizando o package testify suite e sqlmock.

Para que o post não fique muito extenso, ao invés de implementar o repositório também, vamos só imaginar que ele tem os métodos Insert, Update, Delete e FindByID implementados.

Iniciando o testify suite

Para começar, precisamos criar uma struct que faça o embed da struct suite.Suite. Esse embed é obrigatório. Todos os outros campos não são obrigatórios. São apenas uma forma de facilitar a nossa vida na hora da escrita dos testes.

type RepositorySuite struct {
	suite.Suite
	conn *sql.DB
	DB *gorm.DB
	mock sqlmock.Sqlmock

	repo *repository
	person *Person
}
Leia mais »
red and yellow hatchback axa crash tests

Como usar testify para escrever testes

Se você ainda não conhece, Testify é um conjunto de ferramentas para nos auxiliar na hora de escrever testes e mocks.

Por ser uma “casquinha” feita em cima dos próprios testes do Go, a utilização desse package não deve causar grandes problemas.

Na data em que escrevo esse post, o Testify é dividido em 4 packages:

Para começar, considerando o código abaixo, vamos ver como o package assert pode nos ajudar.

Leia mais »

Fuzzy testing

Adicionado ao Go 1.18, essa nova feature para testes promete ajudar a melhorar muito nosso código, já que com ela conseguimos testar inputs diferentes do que adicionamos em nossos testes, cobrindo assim uma gama muito maior de possibilidades.

Antes de continuar, se você caiu aqui mas prefere ver esse tutorial em vídeo, vou deixar aqui o link para um vídeo do nosso canal no YouTube onde mostramos essa belezinha em ação => Como implementar Fuzzy Test em Go.

Continuando….

Vamos imaginar que temos a seguinte função implementada.

Leia mais »

Testando API’s feitas com gorilla/mux

Algumas semanas atrás implementamos uma API utilizando gorilla/mux (link do post). No entanto, deixamos de lado algo que é muito importante, os famosos testes. Por isso, nesse post vamos corrigir essa falha e adicionar alguns testes ao nosso projeto.

Para começar, vamos criar um arquivo com o nome de hello_test.go dentro da pasta handlers. Nesse arquivo vamos adicionar um teste para a função HandleHello.

func TestHandleHello(t *testing.T) {
}

Com a função de testes iniciada, a primeira coisa que vamos fazer é criar uma struct anônima para nos auxiliar com uma massa de dados para teste. Dessa forma conseguiremos testar o mesmo endpoint com vários inputs diferentes.

Leia mais »

Escrevendo testes unitários

Testes unitários nos ajudam muito a tentar manter a quantidade de bugs baixa, já que podemos testar várias hipóteses de forma automática. E por ser automatizada, a cada mudança que fazemos, os testes unitários também nos ajudam a garantir que não quebramos o sistema em partes que nem tocamos mas que dependem das mudanças que fizemos.

Embora exista alguns packages que ajudam na escrita dos testes unitários, a recomendação do time de desenvolvimento da linguagem é que os testes sejam escritos usando o package nativo da linguagem, pelo simples fato de que um package externo pode adicionar algum bug ou realizar algum teste de forma incorreta.

Antes de começar a escrever os testes, vamos criar um arquivo chamado soma.go e escrever uma pequena função que soma N valores.

package soma


func Soma(valores ...int) (total int) {
    for _, valor := range valores {
        total += valor
    }

    return
}
Leia mais »