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
| Methode | Befehl |
|---|
| Prebuilt (Fastest) | cargo install cargo-nextest --locked |
| Binary | download from the nextest releases |
| macOS (Homebrew) | brew install cargo-nextest |
| Verifikation | cargo nextest --version |
Basis-Benutzung
| Befehl | Beschreibung |
|---|
cargo nextest run | Führe alle Tests aus |
cargo nextest run -p mycrate | Ein Package |
cargo nextest run test_name | Filter nach Substring |
cargo nextest list | List Tests ohne Ausführung |
cargo nextest run --release | Release-Profil |
cargo nextest run --no-fail-fast | Continue nach Fehlern |
Filtering (Filtersets)
Nextest hat eine Expression Language zum Selecting Tests.
| Expression | Selects |
|---|
-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
| Config | Effect |
|---|
--retries N | Retry fehlgeschlagene Tests N Mal |
| Reported als FLAKY | Passed nur nach einem Retry |
| Per-Test Overrides | Set 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
| Setting | Zweck |
|---|
retries | Standardmäßige Retry-Count |
slow-timeout | Flag/Kill Tests, die eine Duration überschreiten |
threads-required | Reserve Capacity für Schwer Tests |
failure-output | Wann Failure Details drucken |
| Profiles | cargo 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
| Mode | Splits nach |
|---|
count:N/M | Round-robin nach Test Count |
hash:N/M | Stabiler Hash (derselbe Test → derselbe Shard) |
Output & Reporting
| Option | Effect |
|---|
--status-level all | Zeige jeden Test’s Status |
--failure-output immediate | Print Failures, wenn sie passieren |
--message-format libtest-json | Machine-Readable Output |
--profile ci | Nutze CI-Tuned Settings |
| JUnit Output | Configure in nextest.toml für CI Reporting |
Limitations
| Nicht Unterstützt | Warum |
|---|
| Doctests | Run separat mit cargo test --doc |
#[bench] | Nutze Criterion stattdessen |
| Manche Libtest Flags | Unterschiedliche Runner Semantics |
Ein Common CI Pattern ist cargo nextest run && cargo test --doc.
Nextest vs cargo test
| Aspekt | Cargo Nextest | Cargo Test |
|---|
| Process Model | Eins Pro Test | Eins Pro Binary |
| Isolation | Stark | Shared Innerhalb Binary |
| Speed | 2–3x Schneller Typical | Baseline |
| Flaky Detection | Built-in | None |
| CI Sharding | Built-in | Manual |
| Doctests | Nein | Ja |
Ressourcen