Cobertura, Detector de Carreras y Archivos Dorados
Perfiles de cobertura, -race en CI y pruebas de instantáneas.
Busca en todas las páginas de la documentación
Perfiles de cobertura, -race en CI y pruebas de instantáneas.
La cobertura te dice qué código se ejecutó; el detector de carreras te dice si el acceso concurrente fue inseguro; los archivos dorados capturan la salida esperada para regresiones.
Juntos fortalecen la CI cuando se combinan con aserciones significativas, no como métricas de vanidad por sí solas.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
go test -race -coverprofile=coverage.out ./...
go tool cover -func=coverage.out
go test -update ./... # patrón: flag personalizado actualiza archivos doradosfunc TestRenderGolden(t *testing.T) {
got := Render()
want, err := os.ReadFile("testdata/render.out")
if err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(string(want), got); diff != "" {
t.Fatalf("diff:\n%s", diff)
}
}Cuándo usar esto:
package report
import (
"flag"
"os"
"path/filepath"
"strconv"
"sync"
"testing"
)
var updateGolden = flag.Bool("update", false, "actualizar archivos dorados")
var cache = struct {
mu sync.Mutex
m map[string]int
}{m: make(map[string]int)}
func Inc(key string) {
cache.mu.Lock()
cache.m[key]++
cache.mu.Unlock()
}
func FormatReport(keys []string) string {
out := ""
for _, k := range keys {
cache.mu.Lock()
n := cache.m[k]
cache.mu.Unlock()
out += k + ":" + strconv.Itoa(n) + "\n"
}
return out
}
func TestIncRaceSafe(t *testing.T) {
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
defer wg.Done()
Inc("x")
}()
}
wg.Wait()
}
func TestFormatReportGolden(t *testing.T) {
Inc("a")
Inc("a")
Inc("b")
got := FormatReport([]string{"a", "b"})
path := filepath.Join("testdata", "report.golden")
if *updateGolden {
if err := os.WriteFile(path, []byte(got), 0644); err != nil {
t.Fatal(err)
}
}
want, err := os.ReadFile(path)
if err != nil {
t.Fatal(err)
}
if string(want) != got {
t.Fatalf("desajuste dorado\n--- want\n%s--- got\n%s", want, got)
}
}Lo que esto demuestra:
go test -race ejercita TestIncRaceSafe con instrumentacióntestdata/ captura la salida formateada-update reescribe los archivos dorados intencionalmente después de la revisióncache compartida-coverprofile.go tool cover -html colorea las líneas en verde/rojo para análisis manual de brechas.| Flag | Efecto |
|---|---|
-cover | Porcentaje resumen por paquete |
-coverprofile=file | Escribe el perfil para go tool cover |
-covermode=atomic | Recuentos precisos bajo paralelismo |
-coverpkg=./... | Incluye paquetes que no son de prueba en el perfil |
go test -race -timeout=10m ./...Ejecutar en agentes de CI Linux; el soporte de macOS/Windows existe pero Linux es el predeterminado común.
import "github.com/google/go-cmp/cmp"
if diff := cmp.Diff(want, got); diff != "" {
t.Fatalf("desajuste (-want +got):\n%s", diff)
}go-cmp produce diffs dorados legibles para structs y JSON.
-update oculta errores. Solución: Tratar los diffs dorados como material de revisión de código.testdata/ por convención.t.Parallel().| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Solo aserciones estructuradas | Pequeñas APIs JSON estables | Grandes transcripciones de CLI |
Comparación de cadenas de cuerpo httptest | Instantáneas HTTP | Salida binaria |
| Pruebas de mutación (go-mutesting) | Auditoría de calidad de pruebas | Costo de CI diario |
| Trazado en producción | Errores de concurrencia reales | Señal de unidad previa a la fusión |
Ningún porcentaje universal - rastrea la tendencia en paquetes centrales.
Requiere pruebas para nuevas APIs exportadas y ramas de error.
No - detecta carreras de datos, no interbloqueos ni errores lógicos.
Combina con pruebas de estrés y tiempos de espera.
Usa tags de compilación en archivos generados o filtra perfiles en scripts de CI.
No omitas probar envoltorios que contengan lógica.
Sí - go tool covdata (Go 1.20+) fusiona perfiles de trabajos de CI paralelos.
testdata/ es convencional y está excluido de los binarios normales.
Los subdirectorios por prueba están bien.
No actualices automáticamente en CI - falla y deja que los desarrolladores ejecuten localmente con -update.
Evita la aceptación silenciosa de salida incorrecta.
Mayormente sí con advertencias.
La cobertura de carreras puramente en Go es más predecible; prueba explícitamente los paquetes cgo.
Ambos viven bajo testdata/.
Los archivos de fuzzing reproducen fallos; los archivos dorados reproducen la salida esperada.
Aumenta desde el predeterminado cuando las pruebas de integración generan muchas goroutines.
-timeout=10m es un punto de partida común.
Usa go tool cover -html o la integración de cobertura de gopls cuando esté habilitada.
El informe HTML es la línea base portátil.
Pequeñas respuestas JSON - decodifica y afirma campos.
Grandes plantillas HTML - archivos dorados con diffs revisados.
Ver ci-quality-gates-lint-test-race-vuln para ordenar race, vuln y lint con pruebas.
-raceVersiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - 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 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: 16 jul 2026