Vai al contenuto principale

Jest 27: Le nuove impostazioni predefinite di Jest, edizione 2021 ⏩

· 7 min di lettura
Tim Seckinger
Tim Seckinger
Traduzione Beta Non Ufficiale

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

Circa un anno fa nel post del blog su Jest 26, abbiamo annunciato che dopo due rilasci principali con poche modifiche di rilievo, Jest 27 avrebbe attivato alcune opzioni per impostare valori predefiniti migliori per progetti nuovi o che possono migrare senza problemi. Questo ci dà l'opportunità di rimuovere alcuni pacchetti dalla distribuzione predefinita di Jest 28 e pubblicarli invece come moduli installabili separatamente e collegabili. Chi utilizza le nuove impostazioni predefinite beneficia di dimensioni di installazione ridotte, mentre chi necessita di questi pacchetti può comunque installarli separatamente.

Con il primo grande cambiamento delle impostazioni predefinite dai tempi delle Nuove Impostazioni Predefinite per Jest introdotte con la fondamentale versione 15, Jest 27 è ora qui per mantenere Jest veloce, leggero e rilevante nel futuro. In questo articolo spiegheremo questi cambiamenti nei predefiniti e altre importanti modifiche di rilievo, ma prima scopriamo alcune nuove entusiasmanti funzionalità!

Aggiornamenti delle funzionalità

Innanzitutto, la modalità interattiva che potresti conoscere per la revisione e l'aggiornamento degli snapshot falliti ora può essere utilizzata anche per scorrere i test falliti uno alla volta. Il merito va al contributore alla prima esperienza @NullDivision per aver implementato questa funzionalità!

Esecuzione interattiva di test falliti

Parlando di snapshot, una delle funzionalità più interessanti rilasciate negli ultimi anni sono gli Inline Snapshot, che sono apparsi in una release minore di Jest 23 quasi tre anni fa. Tuttavia, erano accompagnati dalla restrizione che i progetti che volevano utilizzarli dovevano impiegare Prettier per formattare il codice, poiché Jest lo avrebbe utilizzato per garantire che il file in cui scrive gli snapshot rimanesse correttamente formattato.
Per la maggior parte di questi anni, abbiamo quindi avuto una pull request in lavorazione per eliminare questa restrizione e consentire l'uso di Inline Snapshot senza Prettier. Ha accumulato oltre cento commenti, senza contare le PR divise da essa e integrate prima, e ha persino cambiato proprietario dopo la presentazione iniziale di un altro contributore alla prima esperienza, @mmkal, con l'esilarante titolo provvisorio "Uglier Inline Snapshots". Con l'ascesa stellare di Prettier negli ultimi tempi, questo miglioramento è forse meno necessario rispetto al 2018, ma sappiamo bene la sensazione di imbattersi in un progetto che non usa Prettier e di non poter più usare gli snapshot inline. Mai più!

La ragione principale per cui ci è voluto così tanto per integrare questa funzionalità è stata, sorprendentemente, un errore di memoria esaurita nella nostra pipeline di build. Si è scoperto che le dipendenze caricate per ogni file di test per eseguire il parsing, l'inserimento degli snapshot e la stampa comportano un sovraccarico significativo in termini di tempo e memoria.
Con alcuni accorgimenti, abbiamo velocizzato l'inizializzazione per file di test di circa il 70% rispetto a Jest 26. Nota che quasi certamente non vedrai un miglioramento così ampio nel tuo progetto—servirebbero molti file di test eseguiti molto rapidamente per notarlo appieno, e il sovraccarico quando si usa un ambiente JSDOM ridimensiona qualsiasi miglioramento del genere.

Altre novità: il supporto nativo per ESM sta progredendo, ma alcune complessità importanti, ad esempio sul mocking, sono ancora davanti a noi, e continuiamo a considerare la migrazione a ESM come un enorme sforzo dell'ecosistema, in cui Node e molti strumenti e pacchetti cruciali devono fare affidamento reciproco per offrire un'esperienza complessivamente convincente.
Il supporto ESM per l'inserimento di moduli in Jest è più avanzato—runner personalizzati, reporter, watch plugin e molti altri moduli possono già essere caricati come moduli ES.

Abbiamo anche integrato una PR per gestire file di test collegati simbolicamente nella directory dei test, una funzionalità molto richiesta dagli utenti di Bazel.

