Aller au contenu

cargo-nextest - Exécuteur de test Rust nouvelle génération

cargo-nextest - Exécuteur de test Rust nouvelle génération

cargo-nextest est un exécuteur de test de nouvelle génération pour Rust. Sa différence architecturale clé par rapport à cargo test est qu’il exécute chaque test dans son propre processus, ce qui donne une véritable isolation (un test ne peut pas corrompre l’état global d’un autre), un meilleur parallélisme, et la capacité de rapporter un test qui fait planter le processus plutôt que de perdre toute l’exécution. En pratique, il est généralement 2–3x plus rapide que cargo test sur les grandes suites, avec une sortie beaucoup plus propre, la détection de tests flaky, et le partitionnement pour le sharding CI.

Installation

MéthodeCommande
Prebuilt (le plus rapide)cargo install cargo-nextest --locked
Binairetélécharger depuis les nextest releases
macOS (Homebrew)brew install cargo-nextest
Vérifiercargo nextest --version

Utilisation basique

CommandeDescription
cargo nextest runExécuter tous les tests
cargo nextest run -p mycrateUn seul paquet
cargo nextest run test_nameFiltrer par sous-chaîne
cargo nextest listLister les tests sans les exécuter
cargo nextest run --releaseProfil release
cargo nextest run --no-fail-fastContinuer après les défaillances

Filtrage (Filtersets)

nextest a un langage d’expression pour sélectionner les tests.

ExpressionSélectionne
-E 'test(auth)'Tests dont le nom correspond à auth
-E 'package(mycrate)'Tous les tests dans un paquet
-E 'kind(lib)'Uniquement les tests lib (unité)
-E 'binary(integration)'Un binaire de test spécifique
-E 'test(a) + test(b)'Union
-E 'package(x) - test(slow)'Différence
# Exécuter les tests d'intégration pour un crate, excluant les lents
cargo nextest run -E 'package(api) and kind(test) - test(slow)'

Détection de tests flaky

# Réessayer les défaillances jusqu'à 3 fois ; les tests qui passent au retry sont marqués FLAKY
cargo nextest run --retries 3
ConfigEffet
--retries NRéessayer les tests échoués N fois
Rapporté comme FLAKYPassé uniquement après un retry
Overrides par testDéfinir les retries pour les tests spécifiques dans la config

Cette distinction est importante : un test flaky est un problème différent d’un test échoué, et nextest le surface explicitement au lieu de le cacher derrière une réexécution.

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
ParamètreObjectif
retriesNombre de retries par défaut
slow-timeoutFlag/tuer les tests dépassant une durée
threads-requiredRéserver la capacité pour les tests lourds
failure-outputQuand imprimer les détails des défaillances
Profilescargo nextest run -P ci

Sharding CI

# Diviser la suite sur 4 machines CI
cargo nextest run --partition count:1/4   # sur le runner 1
cargo nextest run --partition count:2/4   # sur le runner 2
ModeDivise par
count:N/MRound-robin par nombre de tests
hash:N/MHash stable (même test → même shard)

Sortie et rapports

OptionEffet
--status-level allAfficher le statut de chaque test
--failure-output immediateImprimer les défaillances au fur et à mesure
--message-format libtest-jsonSortie lisible par machine
--profile ciUtiliser les paramètres tuning CI
Sortie JUnitConfigurer dans nextest.toml pour rapports CI

Limitations

Non supportéPourquoi
DoctestsExécuter séparément avec cargo test --doc
#[bench]Utiliser criterion à la place
Certains flags libtestSémantique d’exécuteur différente

Un modèle CI courant est cargo nextest run && cargo test --doc.

nextest vs cargo test

Aspectcargo nextestcargo test
Modèle de processusUn par testUn par binaire
IsolationFortPartagé dans le binaire
Vitesse2–3x plus rapide typiquementBaseline
Détection flakyIntégréAucun
Sharding CIIntégréManuel
DoctestsNonOui

Ressources