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éthode | Commande |
|---|
| Prebuilt (le plus rapide) | cargo install cargo-nextest --locked |
| Binaire | télécharger depuis les nextest releases |
| macOS (Homebrew) | brew install cargo-nextest |
| Vérifier | cargo nextest --version |
Utilisation basique
| Commande | Description |
|---|
cargo nextest run | Exécuter tous les tests |
cargo nextest run -p mycrate | Un seul paquet |
cargo nextest run test_name | Filtrer par sous-chaîne |
cargo nextest list | Lister les tests sans les exécuter |
cargo nextest run --release | Profil release |
cargo nextest run --no-fail-fast | Continuer après les défaillances |
Filtrage (Filtersets)
nextest a un langage d’expression pour sélectionner les tests.
| Expression | Sé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
| Config | Effet |
|---|
--retries N | Réessayer les tests échoués N fois |
| Rapporté comme FLAKY | Passé uniquement après un retry |
| Overrides par test | Dé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ètre | Objectif |
|---|
retries | Nombre de retries par défaut |
slow-timeout | Flag/tuer les tests dépassant une durée |
threads-required | Réserver la capacité pour les tests lourds |
failure-output | Quand imprimer les détails des défaillances |
| Profiles | cargo 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
| Mode | Divise par |
|---|
count:N/M | Round-robin par nombre de tests |
hash:N/M | Hash stable (même test → même shard) |
Sortie et rapports
| Option | Effet |
|---|
--status-level all | Afficher le statut de chaque test |
--failure-output immediate | Imprimer les défaillances au fur et à mesure |
--message-format libtest-json | Sortie lisible par machine |
--profile ci | Utiliser les paramètres tuning CI |
| Sortie JUnit | Configurer dans nextest.toml pour rapports CI |
Limitations
| Non supporté | Pourquoi |
|---|
| Doctests | Exécuter séparément avec cargo test --doc |
#[bench] | Utiliser criterion à la place |
| Certains flags libtest | Sémantique d’exécuteur différente |
Un modèle CI courant est cargo nextest run && cargo test --doc.
nextest vs cargo test
| Aspect | cargo nextest | cargo test |
|---|
| Modèle de processus | Un par test | Un par binaire |
| Isolation | Fort | Partagé dans le binaire |
| Vitesse | 2–3x plus rapide typiquement | Baseline |
| Détection flaky | Intégré | Aucun |
| Sharding CI | Intégré | Manuel |
| Doctests | Non | Oui |
Ressources