Skip to content

bun test e profondamente integrato con il runtime di Bun. Questo e parte di cio che rende bun test veloce e semplice da usare.

Variabili di Ambiente ​

NODE_ENV ​

bun test imposta automaticamente $NODE_ENV a "test" a meno che non sia gia impostato nell'ambiente o tramite file .env. Questo e un comportamento standard per la maggior parte dei test runner e aiuta a garantire un comportamento coerente dei test.

test.ts
ts
import { test, expect } from "bun:test";

test("NODE_ENV e impostato a test", () => {
  expect(process.env.NODE_ENV).toBe("test");
});

Puoi sovrascriverlo impostando esplicitamente NODE_ENV:

bash
NODE_ENV=development bun test

TZ (Fuso Orario) ​

Di default, tutte le esecuzioni di bun test usano UTC (Etc/UTC) come fuso orario a meno che non venga sovrascritto dalla variabile di ambiente TZ. Questo garantisce un comportamento coerente di date e orari tra diversi ambienti di sviluppo.

test.ts
ts
import { test, expect } from "bun:test";

test("il fuso orario e UTC di default", () => {
  const date = new Date();
  expect(date.getTimezoneOffset()).toBe(0);
});

Per testare con un fuso orario specifico:

bash
TZ=America/New_York bun test

Timeout dei Test ​

Ogni test ha un timeout predefinito di 5000ms (5 secondi) se non viene esplicitamente sovrascritto. I test che superano questo timeout falliranno.

Timeout Globale ​

Cambia il timeout globalmente con il flag --timeout:

bash
bun test --timeout 10000  # 10 secondi

Timeout per Test ​

Imposta il timeout per test come terzo parametro alla funzione di test:

test.ts
ts
import { test, expect } from "bun:test";

test("test veloce", () => {
  expect(1 + 1).toBe(2);
}, 1000); // 1 secondo di timeout

test("test lento", async () => {
  await new Promise(resolve => setTimeout(resolve, 8000));
}, 10000); // 10 secondi di timeout

Timeout Infinito ​

Usa 0 o Infinity per disabilitare il timeout:

test.ts
ts
test("test senza timeout", async () => {
  // Questo test puo essere eseguito indefinitamente
  await someVeryLongOperation();
}, 0);

Gestione degli Errori ​

Errori Non Gestiti ​

bun test traccia i rifiuti di promise non gestiti e gli errori che si verificano tra i test. Se si verificano tali errori, il codice di uscita finale sara non-zero (specificamente, il conteggio di tali errori), anche se tutti i test passano.

Questo aiuta a catturare errori nel codice asincrono che altrimenti potrebbero passare inosservati:

test.ts
ts
import { test } from "bun:test";

test("test 1", () => {
  // Questo test passa
  expect(true).toBe(true);
});

// Questo errore avviene fuori da qualsiasi test
setTimeout(() => {
  throw new Error("Errore non gestito");
}, 0);

test("test 2", () => {
  // Anche questo test passa
  expect(true).toBe(true);
});

// L'esecuzione dei test fallira comunque con un codice di uscita non-zero
// a causa dell'errore non gestito

Rifiuti di Promise ​

Anche i rifiuti di promise non gestiti vengono catturati:

test.ts
ts
import { test } from "bun:test";

test("test che passa", () => {
  expect(1).toBe(1);
});

// Questo causera il fallimento dell'esecuzione dei test
Promise.reject(new Error("Rifiuto non gestito"));

Gestione Personalizzata degli Errori ​

Puoi impostare gestori di errori personalizzati nel tuo setup di test:

test-setup.ts
ts
process.on("uncaughtException", error => {
  console.error("Eccezione non catturata:", error);
  process.exit(1);
});

process.on("unhandledRejection", (reason, promise) => {
  console.error("Rifiuto non gestito a:", promise, "motivo:", reason);
  process.exit(1);
});

Integrazione con i Flag CLI ​

Diversi flag CLI di Bun possono essere usati con bun test per modificarne il comportamento:

Utilizzo della Memoria ​

bash
# Riduce l'utilizzo della memoria per la VM del test runner
bun test --smol

Debugging ​

bash
# Collega il debugger al processo del test runner
bun test --inspect
bun test --inspect-brk

Caricamento dei Moduli ​

bash
# Esegue script prima dei file di test (utile per setup globali/mock)
bun test --preload ./setup.ts

