Pruebas en Go (Golang): frameworks y herramientas
Go (Golang) es uno de los pocos lenguajes donde las pruebas están integradas a nivel de la biblioteca estándar. Gracias al paquete incorporado testing, así como a potentes herramientas de terceros, los desarrolladores pueden construir aplicaciones robustas y de alto rendimiento. En este artículo analizaremos los principales frameworks y utilidades para probar código en Go: desde pruebas unitarias simples hasta mocks y verificación de fugas de gorutinas.
Paquete integrado testing
El paquete testing es la base de todas las pruebas en Go. Las pruebas se escriben en archivos con el sufijo _test.go. Las funciones de prueba deben tener la firma func TestXxx(t *testing.T). Se ejecutan con el comando go test.
package main
import ( "testing")
func Sum(a, b int) int { return a + b}
func TestSum(t *testing.T) { result := Sum(2, 3) expected := 5 if result != expected { t.Errorf("Sum(2,3) = %d; want %d", result, expected) }}Para pruebas tabulares se utiliza un slice de estructuras:
func TestSumTable(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { result := Sum(tt.a, tt.b) if result != tt.expected { t.Errorf("Sum(%d,%d) = %d; want %d", tt.a, tt.b, result, tt.expected) } }}También se admiten:
- Benchmarks — funciones
func BenchmarkXxx(b *testing.B), se ejecutan congo test -bench=. - Ejemplos — funciones
func ExampleXxx()para generar documentación y verificar la salida. - Subpruebas —
t.Run("name", func(t *testing.T) {...})para agrupar y ejecutar en paralelo.
Testify — ampliación de capacidades
Testify es el framework más popular para pruebas en Go. Añade aserciones convenientes, mocks y un conjunto de utilidades.
Paquetes principales de Testify:
assert— verificaciones con mensajes de error claros.require— como assert, pero interrumpe la prueba en caso de fallo.mock— creación y verificación de objetos mock.suite— agrupación de pruebas en clases (estilo TDD).
import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock")
// Ejemplo de uso de assertfunc TestSumWithTestify(t *testing.T) { assert.Equal(t, 5, Sum(2, 3)) assert.NotEqual(t, 0, Sum(-1, 1))}
// Ejemplo de mock con testify/mocktype Calculator interface { Add(a, b int) int}
type MockCalculator struct { mock.Mock}
func (m *MockCalculator) Add(a, b int) int { args := m.Called(a, b) return args.Int(0)}
func TestWithMock(t *testing.T) { mockCalc := new(MockCalculator) mockCalc.On("Add", 2, 3).Return(5)
result := mockCalc.Add(2, 3) assert.Equal(t, 5, result) mockCalc.AssertExpectations(t)}Gomock — generación de mocks a partir de interfaces
Gomock (fork del original de Google) es una herramienta para la generación automática de mocks basados en interfaces. Se utiliza junto con la utilidad mockgen.
Instalación y ejemplo básico:
// Instalacióngo install go.uber.org/mock/mockgen@latest
// Generación de mock para una interfaz// mockgen -source=calculator.go -destination=mock_calculator.go -package=main
// Uso en la pruebafunc TestWithGomock(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()
mockCalc := NewMockCalculator(ctrl) mock