«¿Se puede ejecutar solo un archivo con pruebas?» — sí, y así es como se hace en Go
¿Alguna vez te has sentado frente al terminal, has escrito go test ./... y has observado con horror cómo toda la base de código de tu proyecto en Go comienza a ejecutar cientos de pruebas? Y lo único que necesitabas era verificar un pequeño archivo con casos de prueba que acababas de escribir. ¿Te suena familiar? Si es así, has llegado al lugar indicado.
En este artículo, analizaremos una pregunta popular de Stack Overflow (que, por cierto, tiene miles de visitas): «How to run test cases in a specified file?». Adaptaremos las respuestas a la realidad del desarrollador Go y mostraremos no solo comandos básicos, sino también trucos que te ahorrarán horas de trabajo. ¡Allá vamos!
¿Por qué simplemente go test no siempre es adecuado?
En proyectos grandes, las pruebas se dividen en unitarias, de integración y end-to-end. Si ejecutas go test ./..., Go recorre recursivamente todos los subpaquetes y ejecuta todas las pruebas encontradas. Esto puede llevar minutos. Y si tienes pruebas que acceden a la base de datos o a APIs externas, pueden fallar por razones ajenas a ti. Por lo tanto, saber cómo ejecutar casos de prueba en un archivo específico no es solo una cuestión de comodidad, sino una habilidad de un desarrollador profesional.
Comando básico: go test con el nombre del archivo
La forma más directa es especificar el archivo de pruebas concreto. Pero aquí hay un matiz: Go requiere que especifiques tanto el archivo a probar como el archivo de pruebas juntos. ¿Por qué? Porque el compilador debe compilar todo el código del paquete.
Supongamos que tienes la siguiente estructura de proyecto:
myproject/├── main.go└── math_utils.go└── math_utils_test.goPara ejecutar solo las pruebas de math_utils_test.go, ejecuta:
go test -v math_utils.go math_utils_test.goLa bandera -v (verbose) mostrará información detallada sobre cada caso de prueba. Sin ella, solo verás el resultado: PASS o FAIL.
Ejemplo de código real
Creemos un archivo simple math_utils.go:
package main
func Sum(a, b int) int { return a + b}
func Multiply(a, b int) int { return a * b}Y el archivo de prueba math_utils_test.go:
package main
import "testing"
func TestSum(t *testing.T) { result := Sum(2, 3) if result != 5 { t.Errorf("Sum(2, 3) = %d; want 5", result) }}
func TestMultiply(t *testing.T) { result := Multiply(3, 4) if result != 12 { t.Errorf("Multiply(3, 4) = %d; want 12", result) }}Ahora ejecutamos:
$ go test -v math_utils.go math_utils_test.go=== RUN TestSum--- PASS: TestSum (0.00s)=== RUN TestMultiply--- PASS: TestMultiply (0.00s)PASSok command-line-arguments 0.002sObserva la salida: ok command-line-arguments. Esto significa que Go ha compilado un paquete temporal a partir de los archivos especificados. Este enfoque funciona, pero tiene limitaciones.
Problema con múltiples archivos en un mismo paquete
Si tu paquete consta de varios archivos (por ejemplo, math_utils.go y strings_utils.go), y la prueba en math_utils_test.go llama a una función de strings_utils.go, el comando anterior fallará con un error de compilación. Go se quejará de que la función no está definida.
La solución es enumerar todos los archivos dependientes. Pero esto es incómodo. Es mejor usar otro enfoque.
Forma avanzada: filtrar pruebas por nombre (-run)
La bandera -run permite ejecutar solo aquellos casos de prueba cuyos nombres coincidan con una expresión regular. Esto no está vinculado al archivo, pero si nombras tus pruebas de manera significativa, será fácil filtrar las que necesitas.
Ejemplo: ejecutar todas las pruebas que comiencen con TestSum:
go test -v -run T