Go:
Escribir pruebas

Cómo hacerlo:

En Go, las pruebas se escriben típicamente en el mismo paquete que el código que prueban. Los archivos que contienen las pruebas tienen el sufijo _test.go. Las pruebas son funciones que toman un puntero al objeto testing.T (del paquete testing) como argumento, y señalan un fallo llamando a métodos como t.Fail(), t.Errorf(), etc.

Ejemplo de una prueba simple para una función Add definida en math.go:

// math.go
package math

func Add(x, y int) int {
    return x + y
}

Archivo de prueba math_test.go:

package math

import "testing"

func TestAdd(t *testing.T) {
    result := Add(1, 2)
    expected := 3
    if result != expected {
        t.Errorf("Add(1, 2) = %d; se esperaba %d", result, expected)
    }
}

Ejecuta tus pruebas con el comando go test en el mismo directorio que tus archivos de prueba. Un ejemplo de salida que indica una prueba superada sería similar a:

PASS
ok      example.com/my/math 0.002s

Para pruebas impulsadas por tablas, que te permiten probar de manera eficiente diversas combinaciones de entrada y salida, define un slice de structs que representan los casos de prueba:

func TestAddTableDriven(t *testing.T) {
    var tests = []struct {
        x        int
        y        int
        expected int
    }{
        {1, 2, 3},
        {2, 3, 5},
        {-1, -2, -3},
    }

    for _, tt := range tests {
        testname := fmt.Sprintf("%d+%d", tt.x, tt.y)
        t.Run(testname, func(t *testing.T) {
            ans := Add(tt.x, tt.y)
            if ans != tt.expected {
                t.Errorf("obtuvo %d, se esperaba %d", ans, tt.expected)
            }
        })
    }
}

Análisis Detallado

El marco de pruebas de Go, introducido en Go 1 junto con el lenguaje mismo, fue diseñado para integrarse a la perfección con la cadena de herramientas de Go, reflejando el énfasis de Go en la simplicidad y eficiencia en el desarrollo de software. A diferencia de algunos marcos de pruebas en otros idiomas que dependen de bibliotecas externas o configuraciones complejas, el paquete testing integrado de Go ofrece una forma sencilla de escribir y ejecutar pruebas.

Un aspecto interesante del enfoque de Go para las pruebas es el principio de convención sobre configuración que adopta, como el patrón de nombramiento de archivos (_test.go) y el uso de funcionalidades de la biblioteca estándar sobre dependencias externas. Este enfoque minimalista alienta a los desarrolladores a escribir pruebas, ya que la barrera de entrada es baja.

Aunque las instalaciones de prueba integradas de Go cubren mucho terreno, hay escenarios donde herramientas o marcos de terceros podrían ofrecer más funcionalidades, como generación de simulacros, pruebas de fuzzing o pruebas de estilo de desarrollo guiado por comportamiento (BDD). Bibliotecas populares como Testify o GoMock complementan las capacidades de prueba estándar de Go, ofreciendo afirmaciones más expresivas o capacidades de generación de simulacros, que pueden ser particularmente útiles en aplicaciones complejas con muchas dependencias.

A pesar de la existencia de estas alternativas, el paquete de pruebas estándar de Go sigue siendo la piedra angular para las pruebas en Go debido a su simplicidad, rendimiento y estrecha integración con el lenguaje y la cadena de herramientas. Ya sea que los desarrolladores elijan complementarlo con herramientas de terceros o no, el marco de pruebas de Go proporciona una base sólida para garantizar la calidad y fiabilidad del código.