Cobertura, Detector de Corrida & Arquivos Golden
Perfis de cobertura, -race no CI e testes de snapshot.
Busque em todas as páginas da documentação
Perfis de cobertura, -race no CI e testes de snapshot.
Cobertura informa qual código foi executado; o detector de corrida informa se o acesso concorrente foi inseguro; arquivos golden capturam a saída esperada para regressões.
Juntos, eles fortalecem o CI quando combinados com asserções significativas, não como métricas de vaidade isoladamente.
Cartão de receita de referência rápida - pronto para copiar e colar.
go test -race -coverprofile=coverage.out ./...
go tool cover -func=coverage.out
go test -update ./... # padrão: flag customizada atualiza arquivos goldenfunc 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)
}
}Quando usar isso:
package report
import (
"flag"
"os"
"path/filepath"
"strconv"
"sync"
"testing"
)
var updateGolden = flag.Bool("update", false, "atualiza arquivos golden")
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("golden mismatch\n--- want\n%s--- got\n%s", want, got)
}
}O que isso demonstra:
go test -race exercita TestIncRaceSafe com instrumentaçãotestdata/ captura a saída formatada-update reescreve os arquivos golden intencionalmente após revisãocache compartilhado-coverprofile.go tool cover -html colore linhas de verde/vermelho para análise manual de lacunas.| Flag | Efeito |
|---|---|
-cover | Porcentagem de resumo por pacote |
-coverprofile=file | Escreve o perfil para go tool cover |
-covermode=atomic | Contagens precisas sob paralelismo |
-coverpkg=./... | Inclui pacotes não de teste no perfil |
go test -race -timeout=10m ./...Executar em agentes CI Linux; suporte macOS/Windows existe, mas Linux é o padrão comum.
import "github.com/google/go-cmp/cmp"
if diff := cmp.Diff(want, got); diff != "" {
t.Fatalf("mismatch (-want +got):\n%s", diff)
}go-cmp produz diffs golden legíveis para structs e JSON.
-race porque o CI é lento - corridas vão para produção. Correção: Executar -race em pelo menos pacotes com goroutines; fragmentar testes.-update esconde bugs. Correção: Tratar diffs golden como material de revisão de código.testdata/ por convenção.-covermode=atomic em testes paralelos - contagens imprecisas. Correção: Usar modo atômico quando os testes usam t.Parallel().| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Apenas asserções estruturadas | Pequenas APIs JSON estáveis | Grandes transcrições de CLI |
Comparação de string de corpo httptest | Snapshots HTTP | Saída binária |
| Testes de mutação (go-mutesting) | Auditoria de qualidade de teste | Custo diário do CI |
| Rastreamento de produção | Bugs de concorrência reais | Sinal de unidade pré-merge |
Nenhuma porcentagem universal - acompanhe a tendência em pacotes principais.
Exija testes para novas APIs exportadas e branches de erro.
Não - ele pega corridas de dados, não deadlocks ou bugs lógicos.
Combine com testes de estresse e timeouts.
Use tags de build em arquivos gerados ou filtre perfis em scripts de CI.
Não pule testes de wrappers que contêm lógica.
Sim - go tool covdata (Go 1.20+) mescla perfis de trabalhos de CI paralelos.
testdata/ é convencional e excluído de binários normais.
Subdiretórios por teste são aceitáveis.
Não atualize automaticamente no CI - falhe e deixe os desenvolvedores executarem localmente com -update.
Previne a aceitação silenciosa de saída incorreta.
Principalmente sim, com ressalvas.
A cobertura de corrida pura em Go é mais previsível; teste pacotes cgo explicitamente.
Ambos residem em testdata/.
Arquivos de fuzz reproduzem falhas; arquivos golden reproduzem a saída esperada.
Aumente do padrão quando testes de integração geram muitas goroutines.
-timeout=10m é um ponto de partida comum.
Use go tool cover -html ou integração de cobertura gopls quando habilitada.
O relatório HTML é a linha de base portátil.
Pequenas respostas JSON - decodifique e afirme campos.
Grandes templates HTML - arquivos golden com diffs revisados.
Veja ci-quality-gates-lint-test-race-vuln para ordenar corrida, vulnerabilidade e lint com testes.
-raceVersões de Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizers - verifique o patch na compilação), chi (latest - verifique na compilação), gin (latest - verifique na compilação), echo (latest - verifique na compilação), google.golang.org/grpc (latest - verifique na compilação), sigs.k8s.io/controller-runtime (latest - verifique na compilação), kubebuilder (latest - verifique na compilação), tinygo (latest - verifique os alvos de placa na compilação), wazero (latest - verifique na compilação) e golangci-lint (latest - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026