# Imposta costanti a tempo di compilazione
bun test --define "process.env.API_URL='http://localhost:3000'"

# Configura loader personalizzati
bun test --loader .special:special-loader

# Usa un tsconfig diverso
bun test --tsconfig-override ./test-tsconfig.json

# Imposta le condizioni di package.json per la risoluzione dei moduli
bun test --conditions development

# Carica variabili di ambiente per i test
bun test --env-file .env.test

Flag Relativi all'Installazione ​

bash
# Influenza qualsiasi richiesta di rete o auto-install durante l'esecuzione dei test
bun test --prefer-offline
bun test --frozen-lockfile

Watch Mode e Hot Reloading ​

Modalita Watch ​

Quando esegui bun test con il flag --watch, il test runner guardera i cambiamenti dei file e rieseguira i test interessati.

bash
bun test --watch

Il test runner e intelligente su quali test rieseguire:

math.test.ts
ts
import { add } from "./math.js";
import { test, expect } from "bun:test";

test("addizione", () => {
  expect(add(2, 3)).toBe(5);
});

Se modifichi math.js, solo math.test.ts sara rieseguito, non tutti i test.

Hot Reloading ​

Il flag --hot fornisce funzionalita simile ma e piu aggressivo nel tentare di preservare lo stato tra le esecuzioni:

bash
bun test --hot

Per la maggior parte degli scenari di test, --watch e l'opzione raccomandata in quanto fornisce un migliore isolamento tra le esecuzioni dei test.

Variabili Globali ​

Le seguenti variabili globali sono automaticamente disponibili nei file di test senza importazione (anche se possono essere importate da bun:test se preferito):

test.ts
ts
// Tutte queste sono disponibili globalmente
test("funzione di test globale", () => {
  expect(true).toBe(true);
});

describe("describe globale", () => {
  beforeAll(() => {
    // beforeAll globale
  });

  it("funzione it globale", () => {
    // it e un alias per test
  });
});

// Compatibilita con Jest
jest.fn();

// Compatibilita con Vitest
vi.fn();

Puoi anche importarle esplicitamente se preferisci:

test.ts
ts
import { test, it, describe, expect, beforeAll, beforeEach, afterAll, afterEach, jest, vi } from "bun:test";

Integrazione con il Processo ​

Codici di Uscita ​

bun test usa codici di uscita standard:

  • 0: Tutti i test passano, nessun errore non gestito
  • 1: Si sono verificati fallimenti dei test
  • >1: Numero di errori non gestiti (anche se i test passano)

Gestione dei Segnali ​

Il test runner gestisce correttamente i segnali comuni:

bash
# Ferma gracefully l'esecuzione dei test
kill -SIGTERM <test-process-pid>

# Ferma immediatamente l'esecuzione dei test
kill -SIGKILL <test-process-pid>

Rilevamento dell'Ambiente ​

Bun rileva automaticamente alcuni ambienti e modifica il comportamento:

test.ts
ts
// Rilevamento GitHub Actions
if (process.env.GITHUB_ACTIONS) {
  // Bun emette automaticamente annotazioni GitHub Actions
}

// Rilevamento CI
if (process.env.CI) {
  // Alcuni comportamenti possono essere modificati per gli ambienti CI
}

Considerazioni sulle Performance ​

Singolo Processo ​

Il test runner esegue tutti i test in un singolo processo per default. Questo fornisce:

  • Avvio piu veloce - Non c'e bisogno di spawnare piu processi
  • Memoria condivisa - Utilizzo efficiente delle risorse
  • Debugging semplice - Tutti i test in un processo

Pero, questo significa:

  • I test condividono stato globale (usa gli hook del ciclo di vita per pulire)
  • Un crash di un test puo influenzare gli altri
  • Nessuna vera parallelizzazione dei singoli test

Gestione della Memoria ​

bash
# Monitora l'utilizzo della memoria
bun test --smol  # Riduce l'impronta di memoria

# Per grandi suite di test, considera di dividere i file
bun test src/unit/
bun test src/integration/

Isolamento dei Test ​

Poiche i test vengono eseguiti nello stesso processo, assicurati una pulizia adeguata:

test.ts
ts
import { afterEach } from "bun:test";

afterEach(() => {
  // Pulisci lo stato globale
  global.myGlobalVar = undefined;
  delete process.env.TEST_VAR;

  // Resetta i moduli se necessario
  jest.resetModules();
});

Bun a cura di www.bunjs.com.cn