Pruebas en Go (Golang): frameworks y herramientas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 con go 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

Recommendations