Salta ai contenuti

cargo-nextest - Cheatsheet del Test Runner Rust di Prossima Generazione

cargo-nextest - Cheatsheet del Test Runner Rust di Prossima Generazione

cargo-nextest è un test runner di prossima generazione per Rust. La sua differenza architettonica principale da cargo test è che esegue ogni test nel suo processo, il che fornisce true isolation (un test non può corrompere lo stato globale di un altro), migliore parallelismo e la capacità di segnalare un test che si blocca nel processo piuttosto che perdere l”intera esecuzione. In pratica è di solito 2-3x più veloce di cargo test su suite di grandi dimensioni, con output molto più pulito, rilevamento di test instabili e partizioni per CI sharding.

Installation

MethodCommand
Prebuilt (fastest)cargo install cargo-nextest --locked
Binarydownload from the nextest releases
macOS (Homebrew)brew install cargo-nextest
Verifycargo nextest --version

Basic Usage

CommandDescription
cargo nextest runEsegui tutti i test
cargo nextest run -p mycrateUn pacchetto
cargo nextest run test_nameFiltro per substring
cargo nextest listElenca i test senza eseguirli
cargo nextest run --releaseProfilo di rilascio
cargo nextest run --no-fail-fastContinua dopo i fallimenti

Filtering (Filtersets)

nextest ha un linguaggio di espressione per selezionare i test.

ExpressionSelects
-E 'test(auth)'Test il cui nome corrisponde a auth
-E 'package(mycrate)'Tutti i test in un pacchetto
-E 'kind(lib)'Solo test lib (unit)
-E 'binary(integration)'Un binario di test specifico
-E 'test(a) + test(b)'Unione
-E 'package(x) - test(slow)'Differenza
# Run integration tests for one crate, excluding slow ones
cargo nextest run -E 'package(api) and kind(test) - test(slow)'

Flaky Test Detection

# Retry failures up to 3 times; tests that pass on retry are marked FLAKY
cargo nextest run --retries 3
ConfigEffect
--retries NRiprova i test falliti N volte
Reported as FLAKYHa superato solo dopo un retry
Per-test overridesImposta i retry per test specifici nella configurazione

Questa distinzione è importante: un test instabile è un problema diverso da un test in fallimento, e nextest lo fa emergere esplicitamente invece di nasconderlo dietro una riesecuzione.

Configuration

# .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
SettingPurpose
retriesNumero di retry predefinito
slow-timeoutContrassegna/termina i test che superano una durata
threads-requiredCapacità di riserva per test pesanti
failure-outputQuando stampare i dettagli di fallimento
Profilescargo nextest run -P ci

CI Sharding

# Split the suite across 4 CI machines
cargo nextest run --partition count:1/4   # on runner 1
cargo nextest run --partition count:2/4   # on runner 2
ModeSplits by
count:N/MRound-robin per conteggio di test
hash:N/MHash stabile (stesso test → stesso shard)

Output & Reporting

OptionEffect
--status-level allMostra lo stato di ogni test
--failure-output immediateStampa i fallimenti mentre accadono
--message-format libtest-jsonOutput leggibile da macchina
--profile ciUsa le impostazioni sintonizzate per CI
JUnit outputConfigura in nextest.toml per il reporting di CI

Limitations

Not supportedWhy
DoctestsEsegui separatamente con cargo test --doc
#[bench]Usa criterion invece
Some libtest flagsSemantica di runner diversa

Uno schema di CI comune è cargo nextest run && cargo test --doc.

nextest vs cargo test

Aspectcargo nextestcargo test
Process modelUno per testUno per binario
IsolationForteCondivisa all”interno del binario
Speed2-3x più veloce tipicoBaseline
Flaky detectionIntegratoNessuno
CI shardingIntegratoManuale
DoctestsNo

Resources