go test, list y generate
go test ejecuta pruebas de paquetes, go list introspecciona lo que ve el sistema de compilación y go generate activa hooks de generación de código que defines junto a los archivos fuente.
Busca en todas las páginas de la documentación
go test ejecuta pruebas de paquetes, go list introspecciona lo que ve el sistema de compilación y go generate activa hooks de generación de código que defines junto a los archivos fuente.
Las pruebas son de primera clase en la toolchain: no se requiere un runner externo para pruebas unitarias, benchmarks, ejemplos o targets de fuzzing.
go list expone paquetes, dependencias, tags y versiones de módulos como JSON legible por máquina para scripts y CI.
go generate ejecuta directivas //go:generate, generalmente llamando a herramientas instaladas con go install.
Juntos forman el ciclo diario: listar lo que existe, generar lo que está obsoleto, probar lo que ha cambiado.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# Ejecuta todas las pruebas con detector de race y cobertura
go test -race -cover ./...
# Ejecuta una prueba por nombre con salida detallada
go test -run TestParseConfig -v ./internal/config
# Lista los paquetes como JSON para scripting
go list -json ./...
# Ejecuta todos los generadores en el módulo
go generate ./...Cuándo usar esto:
go test ./... como la puerta de enlace predeterminada de CI antes de fusionar.go list -f para generar informes de SBOM o de propiedad.go generate después de cambiar definiciones de protobuf, stringer o mock.go test -bench al optimizar rutas críticas con números reproducibles.// mathutil/sum.go
package mathutil
func Sum(nums []int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}// mathutil/sum_test.go
package mathutil
import "testing"
func TestSum(t *testing.T) {
got := Sum([]int{1, 2, 3})
if got != 6 {
t.Fatalf("got %d want 6", got)
}
}
func BenchmarkSum(b *testing.B) {
data := make([]int, 1000)
for i := range data {
data[i] = i
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
Sum(data)
}
}// api/doc.go
package api
//go:generate go run golang.org/x/tools/cmd/stringer@latest -type=Kind
type Kind int
const (
KindHTTP Kind = iota
KindGRPC
)go test -cover ./mathutil
go test -bench=. -benchmem ./mathutil
go list -f '{{.ImportPath}} tags={{.BuildTags}}' ./...
go generate ./apiLo que esto demuestra:
t.Fatalf para fallos rápidos.b.ResetTimer() excluyendo el trabajo de configuración.go list -f plantilla personalizada para scripts de inventario.//go:generate ubicado junto al tipo que mantiene.go test compila un main de prueba que enlaza los archivos _test.go, luego ejecuta el binario y transmite los resultados.-count=1.go list carga paquetes sin necesariamente enlazar; -json emite estructuras para automatización.go generate escanea las líneas //go:generate y ejecuta comandos en orden de archivo; no rastrea la obsolescencia por sí mismo.go test de un Vistazo| Flag | Propósito |
|---|---|
-run regexp | Filtra pruebas, benchmarks, fuzz por nombre |
-race | Habilita el detector de race |
-cover | Imprime el porcentaje de cobertura |
-coverprofile=file | Escribe el perfil de cobertura para go tool cover |
-bench regexp | Ejecuta benchmarks que coinciden con el patrón |
-benchmem | Informa sobre asignaciones en benchmarks |
-timeout d | Mata las pruebas después de la duración (predeterminado 10m) |
-count n | Ejecuta cada prueba n veces; 1 deshabilita la caché de pasadas |
-shuffle on | Aleatoriza el orden de las pruebas para exponer acoplamientos |
go list| Campo de plantilla | Significado |
|---|---|
.ImportPath | Ruta de importación canónica |
.Dir | Directorio en disco |
.GoFiles | Archivos .go de producción seleccionados por tags |
.TestGoFiles | Archivos _test.go en el paquete |
.Deps | Rutas de importación transitivas |
.Module | Metadatos del módulo en modo de módulo |
go generate//go:generate (sin espacio antes de go).git diff en CI.go run tool@version sobre binarios locales no documentados para reproducibilidad.go test sin ./... ejecuta todo - . solo se refiere al paquete actual. Solución: go test ./... desde la raíz del módulo.go test -count=1 mientras depuras; soluciona la causa raíz antes de fusionar.-benchmem - las regresiones de asignación permanecen invisibles. Solución: añade -benchmem y compara con benchstat.go generate en CI sin comprobar diffs - la deriva se fusiona silenciosamente. Solución: ejecuta generate en un trabajo que falle si git diff no está vacío.package foo_test no puede acceder a símbolos no exportados. Solución: prueba la API exportada o usa el paquete de prueba interno package foo.jq en la salida de go list -json en scripts.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
gotestsum | Logs de CI más bonitos y XML JUnit | go test -v estándar es suficiente localmente |
make generate | El equipo quiere una única entrada para muchos generadores | go generate ./... ya cubre el módulo |
buf generate / protoc directo | Pipelines de Protobuf con sus propios plugins | Hooks simples de stringer/mockgen en archivos Go |
golangci-lint run | Linting más allá del compilador y vet | Solo necesitas el runner de pruebas de la stdlib |
func TestXxx(t *testing.T) afirma la corrección.
func BenchmarkXxx(b *testing.B) mide el rendimiento y ejecuta b.N iteraciones.
func FuzzXxx(f *testing.F) siembra entradas y luego las muta para encontrar fallos.
Ejecuta con go test -fuzz=FuzzName (Go 1.18+).
Sí.
func ExampleXxx() en archivos _test.go se compilan y opcionalmente se verifican para stdout con comentarios // Output:.
Los tags de compilación filtran las fuentes.
Los archivos con //go:build ignore nunca aparecen en .GoFiles.
No.
Lo invocas explícitamente o desde hooks de CI/Makefile.
Marca las pruebas largas con if testing.Short() { t.Skip() } y ejecuta CI con -short.
Resultados de pruebas pasadas almacenados bajo GOCACHE.
Cambiar fuentes o flags invalida las entradas; los fallos no se cachean.
Sí, pero las pruebas de package main a menudo viven en main_test.go junto a main.go.
Considera extraer la lógica en paquetes importables para facilitar las pruebas.
go list -m all desde la raíz del módulo.
En modo de espacio de trabajo, ejecuta desde la raíz del espacio de trabajo para incluir cada módulo en go.work.
Sí.
Usa go run pkg@version en las directivas para que los compañeros de equipo y la CI resuelvan la misma herramienta.
go test y go listVersiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, modernizadores de go fix - verifica el parche en la compilación), chi (última - verifica en la compilación), gin (última - verifica en la compilación), echo (última - verifica en la compilación), google.golang.org/grpc (última - verifica en la compilación), sigs.k8s.io/controller-runtime (última - verifica en la compilación), kubebuilder (última - verifica en la compilación), tinygo (última - verifica los objetivos de placa en la compilación), wazero (última - verifica en la compilación), y golangci-lint (última - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026