Pruebas en Go (Golang): frameworks y herramientas — guía completa

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



Las pruebas son una parte esencial del desarrollo de software confiable. El lenguaje Go (Golang) fue diseñado desde el principio teniendo en cuenta las necesidades de prueba: la biblioteca estándar incluye el potente paquete testing, y a su alrededor se ha formado un rico ecosistema de herramientas adicionales. En este artículo, analizaremos en detalle los principales frameworks y herramientas para pruebas en Go, incluyendo la escritura de pruebas unitarias, el uso de mocks, el enfoque BDD y los benchmarks.



1. Paquete estándar testing



El núcleo de las pruebas en Go es el paquete testing. Proporciona un conjunto minimalista pero muy eficaz de funciones. Las pruebas se escriben en archivos con el sufijo _test.go y son funciones comunes con la firma func TestXxx(t *testing.T).



Ejemplo de una prueba simple para una función de suma:



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) }}


La ejecución de las pruebas se realiza con el comando:



go test ./...


El paquete testing también admite:

  • Pruebas tabulares — para verificar múltiples conjuntos de datos de entrada.
  • Subpruebas (con t.Run) — para agrupar y ejecutar en paralelo.
  • Benchmarks — funciones con la forma func BenchmarkXxx(b *testing.B).
  • Ejemplos — funciones func ExampleXxx(), que también sirven como documentación.


2. Testify — ampliando las capacidades de prueba



Testify es una de las bibliotecas de terceros más populares para pruebas en Go. Amplía el paquete estándar testing proporcionando:

  • assert — funciones convenientes para verificar condiciones con mensajes de error claros.
  • require — igual que assert, pero interrumpe la ejecución de la prueba en caso de error.
  • suite — la capacidad de estructurar las pruebas como un conjunto (una estructura con métodos).
  • mock — un framework simple para crear objetos mock.


Ejemplo de uso de assert y 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))}


Testify hace que el código de las pruebas sea más legible y reduce la cantidad de código repetitivo.



3. GoMock — generación de mocks



GoMock es un framework para crear objetos mock basados en interfaces. Consta de dos partes:

  • mockgen — una utilidad para generar código de mocks.
  • gomock — un paquete para usar mocks en las pruebas.


Ejemplo de uso de GoMock:



  1. Definimos la interfaz:


package main

type UserService interface { GetUser(id int) (string, error)}


  1. Generamos el mock:


mockgen -source=user.go -destination=mock_user.go -package=main


  1. Lo usamos en la prueba:


func TestGetUserName(t *testing.T) {    ctrl := gomock.NewController(t)    defer ctrl.Finish()

mockService := NewMockUserService(ctrl) mockService.EXPECT().GetUser(1).Return("Alice", nil)

name,

Recommendations