21/12/2014
El ecosistema de herramientas de Golang es conocido por su eficiencia, simplicidad y potencia. Una de las características que contribuyen a la velocidad del desarrollo es el sistema de caché integrado en el comando go test. A partir de la versión 1.10, Go guarda de forma inteligente los resultados de las pruebas exitosas para acelerar ejecuciones posteriores. Si bien esto es una ventaja fantástica en la mayoría de los escenarios, puede convertirse en un obstáculo cuando nuestras pruebas dependen de factores externos o cuando necesitamos garantizar una ejecución completamente nueva. En este artículo, exploraremos a fondo el sistema de caché de pruebas de Go, entenderemos por qué y cuándo es necesario desactivarlo, y dominaremos las diferentes técnicas para hacerlo, desde el método idiomático moderno hasta las soluciones para problemas específicos.

- ¿Qué es la Caché de Pruebas en Go y Cómo Funciona?
- El Método Idiomático y Recomendado: Usando -count=1
- Limpieza de la Caché: Los Comandos go clean
- El Método Obsoleto: ¿Qué pasó con GOCACHE=off?
- Tabla Comparativa de Métodos
- Resolviendo Problemas Comunes: Caché y Entornos de Desarrollo
- Preguntas Frecuentes (FAQ)
¿Qué es la Caché de Pruebas en Go y Cómo Funciona?
Antes de aprender a desactivarla, es crucial entender cómo funciona la caché de pruebas. Cuando ejecutas go test sobre una lista explícita de paquetes, Go realiza una serie de comprobaciones. Si se cumplen todas las condiciones siguientes, en lugar de volver a ejecutar las pruebas, Go simplemente te mostrará el resultado anterior:
- La prueba debe haber concluido con éxito en una ejecución anterior.
- El ejecutable de la prueba no ha cambiado. Esto significa que ni el código de la prueba ni el código fuente del que depende han sido modificados.
- La línea de comandos utilizada para ejecutar la prueba es idéntica, considerando un subconjunto específico de flags:
-cpu,-list,-parallel,-run,-short, y-v. - Los archivos y variables de entorno consultados por la prueba durante su ejecución anterior no han sufrido cambios.
Cuando Go utiliza la caché, lo indica claramente en la salida, reemplazando el tiempo de ejecución por la palabra (cached). Por ejemplo:
ok github.com/myuser/myproject/mypackage (cached)Esta funcionalidad es brillante para pruebas puras y unitarias que son deterministas, es decir, que dado el mismo input, siempre producirán el mismo output. Sin embargo, el problema surge con pruebas de integración o aquellas que interactúan con sistemas externos como bases de datos, APIs de red o el sistema de archivos, donde el estado externo puede cambiar sin que el código fuente lo haga.
El Método Idiomático y Recomendado: Usando -count=1
La forma más simple, directa y recomendada por el equipo de Go para saltarse la caché en una ejecución específica es utilizar el flag -count=1. Este flag le indica a la herramienta de pruebas que ejecute el conjunto de tests un número determinado de veces. Al especificar 1, le estamos pidiendo explícitamente que realice una única ejecución fresca, lo que invalida la lógica de la caché.
Su uso es trivial. Simplemente añade el flag a tu comando habitual:
go test ./... -v -count=1Este comando recorrerá todos tus paquetes, ejecutará las pruebas en modo verbose (-v) y, gracias a -count=1, ignorará cualquier resultado previamente cacheado. Es la solución perfecta para la integración continua (CI/CD) o para cuando necesitas estar 100% seguro de que tus pruebas se están ejecutando contra el estado actual de todo tu entorno.
¿Por qué -count=1 y no otro número?
Podrías usar -count=2 o cualquier otro número, y también se saltaría la caché. Sin embargo, ejecutarías tus pruebas varias veces, lo cual es innecesario si tu único objetivo es evitar el resultado cacheado. Usar 1 es la expresión más clara y eficiente de tu intención.
Limpieza de la Caché: Los Comandos go clean
A veces, no solo queremos saltarnos la caché para una ejecución, sino que deseamos eliminarla por completo. Esto puede ser útil si sospechamos que la caché está corrupta o si queremos liberar espacio en disco. Para esto, Go nos proporciona el comando go clean con flags específicos.
go clean -testcache
Este es el bisturí del cirujano. El comando go clean -testcache elimina exclusivamente los resultados de pruebas cacheados de todos los proyectos en tu entorno. No tocará la caché de compilación ni otros artefactos. Es la opción más segura y recomendada si tu objetivo es únicamente invalidar la caché de pruebas.

