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 »
squirrel eating cone in forest

Como fazer fuzz test em requests HTTP (parte 1)

Na edição de 2022 da GopherCon Brasil, tive o prazer de palestrar sobre Fuzz Test. Foi muito bacana, pois durante a palestra, assim como nos corredores do evento, fizeram vários questionamentos que eu ainda não tinha feito sobre essa feature do Go.

Se você ainda não conhece esse tipo de teste, convido você a ler um post que publicamos aqui no blog (link para o post) onde explicamos melhor o assunto.

O que vou tratar nesse post é o resultado das perguntas feitas no evento mais um link que o Ricardo Maricato me enviou.

Para ver uma das formas de implementar o Fuzz Test para requests HTTP, vamos implementar um endpoint para validação dos dados de uma pessoa.

Vamos começar criando uma struct com um método de validação, e algumas variáveis para armazenar os erros de validação que podemos ter.

Leia mais »
body of water between green leaf trees

Como fazer teste unitário no GORM com testify e sqlmock

No último final de semana, eu passei praticamente a tarde toda do domingo tentando escrever testes unitários para o GORM utilizando sqlmock.

O problema é que todos os tutoriais que eu encontrei eram de versões antigas, tanto do GORM, quanto do sqlmock.

Somente na segunda-feira, depois de mais umas 2h tentando entender como eles funcionavam e o que os erros estavam me dizendo foi que consegui fazer os testes funcionarem.

Por causa desse trabalho todo, resolvi fazer esse post mostrando como escrever testes unitários para GORM com sqlmock e testify.

Se você nunca utilizou testify ou quer saber um pouco mais sobre, recomendo a leitura do nosso post “Como usar testify para escrever testes“. Além de um exemplo básico, explicamos qual a finalidade de cada um dos 4 packages que compõem a suite do testify.

Continuando… para facilitar, vou separar o post em testes para INSERT, UPDATE, DELETE e SELECT.

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 »

Frameworks para teste ou package padrão?

Sem sombra de dúvida, frameworks sempre ajudam a acelerar o nosso trabalho. Eles implementam uma porção de funcionalidades que reduzem a quantidade de código que nós temos que escrever, o que nos traz produtividade.

Mas e quando o assunto são testes, será que esse ganho em produtividade compensa o risco?

Eu particularmente nunca utilizei um framework de testes em nenhum dos projetos GO que já desenvolvi. Parte disso pelo fato de eu ter começado a programar em Go em 2012, “quando isso aqui era tudo mato”.

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 »