Testing with testify & mockery
El paquete testing de Go es suficiente para la corrección, pero testify mejora los mensajes de error y mockery genera implementaciones simuladas a partir de interfaces.
Busca en todas las páginas de la documentación
El paquete testing de Go es suficiente para la corrección, pero testify mejora los mensajes de error y mockery genera implementaciones simuladas a partir de interfaces.
Juntos, aceleran las pruebas basadas en tablas, las comprobaciones de manejadores HTTP y los dobles de capa de servicio sin abandonar las interfaces idiomáticas de Go.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestSum(t *testing.T) {
require.Equal(t, 5, sum(2, 3))
}# mockery v2+ (instala el binario por separado)
mockery --name=UserRepository --dir=./internal/user --output=./internal/user/mocksCuándo usar esto:
t.Fatalf oculta la primera diferenciahttptest y bases de datospackage 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)
}Lo que esto demuestra:
require para precondiciones fatales, assert para comprobaciones adicionales en la misma pruebamock.Mock de testify (mockery genera esta forma)AssertExpectations verifica que todas las llamadas esperadas ocurrieronsuite.Suite para ganchos de configuración/desmontaje en métodos llamados TestX.On/Return.| Ayudante | En caso de fallo | Usar para |
|---|---|---|
require.* | Detiene la prueba | Configuración, errores que invalidan el resto de la prueba |
assert.* | Marca el fallo, continúa | Múltiples comprobaciones de campos independientes |
cmp.Diff (stdlib) | Manual | Structs complejos cuando la diferencia de testify es ruidosa |
type UserRepository interface { ... } en el paquete de producción.go generate con una directiva //go:generate.//go:generate mockery --name=UserRepository --output=./mocks --outpkg=mocksmocks para evitar ciclos de importación.context.Context a través de los mocks de la misma manera que lo hace el código de producción.errors.Is / errors.As con ErrorIs de testify.t.Parallel() o aísla el estado por prueba.go generate ./... en CI o pre-commit.mock.Anything - oculta argumentos incorrectos. Solución: usa mock.MatchedBy para comparadores parciales cuando sea necesario._test.go.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
stdlib testing solo | Política de cero dependencias | Grandes equipos quieren diferencias consistentes |
google/go-cmp | Comparación profunda de structs | Quieres una biblioteca de aserciones |
gomock (go.uber.org/mock) | Se prefieren mocks de estilo grabador | El equipo ya está estandarizado en mockery |
| Fakes escritos a mano | Comportamiento simple en memoria | La verificación del orden de llamadas es crítica |
Sí, para la mayoría de los repositorios de aplicaciones: la dependencia es pequeña y solo para pruebas; los puristas de la biblioteca estándar pueden quedarse con cmp y t.Helper manual.
Sigue el binario fijado de tu organización; ambos generan mocks similares: documenta la ruta de instalación en CONTRIBUTING.
Confirma para una CI reproducible o regenéralos en cada ejecución de prueba: elige una política y hazla cumplir en la revisión.
Esa sección cubre httptest, benchmarks y fuzzing; esta página se centra específicamente en las bibliotecas testify y mockery.
No: prefiere funciones basadas en tablas para lógica pura; las suites ayudan a la configuración compartida del servidor HTTP.
Implementa fakes de RoundTripper o usa httptest.Server en lugar de simular los detalles internos de http.Client.
Ejecuta siempre go test -race en CI; los mocks no eliminan las carreras de estado compartido en el código de producción.
No: sigue la regla de Go de interfaces pequeñas; una o dos funciones por mock mantienen las pruebas legibles.
Usa manejadores de búfer o núcleos observadores; testify afirma los campos analizados después de la llamada al registro.
El soporte evoluciona con las versiones: genera a partir de las instanciaciones de interfaz concretas que tu código utiliza realmente.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC de Green Tea, go fix modernizers - verifica el parche en la compilación), chi (última - verifica en la compilación), gin (última - verifica en la compilación), echo (última - verifica en la compilación), google.golang.org/grpc (última - verifica en la compilación), sigs.k8s.io/controller-runtime (última - verifica en la compilación), kubebuilder (última - verifica en la compilación), tinygo (última - verifica los objetivos de la placa en la compilación), wazero (última - verifica en la compilación) y golangci-lint (última - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026