Zum Inhalt springen

cargo-nextest - Next-Generation Rust Test Runner Cheatsheet

cargo-nextest - Next-Generation Rust Test Runner Cheatsheet

cargo-nextest ist ein Next-Generation Test Runner für Rust. Sein Kern architektonischer Unterschied von cargo test ist, dass er jeden Test in seinem eigenen Prozess führt, was echte Isolation gibt (ein Test kann den globalen State des anderen nicht korruptieren), bessere Parallelism und die Ability zu berichten über einen Test, der den Prozess crasht, anstatt den ganzen Lauf zu verlieren. In der Praxis ist es normalerweise 2–3x schneller als cargo test auf großen Suites, mit viel sauberer Ausgabe, Flaky-Test-Erkennung und Partitionierung für CI-Sharding.

Installation

MethodeBefehl
Prebuilt (Fastest)cargo install cargo-nextest --locked
Binarydownload from the nextest releases
macOS (Homebrew)brew install cargo-nextest
Verifikationcargo nextest --version

Basis-Benutzung

BefehlBeschreibung
cargo nextest runFühre alle Tests aus
cargo nextest run -p mycrateEin Package
cargo nextest run test_nameFilter nach Substring
cargo nextest listList Tests ohne Ausführung
cargo nextest run --releaseRelease-Profil
cargo nextest run --no-fail-fastContinue nach Fehlern

Filtering (Filtersets)

Nextest hat eine Expression Language zum Selecting Tests.

ExpressionSelects
-E 'test(auth)'Tests deren Name Matches auth
-E 'package(mycrate)'Alle Tests in einem Package
-E 'kind(lib)'Nur Lib (Unit) Tests
-E 'binary(integration)'Ein Spezifisches Test Binary
-E 'test(a) + test(b)'Union
-E 'package(x) - test(slow)'Difference
# Führe Integration Tests für ein Crate aus, exclude Slow Ones
cargo nextest run -E 'package(api) and kind(test) - test(slow)'

Flaky Test Detection

# Retry Failures bis zu 3 Mal; Tests, die nach Retry passen, sind markiert FLAKY
cargo nextest run --retries 3
ConfigEffect
--retries NRetry fehlgeschlagene Tests N Mal
Reported als FLAKYPassed nur nach einem Retry
Per-Test OverridesSet Retries für Spezifische Tests in Config

Diese Unterscheidung Matters: ein Flaky Test ist ein anderes Problem als ein Failing Test, und Nextest oberflächlichst es explizit anstatt zu verstecken hinter einem Rerun.

Konfiguration

# .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
SettingZweck
retriesStandardmäßige Retry-Count
slow-timeoutFlag/Kill Tests, die eine Duration überschreiten
threads-requiredReserve Capacity für Schwer Tests
failure-outputWann Failure Details drucken
Profilescargo nextest run -P ci

CI Sharding

# Split die Suite über 4 CI-Maschinen
cargo nextest run --partition count:1/4   # on runner 1
cargo nextest run --partition count:2/4   # on runner 2
ModeSplits nach
count:N/MRound-robin nach Test Count
hash:N/MStabiler Hash (derselbe Test → derselbe Shard)

Output & Reporting

OptionEffect
--status-level allZeige jeden Test’s Status
--failure-output immediatePrint Failures, wenn sie passieren
--message-format libtest-jsonMachine-Readable Output
--profile ciNutze CI-Tuned Settings
JUnit OutputConfigure in nextest.toml für CI Reporting

Limitations

Nicht UnterstütztWarum
DoctestsRun separat mit cargo test --doc
#[bench]Nutze Criterion stattdessen
Manche Libtest FlagsUnterschiedliche Runner Semantics

Ein Common CI Pattern ist cargo nextest run && cargo test --doc.

Nextest vs cargo test

AspektCargo NextestCargo Test
Process ModelEins Pro TestEins Pro Binary
IsolationStarkShared Innerhalb Binary
Speed2–3x Schneller TypicalBaseline
Flaky DetectionBuilt-inNone
CI ShardingBuilt-inManual
DoctestsNeinJa

Ressourcen