Testando com testify & mockery
O pacote testing do Go é suficiente para correção, mas testify melhora as mensagens de falha e mockery gera implementações mock a partir de interfaces.
Busque em todas as páginas da documentação
O pacote testing do Go é suficiente para correção, mas testify melhora as mensagens de falha e mockery gera implementações mock a partir de interfaces.
Juntos, eles aceleram testes baseados em tabelas, verificações de manipuladores HTTP e duplos de camada de serviço sem abandonar interfaces idiomáticas do Go.
Cartão de receita de referência rápida - pronto para copiar e colar.
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestSum(t *testing.T) {
require.Equal(t, 5, sum(2, 3))
}# mockery v2+ (instale o binário separadamente)
mockery --name=UserRepository --dir=./internal/user --output=./internal/user/mocksQuando usar isso:
t.Fatalf esconde a primeira diferençahttptest e bancos de dadospackage user_test
import (
"context"
"errors"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"example.com/libdemo/internal/user"
)
type mockRepo struct{ mock.Mock }
func (m *mockRepo) FindByID(ctx context.Context, id string) (user.User, error) {
args := m.Called(ctx, id)
return args.Get(0).(user.User), args.Error(1)
}
func TestService_GetUser(t *testing.T) {
repo := new(mockRepo)
repo.On("FindByID", mock.Anything, "u1").Return(user.User{ID: "u1"}, nil)
svc := user.NewService(repo)
got, err := svc.GetUser(context.Background(), "u1")
require.NoError(t, err)
assert.Equal(t, "u1", got.ID)
repo.AssertExpectations(t)
}
func TestService_GetUser_NotFound(t *testing.T) {
repo := new(mockRepo)
repo.On("FindByID", mock.Anything, "missing").Return(user.User{}, errors.New("not found"))
svc := user.NewService(repo)
_, err := svc.GetUser(context.Background(), "missing")
require.Error(t, err)
}O que isso demonstra:
require para pré-condições fatais, assert para verificações adicionais no mesmo testemock.Mock do testify (mockery gera essa forma)AssertExpectations verifica se todas as chamadas esperadas ocorreramsuite.Suite para hooks de setup/teardown em métodos nomeados TestX.On/Return.| Helper | Em caso de falha | Usar para |
|---|---|---|
require.* | Para o teste | Configuração, erros que invalidam o resto do teste |
assert.* | Marca falha, continua | Múltiplas verificações de campo independentes |
cmp.Diff (stdlib) | Manual | Structs complexas quando a diferença do testify é barulhenta |
type UserRepository interface { ... } no pacote de produção.go generate com uma diretiva //go:generate.//go:generate mockery --name=UserRepository --output=./mocks --outpkg=mocksmocks para evitar ciclos de importação.context.Context através de mocks da mesma forma que o código de produção faz.errors.Is / errors.As com ErrorIs do testify.t.Parallel() ou isole o estado por teste.go generate ./... em CI ou pre-commit.mock.Anything - esconde argumentos incorretos. Correção: use mock.MatchedBy para correspondentes parciais quando necessário._test.go.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
stdlib testing apenas | Política de zero dependências | Grandes equipes querem diffs consistentes |
google/go-cmp | Comparação profunda de structs | Você quer uma biblioteca de asserção |
gomock (go.uber.org/mock) | Mocks no estilo gravador preferidos | Equipe já padronizada em mockery |
| Fakes escritos à mão | Comportamento simples em memória | Verificação da ordem de chamada é crítica |
Sim, para a maioria dos repositórios de aplicativos - a dependência é pequena e apenas para testes; puristas da biblioteca padrão podem ficar com cmp e t.Helper manual.
Siga o binário fixado pela sua organização; ambos geram mocks semelhantes - documente o caminho de instalação em CONTRIBUTING.
Ou commite para CI reproduzível ou regenere a cada execução de teste - escolha uma política e aplique na revisão.
Essa seção cobre httptest, benchmarks e fuzzing; esta página foca especificamente nas bibliotecas testify e mockery.
Não - prefira funções baseadas em tabelas para lógica pura; suítes ajudam na configuração compartilhada do servidor HTTP.
Implemente fakes RoundTripper ou use httptest.Server em vez de mockar os internos do http.Client.
Sempre execute go test -race em CI; mocks não removem corridas de estado compartilhado no código de produção.
Não - siga a regra de interfaces pequenas do Go; um ou dois métodos por mock mantêm os testes legíveis.
Use manipuladores de buffer ou núcleos observadores; testify afirma em campos analisados após a chamada de log.
O suporte evolui com as versões - gere a partir de instâncias concretas de interface que seu código realmente usa.
Versões da Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026