Pular para o conteúdo

cargo-nextest - Próxima Geração de Test Runner para Rust

cargo-nextest - Próxima Geração de Test Runner para Rust

cargo-nextest é um test runner de próxima geração para Rust. Sua diferença arquitetural central de cargo test é que executa cada teste em seu próprio processo, o que dá isolamento verdadeiro (um teste não pode corromper estado global de outro), melhor paralelismo, e a habilidade de relatar um teste que derruba o processo em vez de perder a execução inteira. Na prática é tipicamente 2–3x mais rápido que cargo test em grandes suites, com saída muito mais limpa, detecção de testes flutuantes, e particionamento para sharding de CI.

Instalação

MétodoComando
Prebuilt (mais rápido)cargo install cargo-nextest --locked
Binarybaixe do nextest releases
macOS (Homebrew)brew install cargo-nextest
Verificarcargo nextest --version

Uso Básico

ComandoDescrição
cargo nextest runExecutar todos os testes
cargo nextest run -p mycrateUm package
cargo nextest run test_nameFiltrar por substring
cargo nextest listListar testes sem executar
cargo nextest run --releasePerfil release
cargo nextest run --no-fail-fastContinuar após falhas

Filtragem (Filtersets)

nextest tem uma linguagem de expressão para selecionar testes.

ExpressãoSeleciona
-E 'test(auth)'Testes cujo nome corresponde auth
-E 'package(mycrate)'Todos os testes em um package
-E 'kind(lib)'Apenas testes lib (unit)
-E 'binary(integration)'Um test binary específico
-E 'test(a) + test(b)'União
-E 'package(x) - test(slow)'Diferença
# Executar testes de integração para um crate, excluindo lentos
cargo nextest run -E 'package(api) and kind(test) - test(slow)'

Detecção de Testes Flutuantes

# Retry falhas até 3 vezes; testes que passam em retry são marcados FLAKY
cargo nextest run --retries 3
ConfigEfeito
--retries NRetry de testes falhados N vezes
Reportado como FLAKYPassou apenas após um retry
Overrides por-testeDefinir retries para testes específicos em config

Essa distinção é importante: um teste flutuante é um problema diferente de um teste falhado, e nextest o expõe explicitamente em vez de ocultá-lo atrás de um rerun.

Configuração

# .config/nextest.toml
[profile.default]
retries = 0
fail-fast = false
slow-timeout = { period = "30s", terminate-after = 2 }

[profile.ci]
retries = 2
failure-output = "immediate-final"
status-level = "skip"

[[profile.default.overrides]]
filter = 'test(integration)'
threads-required = 2
SettingPropósito
retriesContagem de retry padrão
slow-timeoutFlag/matar testes excedendo uma duração
threads-requiredReservar capacidade para testes pesados
failure-outputQuando imprimir detalhes de falha
Profilescargo nextest run -P ci

Sharding de CI

# Dividir a suite em 4 máquinas CI
cargo nextest run --partition count:1/4   # no runner 1
cargo nextest run --partition count:2/4   # no runner 2
ModoDivide por
count:N/MRound-robin por contagem de teste
hash:N/MHash estável (mesmo teste → mesmo shard)

Saída e Relatório

OpçãoEfeito
--status-level allMostrar status de cada teste
--failure-output immediateImprimir falhas conforme acontecem
--message-format libtest-jsonSaída legível por máquina
--profile ciUsar configurações ajustadas para CI
Saída JUnitConfigurar em nextest.toml para CI reporting

Limitações

Não suportadoPor quê
DoctestsExecutar separadamente com cargo test --doc
#[bench]Usar criterion em vez
Algumas flags libtestSemântica de runner diferente

Um padrão CI comum é cargo nextest run && cargo test --doc.

nextest vs cargo test

Aspectocargo nextestcargo test
Modelo de processoUm por testeUm por binary
IsolamentoForteCompartilhado dentro do binary
Velocidade2–3x mais rápido típicoBaseline
Detecção de flutuaçãoIntegradaNenhuma
Sharding de CIIntegradoManual
DoctestsNãoSim

Recursos