Testes em Go (Golang): frameworks e ferramentas
Testes são uma parte essencial do desenvolvimento de software confiável. A linguagem Go (Golang) foi projetada desde o início com as necessidades de teste em mente: a biblioteca padrão inclui o poderoso pacote testing, e ao seu redor formou-se um rico ecossistema de ferramentas adicionais. Neste artigo, vamos detalhar os principais frameworks e ferramentas para testes em Go, incluindo a escrita de testes unitários, uso de mocks, abordagem BDD e benchmarks.
1. Pacote padrão testing
O núcleo dos testes em Go é o pacote testing. Ele fornece um conjunto minimalista, mas muito eficiente, de funções. Os testes são escritos em arquivos com o sufixo _test.go e são funções comuns com a assinatura func TestXxx(t *testing.T).
Exemplo de um teste simples para uma função de soma:
package main
import "testing"
func Add(a, b int) int { return a + b}
func TestAdd(t *testing.T) { result := Add(2, 3) expected := 5 if result != expected { t.Errorf("Add(2, 3) = %d; want %d", result, expected) }}A execução dos testes é feita com o comando:
go test ./...O pacote testing também suporta:
- Testes tabulares — para verificar múltiplos conjuntos de dados de entrada.
- Subtestes (com
t.Run) — para agrupamento e execução paralela. - Benchmarks — funções no formato
func BenchmarkXxx(b *testing.B). - Exemplos — funções
func ExampleXxx(), que também servem como documentação.
2. Testify — expandindo as capacidades de teste
Testify é uma das bibliotecas de terceiros mais populares para testes em Go. Ela expande o pacote padrão testing, fornecendo:
- assert — funções convenientes para verificar condições com mensagens de erro claras.
- require — igual ao assert, mas interrompe a execução do teste em caso de erro.
- suite — possibilidade de estruturar testes como um conjunto (estrutura com métodos).
- mock — um framework simples para criar objetos mock.
Exemplo de uso de assert e suite:
package main
import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite")
type MySuite struct { suite.Suite Value int}
func (s *MySuite) SetupTest() { s.Value = 10}
func (s *MySuite) TestValue() { assert.Equal(s.T(), 10, s.Value, "Value should be 10")}
func TestMySuite(t *testing.T) { suite.Run(t, new(MySuite))}O Testify torna o código dos testes mais legível e reduz a quantidade de código boilerplate.
3. GoMock — geração de mocks
GoMock é um framework para criar objetos mock baseados em interfaces. Ele consiste em duas partes:
- mockgen — utilitário para gerar código de mocks.
- gomock — pacote para usar mocks nos testes.
Exemplo de uso do GoMock:
- Definimos a interface:
package main
type UserService interface { GetUser(id int) (string, error)}- Geramos o mock:
mockgen -source=user.go -destination=mock_user.go -package=main- Usamos no teste:
func TestGetUserName(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()
mockService := NewMockUserService(ctrl) mockService.EXPECT().GetUser(1).Return("Alice", nil)
name,