Un'altra PR ha reso asincrone le transform, requisito fondamentale per supportare efficacemente strumenti di transpilazione come esbuild, Snowpack e Vite.

Modifica delle impostazioni predefinite

Fino ad ora, utilizzando Jest con configurazione predefinita, veniva eseguito - forse inconsapevolmente - codice derivato anni fa dal test runner Jasmine 2.0, che fornisce funzioni come describe, it e beforeEach. Nel 2017, Aaron Abramov ha scritto un sostituto per il codice Jasmine chiamato jest-circus, progettato per migliorare messaggi d'errore, manutenibilità ed estensibilità.
Dopo anni di utilizzo su larga scala in Facebook e in Jest stesso, oltre alla recente adozione in create-react-app, siamo ora certi che jest-circus sia altamente compatibile con jest-jasmine2 e funzioni nella maggior parte degli ambienti senza sforzi di migrazione. Potrebbero esserci lievi differenze nell'ordine di esecuzione e nella rigidità, ma non ci aspettiamo problemi significativi a parte codice che dipende da API specifiche di Jasmine come jasmine.getEnv(). Se fai ampio uso di tali API, puoi riattivare il test runner basato su Jasmine configurando "testRunner": "jest-jasmine2".

Eseguire test in un ambiente JSDOM comporta un significativo sovraccarico prestazionale. Essendo questo il comportamento predefinito di Jest finora, utenti che sviluppano app Node potrebbero non sapere di utilizzare un costoso ambiente DOM non necessario.
Per questo motivo cambiamo l'ambiente di test predefinito da "jsdom" a "node". Se questo cambiamento ti impatta perché utilizzi API DOM senza configurazione esplicita, riceverai un errore quando si accede a document: risolvi configurando "testEnvironment": "jsdom" o usando la configurazione per file.
Per progetti misti, consigliamo l'ambiente veloce "node" come default, dichiarando tramite docblock solo i test che richiedono il DOM.
Nella prossima major, elimineremo jest-jasmine2 e jest-environment-jsdom dalle dipendenze di Jest, richiedendone l'installazione esplicita per ridurre dimensioni e componenti non necessari.

Un'altra modifica riguarda i Fake Timers (Timer Mocks). In Jest 26 abbiamo introdotto un'implementazione "moderna" opt-in, accessibile tramite le stesse API ma con mocking più completo (es. Date, queueMicrotask).
Questa implementazione moderna diventa ora il default. Se sei tra i pochi impattati da differenze implementative troppo complesse da migrare, puoi ripristinare la vecchia versione con jest.useFakeTimers("legacy") o, se abiliti i fake timer globalmente via configurazione, con "timers": "legacy".

Funzionalità con breaking changes

Abbiamo introdotti piccoli breaking change per prevenire errori comuni:

  • La stessa callback done non può essere invocata più volte,

  • chiamare done e restituire una Promise non possono essere combinati,

  • un blocco describe non deve restituire alcun valore,

e abbiamo reso più rigidi alcuni tipi TypeScript.

I moduli utilizzati nelle seguenti opzioni di configurazione ora vengono trasformati come il resto del codice, il che potrebbe causare problemi se facevi affidamento sul loro caricamento originale:

  • testEnvironment

  • runner

  • testRunner

  • snapshotResolver

Varie modifiche di rilievo

Abbiamo rimosso alcune funzioni deprecate da tempo:

  • jest.addMatchers (usa invece expect.extend)

  • jest.resetModuleRegistry (usa invece jest.resetModules)

  • jest.runTimersToTime (usa invece jest.advanceTimersByTime)

Molti pacchetti di Jest sono stati migrati per utilizzare export in stile ESM (anche se distribuiti ancora come CommonJS), quindi se utilizzi direttamente ad esempio pretty-format, potrebbe essere necessario modificare l'import in un import default.

Abbiamo interrotto il supporto per Node 13, ma Jest supporta sempre le versioni Current e tutte LTS di Node, e Jest 27 continua a supportare Node 10, diventato obsoleto solo recentemente.

Come sempre, il changelog completo e l'elenco delle modifiche di rilievo sono disponibili qui.

Infine, ringraziamo la comunità per aver nuovamente premiato Jest con un tasso di soddisfazione altissimo del 96% nel sondaggio State of JS 2020! Restate al sicuro e continuate a godervi Jest nei prossimi anni e versioni! 🃏