Cobertura & CI
Cobertura mede quais linhas foram executadas durante os testes. cargo-llvm-cov integra-se com a cobertura LLVM do Rust e se encaixa em pipelines de CI ao lado de fmt, clippy e nextest.
Receita
cargo install cargo-llvm-cov
cargo llvm-cov --workspace --lcov --output-path lcov.info# Trecho de CI
- run: cargo llvm-cov --workspace --fail-under-lines 70Quando usar isso: Rastrear lacunas de teste em crates críticos e prevenir regressões de cobertura no main.
Exemplo de Trabalho
name: ci
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: 1.97.0
- run: cargo fmt --check
- run: cargo clippy --workspace --all-targets -- -D warnings
- run: cargo nextest run --workspace
- run: cargo install cargo-llvm-cov
- run: cargo llvm-cov --workspace --lcov --output-path lcov.info
- uses: codecov/codecov-action@v4
with:
files: lcov.infoO que isso demonstra:
- Toolchain fixada em Rust 1.97.0
- Testes executados antes da coleta de cobertura
- Exportação LCOV para Codecov ou similar
- Gate opcional
--fail-under-linesem PRs
Mergulho Profundo
O que Cobertura Significa em Rust
| Métrica | Notas |
|---|---|
| Cobertura de linha | Métrica comum de CI |
| Cobertura de branch | Mais difícil; llvm-cov foca em regiões |
Braços de match não cobertos | Alvos de alto valor |
Cobertura não é igual a correção. Combine com clippy, testes de propriedade e revisão.
Fluxo de Trabalho Local
cargo llvm-cov --open # Relatório HTML
cargo llvm-cov --summary-only # Resumo rápido no terminalExclua código gerado e módulos #[cfg(test)] apenas via arquivo de configuração .llvm-cov.toml, se necessário.
Armadilhas
- Perseguir 100% de cobertura - retornos decrescentes e testes frágeis. Correção: proteja crates críticos (domínio, pagamento) com um limite maior do que o código de cola.
- Cobertura sem testes em execução - falsa confiança. Correção: garanta que
cargo testounextestpassem primeiro no job de CI. - Viés de Doctests - execute
cargo llvm-cov --docseparadamente se a política incluir documentação. Correção: documente quais alvos contam para o gate. - Testes de integração instáveis no job de cobertura - CI vermelha não relacionada à cobertura. Correção: divida o job rápido de unidade/cobertura do job lento de E2E.
- Cobertura do perfil de depuração - não comparável à de release. Correção: cobertura sempre no perfil de teste (debug) de forma consistente.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
tarpaulin | Configuração rápida apenas para Linux | Consistência llvm multiplataforma necessária |
| Sem gate de cobertura | Protótipo inicial | Caminhos de pagamento/autenticação de produção |
| Teste de mutação | Auditoria de qualidade de teste | CI padrão (caro) |
FAQs
llvm-cov vs tarpaulin?
llvm-cov usa a instrumentação nativa do rustc; geralmente preferido pela precisão e suporte a workspace.
Qual limite de falha?
Comece com 60-70% de linhas em crates de domínio; aumente gradualmente; nunca bloqueie em módulos gerados/boilerplate.
Incluir testes de integração?
Sim, por padrão, ao executar o teste completo do workspace; use -p para escopo.
Como excluir arquivos?
Padrões de ignorar em .llvm-cov.toml para saída de build.rs e módulos de tests/fixtures.
Cobertura no CI do macOS?
llvm-cov funciona; garanta que o toolchain Xcode/clang esteja disponível no runner.
Mesclar cobertura de matriz?
Faça upload do lcov por job; Codecov mescla relatórios da matriz de SO/recursos.
Cobertura inclui benches?
Não, a menos que você execute benches explicitamente sob llvm-cov; benches são alvos separados.
Cobertura da matriz de recursos?
Execute --all-features em um job separado; a cobertura pode diferir por cfg.
Comentários de PR?
Codecov ou similar posta a cobertura de diferença nas linhas alteradas.
Manifesto virtual de workspace?
Execute a partir da raiz com --workspace; o mesmo que testes.
Relacionado
- Melhores Práticas de Teste - política de CI
- Linting em CI - gates de fmt/clippy
- Configuração de CI para Rust - pipeline completo
- Subcomandos Úteis do Cargo - nextest
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.