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
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 # ConcorrenteConfigurazione
Configura il tuo bunfig.toml per eseguire i file di test con il prefisso "concurrent-" in modo concorrente:
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:
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:
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/integrationVantaggi
- Migrazione graduale: Migra ai test concorrenti file per file rinominandoli
- Organizzazione chiara: La convenzione di denominazione dei file indica la modalità di esecuzione
- Prestazioni: I test di integrazione vengono eseguiti più velocemente in parallelo
- Sicurezza: I test unitari rimangono sequenziali dove necessario
- Flessibilità: Facile cambiare la modalità di esecuzione rinominando i file
Strategia di migrazione
Per migrare i test esistenti all'esecuzione concorrente:
- Inizia con i test di integrazione indipendenti - Questi tipicamente non condividono stato
- Rinomina i file per corrispondere al pattern glob:
mv api.test.ts concurrent-api.test.ts - Verifica che i test passino ancora - Esegui
bun testper assicurarti che non ci siano race condition - Monitora i problemi di stato condiviso - Cerca test flaky o fallimenti inaspettati
- 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 aconcurrentTestGlob,test()viene già eseguito in modo concorrente)
Pattern multipli
Puoi specificare più pattern per diverse categorie di test:
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