Skip to content

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

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 # Concurrent

Configuration

Configurez votre bunfig.toml pour exécuter les fichiers de test avec le préfixe "concurrent-" en parallèle :

bunfig.toml
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 :

tests/unit/math.test.ts
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 :

tests/integration/concurrent-api.test.ts
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/integration

Avantages

  1. Migration progressive : Migrez vers des tests concurrents fichier par fichier en les renommant
  2. Organisation claire : La convention de nommage indique le mode d'exécution
  3. Performance : Les tests d'intégration s'exécutent plus rapidement en parallèle
  4. Sécurité : Les tests unitaires restent séquentiels lorsque nécessaire
  5. 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 :

  1. Commencez par les tests d'intégration indépendants - Ceux-ci ne partagent généralement pas d'état
  2. Renommez les fichiers pour correspondre au motif glob : mv api.test.ts concurrent-api.test.ts
  3. Vérifiez que les tests passent toujours - Exécutez bun test pour vous assurer qu'il n'y a pas de conditions de course
  4. Surveillez les problèmes d'état partagé - Surveillez les tests instables ou les échecs inattendus
  5. 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 :

bunfig.toml
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

Bun édité par www.bunjs.com.cn