go clean -testcacheDespués de ejecutar este comando, la siguiente vez que lances go test, todas las pruebas se ejecutarán de nuevo, sin importar si el código ha cambiado o no.
go clean -cache
Esta es la opción más drástica. El comando go clean -cache elimina por completo todo el directorio de caché de compilación de Go. Esto incluye no solo la caché de pruebas, sino también los paquetes compilados y otros artefactos de construcción. Usar este comando forzará a Go a recompilar todo desde cero en la próxima construcción. Si bien es efectivo, es más lento y generalmente innecesario a menos que te enfrentes a problemas de compilación extraños y difíciles de depurar.
El Método Obsoleto: ¿Qué pasó con GOCACHE=off?
Los desarrolladores que trabajan con Go desde antes de la versión 1.12 recordarán que la forma de deshabilitar la caché era establecer la variable de entorno GOCACHE en off.
# Método antiguo, ¡no usar en Go 1.12+!GOCACHE=off go test ./...Sin embargo, a partir de Go 1.12, el sistema de compilación y módulos depende fundamentalmente de la existencia de un directorio de caché. Intentar ejecutar un comando de Go con GOCACHE=off resultará en un error:
build cache is disabled by GOCACHE=off, but required as of Go 1.12Por lo tanto, este método debe considerarse obsoleto y evitarse en versiones modernas de Go. La alternativa correcta es usar -count=1 para ejecuciones únicas o go clean -testcache para una limpieza completa.
Tabla Comparativa de Métodos
Para resumir las opciones disponibles, aquí tienes una tabla comparativa que te ayudará a decidir qué método usar en cada situación.
| Método | Versión de Go | Efecto | Caso de Uso Ideal |
|---|---|---|---|
go test -count=1 | 1.10+ | Evita la caché para una ejecución específica. | Ejecutar una prueba una sola vez para asegurar resultados frescos, especialmente en CI/CD o al probar contra una base de datos. |
go clean -testcache | 1.10+ | Elimina toda la caché de pruebas acumulada. | Cuando se sospecha que la caché está corrupta o se quiere un borrón y cuenta nueva con las pruebas. |
go clean -cache | Todas | Elimina toda la caché de compilación, incluyendo la de pruebas. | Para solucionar problemas extraños de compilación o dependencias en el IDE que no se resuelven de otra manera. |
GOCACHE=off | < 1.12 | (Obsoleto) Deshabilita el uso y escritura en la caché. | Ya no es recomendable; causa errores en versiones modernas de Go. |
Resolviendo Problemas Comunes: Caché y Entornos de Desarrollo
A veces, la caché puede causar problemas que no son inmediatamente obvios. Un escenario común ocurre en entornos de desarrollo integrados (IDEs) como Visual Studio Code. El sistema de compilación de Go crea directorios de caché que, en ocasiones, pueden confundir a las herramientas de análisis de código del IDE.
Puedes encontrarte con errores de importación falsos o problemas para encontrar dependencias que sabes que están correctamente instaladas. Por ejemplo, un error como could not import github.com/... (open auto/...: no such file or directory) suele ser un síntoma de que el IDE está confundido por el estado de la caché.

En estos casos, la solución más efectiva suele ser la más contundente: ejecutar go clean -cache. Esto fuerza una reconstrucción completa y suele resolver estos problemas de sincronización entre el IDE y el estado real del proyecto.
Preguntas Frecuentes (FAQ)
P: ¿Cómo sé si el resultado de mi prueba proviene de la caché?
R: La salida del comando go test te lo dirá. Si una prueba utiliza un resultado cacheado, verás la palabra `(cached)` en lugar del tiempo de ejecución junto al resultado `ok` del paquete.
P: ¿Usar `-count=1` afecta el rendimiento de mis pruebas?
R: Sí, pero ese es precisamente el punto. Al usar `-count=1`, estás forzando la re-ejecución de las pruebas, lo que consumirá más tiempo que leer el resultado de la caché. Debes usarlo deliberadamente cuando la velocidad es menos importante que la certeza de una ejecución fresca.
P: ¿`go clean -testcache` es seguro de usar?
R: Absolutamente. Es un comando diseñado específicamente para gestionar la caché de pruebas. No eliminará tu código fuente ni otros archivos importantes. Su único efecto es que la próxima ejecución de pruebas será más lenta porque tendrá que reconstruir los resultados.
P: ¿Por qué mis pruebas de integración con una base de datos a veces pasan y a veces fallan sin cambiar el código?
R: Este es el caso de uso clásico para deshabilitar la caché. Es probable que go test esté usando un resultado cacheado de una ejecución anterior donde la base de datos estaba en un estado diferente. Usa siempre go test -count=1 para este tipo de pruebas no deterministas.
En conclusión, el sistema de caché de Go es una herramienta poderosa para acelerar el ciclo de desarrollo. Sin embargo, como con cualquier herramienta, es vital entender cómo funciona y cuándo puede interponerse en nuestro camino. Adoptar -count=1 como la solución idiomática para forzar ejecuciones frescas y tener a mano go clean -testcache para limpiezas periódicas te permitirá tener un control total sobre el comportamiento de tus pruebas, asegurando que tus resultados sean siempre fiables y precisos.
Si quieres conocer otros artículos parecidos a Domina la Caché de Pruebas en Golang puedes visitar la categoría Juegos.
