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étodo | Comando |
|---|
| Prebuilt (mais rápido) | cargo install cargo-nextest --locked |
| Binary | baixe do nextest releases |
| macOS (Homebrew) | brew install cargo-nextest |
| Verificar | cargo nextest --version |
Uso Básico
| Comando | Descrição |
|---|
cargo nextest run | Executar todos os testes |
cargo nextest run -p mycrate | Um package |
cargo nextest run test_name | Filtrar por substring |
cargo nextest list | Listar testes sem executar |
cargo nextest run --release | Perfil release |
cargo nextest run --no-fail-fast | Continuar após falhas |
Filtragem (Filtersets)
nextest tem uma linguagem de expressão para selecionar testes.
| Expressão | Seleciona |
|---|
-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
| Config | Efeito |
|---|
--retries N | Retry de testes falhados N vezes |
| Reportado como FLAKY | Passou apenas após um retry |
| Overrides por-teste | Definir 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
| Setting | Propósito |
|---|
retries | Contagem de retry padrão |
slow-timeout | Flag/matar testes excedendo uma duração |
threads-required | Reservar capacidade para testes pesados |
failure-output | Quando imprimir detalhes de falha |
| Profiles | cargo 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
| Modo | Divide por |
|---|
count:N/M | Round-robin por contagem de teste |
hash:N/M | Hash estável (mesmo teste → mesmo shard) |
Saída e Relatório
| Opção | Efeito |
|---|
--status-level all | Mostrar status de cada teste |
--failure-output immediate | Imprimir falhas conforme acontecem |
--message-format libtest-json | Saída legível por máquina |
--profile ci | Usar configurações ajustadas para CI |
| Saída JUnit | Configurar em nextest.toml para CI reporting |
Limitações
| Não suportado | Por quê |
|---|
| Doctests | Executar separadamente com cargo test --doc |
#[bench] | Usar criterion em vez |
| Algumas flags libtest | Semântica de runner diferente |
Um padrão CI comum é cargo nextest run && cargo test --doc.
nextest vs cargo test
| Aspecto | cargo nextest | cargo test |
|---|
| Modelo de processo | Um por teste | Um por binary |
| Isolamento | Forte | Compartilhado dentro do binary |
| Velocidade | 2–3x mais rápido típico | Baseline |
| Detecção de flutuação | Integrada | Nenhuma |
| Sharding de CI | Integrado | Manual |
| Doctests | Não | Sim |
Recursos