Ce guide démontre comment utiliser l'option concurrentTestGlob pour exécuter sélectivement des tests en parallèle en fonction des motifs de nommage de fichiers.
Structure du projet
sh
my-project/
├── bunfig.toml
├── tests/
│ ├── unit/
│ │ ├── math.test.ts # Séquentiel
│ │ └── utils.test.ts # Séquentiel
│ └── integration/
│ ├── concurrent-api.test.ts # Concurrent
│ └── concurrent-database.test.ts # ConcurrentConfiguration
Configurez votre bunfig.toml pour exécuter les fichiers de test avec le préfixe "concurrent-" en parallèle :
toml
[test]
# Exécuter tous les fichiers de test avec le préfixe "concurrent-" en parallèle
concurrentTestGlob = "**/concurrent-*.test.ts"Fichiers de test
Test unitaire (séquentiel)
Les tests séquentiels sont adaptés aux tests qui partagent un état ou ont des exigences d'ordre spécifiques :
ts
import { test, expect } from "bun:test";
// Ces tests s'exécutent séquentiellement par défaut
let sharedState = 0;
test("addition", () => {
sharedState = 5 + 3;
expect(sharedState).toBe(8);
});
test("utilise l'état précédent", () => {
// Ce test dépend de l'état du test précédent
expect(sharedState).toBe(8);
});Test d'intégration (concurrent)
Les tests dans les fichiers correspondant au motif glob s'exécutent automatiquement en parallèle :
ts
import { test, expect } from "bun:test";
// Ces tests s'exécutent automatiquement en parallèle grâce au nom de fichier correspondant au motif glob.
// Utiliser test() équivaut à test.concurrent() lorsque le fichier correspond à concurrentTestGlob.
// Chaque test est indépendant et peut s'exécuter en parallèle.
test("récupérer les données utilisateur", async () => {
const response = await fetch("/api/user/1");
expect(response.ok).toBe(true);
});
// peut aussi utiliser test.concurrent() pour marquer explicitement comme concurrent
test.concurrent("récupérer les publications", async () => {
const response = await fetch("/api/posts");
expect(response.ok).toBe(true);
});
// peut aussi utiliser test.serial() pour marquer explicitement comme séquentiel
test.serial("récupérer les commentaires", async () => {
const response = await fetch("/api/comments");
expect(response.ok).toBe(true);
});Exécution des tests
bash
# Exécuter tous les tests - les fichiers concurrent-*.test.ts s'exécuteront en parallèle
bun test
# Remplacer : Forcer TOUS les tests à s'exécuter en parallèle
# Note : Cela remplace bunfig.toml et exécute tous les tests en parallèle, quel que soit le glob
bun test --concurrent
# Exécuter uniquement les tests unitaires (séquentiel)
bun test tests/unit
# Exécuter uniquement les tests d'intégration (concurrent grâce au motif glob)
bun test tests/integrationAvantages
- Migration progressive : Migrez vers des tests concurrents fichier par fichier en les renommant
- Organisation claire : La convention de nommage indique le mode d'exécution
- Performance : Les tests d'intégration s'exécutent plus rapidement en parallèle
- Sécurité : Les tests unitaires restent séquentiels lorsque nécessaire
- Flexibilité : Facile de changer le mode d'exécution en renommant les fichiers
Stratégie de migration
Pour migrer des tests existants vers une exécution concurrente :
- Commencez par les tests d'intégration indépendants - Ceux-ci ne partagent généralement pas d'état
- Renommez les fichiers pour correspondre au motif glob :
mv api.test.ts concurrent-api.test.ts - Vérifiez que les tests passent toujours - Exécutez
bun testpour vous assurer qu'il n'y a pas de conditions de course - Surveillez les problèmes d'état partagé - Surveillez les tests instables ou les échecs inattendus
- Continuez à migrer les tests stables de manière incrémentale - Ne précipitez pas la migration
Conseils
- Utilisez des préfixes descriptifs :
concurrent-,parallel-,async- - Gardez les tests séquentiels liés ensemble dans le même répertoire
- Documentez pourquoi certains tests doivent rester séquentiels avec des commentaires
- Utilisez
test.concurrent()pour un contrôle fin dans les fichiers séquentiels (Note : Dans les fichiers correspondants àconcurrentTestGlob,test()simple s'exécute déjà en parallèle)
Motifs multiples
Vous pouvez spécifier plusieurs motifs pour différentes catégories de tests :
toml
[test]
concurrentTestGlob = [
"**/integration/*.test.ts",
"**/e2e/*.test.ts",
"**/concurrent-*.test.ts"
]Cette configuration exécutera les tests en parallèle s'ils correspondent à l'un de ces motifs :
- Tous les tests dans les répertoires
integration/ - Tous les tests dans les répertoires
e2e/ - Tous les tests avec le préfixe
concurrent-n'importe où dans le projet