Vai al contenuto principale

Jest 26: Tic Tac

· 7 min di lettura
Traduzione Beta Non Ufficiale

Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →

Quando abbiamo iniziato a ricostruire Jest cinque anni fa, il nostro obiettivo era fornire un test runner "completo di tutto" senza configurazione, accessibile per i principianti, estensibile per quasi tutti i casi d'uso dei test e scalabile per grandi progetti. Una delle release fondamentali fu Jest 15 che unificò tutto e fornì impostazioni predefinite valide, consentendo alle persone di eseguire Jest spesso senza alcuna configurazione. Tuttavia, questo approccio ha un grosso svantaggio: Jest installa molte dipendenze nei vostri progetti che potreste non necessitare.

Stiamo ora iniziando a risolvere questa carenza e stiamo lavorando per ridurre la dimensione dell'installazione di Jest mantenendolo accessibile ed estensibile. Abbiamo apportato le seguenti modifiche sostanziali in Jest 26:

  • [expect, jest-mock, pretty-format] Rimossi i file di build ES5 con un nuovo supporto minimo per ES2015 (Node 8) utilizzati solo per build browser (#9945)

    Migrazione: Con questo cambiamento, stiamo trasferendo la responsabilità di bundlizzare i pacchetti interessati agli utenti, anziché fornirli predefiniti in Jest, poiché loro conoscono meglio i loro ambienti target. Se li volete ripristinati, siamo aperti alla possibilità di distribuirli come pacchetti separati. PR benvenute!

  • [jest-config, jest-resolve] Rimozione del supporto per il campo browser (#9943)

    Migrazione: Installa il modulo browser-resolve e utilizza la seguente configurazione:

    {
    "jest": {
    "resolver": "<rootDir>/resolver.js"
    }
    }
    // resolver.js
    const browserResolve = require('browser-resolve');

    module.exports = browserResolve.sync;
  • Le definizioni TypeScript richiedono TypeScript v3.8 come minimo (#9823)

Con le modifiche sopra indicate, Jest 26 è ora più piccolo di 4 MiB rispetto a Jest 25.5.4 (53 → 49 MiB). Tieni presente che molte dipendenze come Babel sono probabilmente già parte del tuo progetto. La dimensione effettiva di Jest è stata ridotta di 1,2 MiB (4,3 -> 3,1 MiB).

Sebbene questo sia un buon inizio, non è sufficiente per rendere Jest significativamente più snello. Stiamo pianificando di ridurre gradualmente le dimensioni di Jest e della sua dependency tree fino al 70%. La maggior parte dei cambiamenti per ridurre la configurazione predefinita di Jest saranno piccole modifiche sostanziali e vogliamo coinvolgere il più possibile la community. Pertanto apporteremo le seguenti modifiche in Jest 27 e Jest 28 utilizzando un processo di rilascio "Tick-Tock":

  • Jest 27 includerà predefinitamente un nuovo test runner "jest-circus" e l'ambiente Node.js. jest-jasmine2 e jest-environment-jsdom saranno ancora inclusi, così che gli utenti possano continuare a utilizzarli modificando una riga nella configurazione.

  • Jest 28 rimuoverà jest-jasmine2 e jest-environment-jsdom dalla distribuzione predefinita di Jest. I pacchetti saranno ancora attivamente mantenuti come parte del progetto Jest e pubblicati separatamente. Gli utenti dovranno installare questi pacchetti per utilizzarli.

Durante l'aggiornamento a queste major release, Jest ti guiderà attraverso le modifiche necessarie. Se vuoi anticipare e migrare ora alle nuove impostazioni predefinite, e il tuo progetto non richiede un ambiente DOM, puoi aggiornare a Jest 26 e aggiungere le seguenti opzioni di configurazione:

{
"jest": {
"testEnvironment": "node",
"testRunner": "jest-circus/runner"
}
}

Jest continuerà a includere babel-jest abilitato di default. Attualmente supporta diverse funzionalità oltre alla compilazione della sintassi JavaScript moderna per renderla compatibile con le versioni attuali di Node.js e browser: gestisce anche la copertura del codice e il mocking dei moduli ES in Jest. Jest include attualmente il supporto sperimentale per la copertura V8 e il supporto nativo per i moduli ES (ne parleremo più avanti!). Non è possibile simulare moduli ES statici secondo le specifiche senza prima trasformare il codice, quindi incoraggeremo pattern funzionanti senza la trasformazione che oggi utilizziamo con Babel. Una volta stabilizzati il supporto per la copertura V8 e i moduli ES nativi in Jest, potremo rimuovere babel-jest come default, ma continueremo a mantenerlo.

Nuovi timer fittizi

Con Jest 26 introduciamo una nuova implementazione dei timer fittizi basata su @sinonjs/fake-timers. Desideravamo farlo da anni e siamo felici che abbia finalmente raggiunto un livello sufficiente per supportare tutti i casi d'uso esistenti dei timer fittizi in Jest.

La nuova implementazione include funzionalità aggiuntive come la simulazione di Date, queueMicrotask e altro ancora (vedi questa README). Funziona in modo trasparente utilizzando le API esistenti come jest.runAllTimers() — consulta la documentazione sul nostro sito.

Siamo sicuri che questa implementazione sia pronta per la produzione, ma non vogliamo forzare la riscrittura dei test a chi dipende da sottili differenze tra vecchia e nuova implementazione. In Jest 26, questa nuova implementazione rimarrà opzionale e potrà essere attivata chiamando jest.useFakeTimers('modern') o passando modern all'opzione timers nella configurazione, se hai precedentemente abilitato timer fittizi per tutti i test.

In Jest 27 imposteremo come default la nuova implementazione "moderna", ma continueremo a supportare e mantenere l'implementazione legacy, attivabile chiamando jest.useFakeTimers('legacy'). Se non sei certo di poter aggiornare tutti i test prima dell'uscita di Jest 27, puoi aggiungere questa opzione ai test ora per mantenere il comportamento precedente.

Ringraziamo Carl-Erik Kopseng, Benjamin Gruenbaum e gli altri maintainer di @sinonjs/fake-timers per l'aiuto e la pazienza dimostrati nel collaborare con noi! Emozionante.

Un nuovo modo di utilizzare Jest - @jest/globals

Jest ha tradizionalmente utilizzato globali resi popolari dal framework di testing Jasmine e altri, come describe, it, test ed expect. Sebbene sia uno schema ampiamente utilizzato, molti hanno espresso la preferenza per l'importazione di funzioni di testing. Per supportare questo caso d'uso, abbiamo aggiunto un nuovo pacchetto @jest/globals che consente di importare le funzioni di testing: import {expect, jest, test} from '@jest/globals';.

Avvertenze:

  • Attualmente le variabili globali esistono ancora nell'ambiente, ma introdurremo una modalità per disabilitarle in futuro. Analogamente, non puoi usare const jest = require('@jest/globals') poiché otterresti errori di dichiarazione: la variabile jest è ancora globale per ora.

  • Attualmente non è possibile aggiungere matcher personalizzati alle definizioni TypeScript quando si utilizzano globali in questo modo.

  • Sebbene ciò consenta di eseguire test senza globali, attualmente non permette di eseguire test senza il test runner di Jest.

Supporto nativo per ESM

Come menzionato nel post del blog di Jest 25, abbiamo lavorato al supporto nativo per i Moduli ECMAScript. Non è ancora stabile ma è pronto per essere testato. Ci piacerebbe ricevere il tuo feedback e segnalazioni di bug! Per una panoramica dello stato attuale puoi consultare questo issue o esplorare tutti gli issue con l'etichetta ES Modules.

Altri Cambiamenti Incompatibili in Jest 26

  • Rimosso il supporto per Node 8 (#9423)

  • [jest-environment-jsdom] Aggiornamento di jsdom alla versione 16 (#9606)

  • [jest-runtime] Rimozione dei metodi require.requireActual e require.requireMock deprecati da tempo (#9854)

  • [jest-haste-map] Rimozione di providesModuleNodeModules (#8535)

  • [jest-circus] Fallimento dei test se un test utilizza una callback done e restituisce valori (#9129)

  • [jest-circus] Generazione di un errore appropriato se un test/hook è definito in modo asincrono (#8096)

Restate al Sicuro

Stiamo tutti vivendo un periodo senza precedenti di incertezza. Se stai affrontando difficoltà finanziarie, vorremmo utilizzare il fondo Open Collective di Jest per aiutare nuovi ed esistenti contributori. Assegniamo ricompense su alcuni issue e siamo disponibili ad offrire ricompense per qualsiasi issue aperto - puoi suggerire che un issue meriti una ricompensa direttamente nell'issue o contattare @cpojer via messaggio privato su Twitter.

Per favore, restate al sicuro.