Skip to content

Questa guida dimostra come usare l'opzione concurrentTestGlob per eseguire selettivamente i test in modo concorrente in base ai pattern di denominazione dei file.

Struttura del progetto

Struttura del progetto
sh
my-project/
├── bunfig.toml
├── tests/
   ├── unit/
   ├── math.test.ts          # Sequenziale
   └── utils.test.ts         # Sequenziale
   └── integration/
       ├── concurrent-api.test.ts     # Concorrente
       └── concurrent-database.test.ts # Concorrente

Configurazione

Configura il tuo bunfig.toml per eseguire i file di test con il prefisso "concurrent-" in modo concorrente:

bunfig.toml
toml
[test]
# Esegui tutti i file di test con il prefisso "concurrent-" in modo concorrente
concurrentTestGlob = "**/concurrent-*.test.ts"

File di test

Test unitario (Sequenziale)

I test sequenziali sono utili per i test che condividono stato o hanno requisiti di ordinamento specifici:

tests/unit/math.test.ts
ts
import { test, expect } from "bun:test";

// Questi test vengono eseguiti in sequenza per impostazione predefinita
let sharedState = 0;

test("addizione", () => {
  sharedState = 5 + 3;
  expect(sharedState).toBe(8);
});

test("usa lo stato precedente", () => {
  // Questo test dipende dallo stato del test precedente
  expect(sharedState).toBe(8);
});

Test di integrazione (Concorrente)

I test nei file che corrispondono al pattern glob vengono eseguiti automaticamente in modo concorrente:

tests/integration/concurrent-api.test.ts
ts
import { test, expect } from "bun:test";

// Questi test vengono eseguiti automaticamente in modo concorrente grazie al nome del file che corrisponde al pattern glob.
// Usare test() è equivalente a test.concurrent() quando il file corrisponde a concurrentTestGlob.
// Ogni test è indipendente e può essere eseguito in parallelo.

test("recupera dati utente", async () => {
  const response = await fetch("/api/user/1");
  expect(response.ok).toBe(true);
});

// puoi anche usare test.concurrent() per contrassegnarlo esplicitamente come concorrente
test.concurrent("recupera post", async () => {
  const response = await fetch("/api/posts");
  expect(response.ok).toBe(true);
});

// puoi anche usare test.serial() per contrassegnarlo esplicitamente come sequenziale
test.serial("recupera commenti", async () => {
  const response = await fetch("/api/comments");
  expect(response.ok).toBe(true);
});

Esecuzione dei test

bash
# Esegui tutti i test - i file concurrent-*.test.ts verranno eseguiti in modo concorrente
bun test

# Sovrascrivi: Forza TUTTI i test ad essere eseguiti in modo concorrente
# Nota: Questo sovrascrive bunfig.toml ed esegue tutti i test in modo concorrente, indipendentemente dal glob
bun test --concurrent

# Esegui solo test unitari (sequenziali)
bun test tests/unit

# Esegui solo test di integrazione (concorrenti grazie al pattern glob)
bun test tests/integration

Vantaggi

  1. Migrazione graduale: Migra ai test concorrenti file per file rinominandoli
  2. Organizzazione chiara: La convenzione di denominazione dei file indica la modalità di esecuzione
  3. Prestazioni: I test di integrazione vengono eseguiti più velocemente in parallelo
  4. Sicurezza: I test unitari rimangono sequenziali dove necessario
  5. Flessibilità: Facile cambiare la modalità di esecuzione rinominando i file

Strategia di migrazione

Per migrare i test esistenti all'esecuzione concorrente:

  1. Inizia con i test di integrazione indipendenti - Questi tipicamente non condividono stato
  2. Rinomina i file per corrispondere al pattern glob: mv api.test.ts concurrent-api.test.ts
  3. Verifica che i test passino ancora - Esegui bun test per assicurarti che non ci siano race condition
  4. Monitora i problemi di stato condiviso - Cerca test flaky o fallimenti inaspettati
  5. Continua a migrare i test stabili incrementalmente - Non avere fretta nella migrazione

Suggerimenti

  • Usa prefissi descrittivi: concurrent-, parallel-, async-
  • Mantieni i test sequenziali correlati insieme nella stessa directory
  • Documenta perché certi test devono rimanere sequenziali con commenti
  • Usa test.concurrent() per un controllo granulare nei file sequenziali (Nota: Nei file corrispondenti a concurrentTestGlob, test() viene già eseguito in modo concorrente)

Pattern multipli

Puoi specificare più pattern per diverse categorie di test:

bunfig.toml
toml
[test]
concurrentTestGlob = [
  "**/integration/*.test.ts",
  "**/e2e/*.test.ts",
  "**/concurrent-*.test.ts"
]

Questa configurazione eseguirà i test in modo concorrente se corrispondono a uno di questi pattern:

  • Tutti i test nelle directory integration/
  • Tutti i test nelle directory e2e/
  • Tutti i test con il prefisso concurrent- ovunque nel progetto

Bun a cura di www.bunjs.com.cn