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

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 :

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/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 :

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