Vai al contenuto principale

Jest 28: Perde peso e migliora la compatibilità 🫶

· 8 min di lettura
Simen Bekkhus
Simen Bekkhus
Traduzione Beta Non Ufficiale

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

Jest 28 è finalmente qui e porta con sé alcune funzionalità richieste da tempo come il supporto per lo sharding dei test su più macchine, gli exports dei pacchetti e la possibilità di personalizzare il comportamento dei fake timers. Questi sono solo alcuni punti salienti personali, e in questo articolo approfondiremo ulteriori novità.

Inoltre, come annunciato nel blog post di Jest 27 dello scorso anno, abbiamo rimosso alcuni pacchetti non più utilizzati per impostazione predefinita dall'installazione standard. Di conseguenza, la dimensione di installazione si è ridotta di circa un terzo.

Modifiche di rottura

L'elenco delle modifiche di rottura è lungo (e consultabile integralmente nel changelog), ma per facilitare la migrazione abbiamo preparato una guida da seguire. Speriamo che questo renda l'aggiornamento il più fluido possibile!

Le principali modifiche che potrebbero impattare la tua migrazione sono la rimozione del supporto per Node 10 e 15 (ma non per Node 12, che raggiungerà la fine del ciclo di vita tra pochi giorni) e alcune opzioni di configurazione rinominate.

Nota che entrambi i moduli rimossi (jest-environment-jsdom e jest-jasmine2) sono ancora attivamente mantenuti e testati allo stesso modo, quindi l'unica modifica di rottura consiste nella necessità di installarli esplicitamente.

La guida dovrebbe rendere banale la migrazione, ma tieni presente che se utilizzi direttamente i pacchetti che compongono Jest (come jest-worker o pretty-format) invece di eseguire semplicemente jest, dovrai consultare il changelog per verificare eventuali modifiche di rottura.

Funzionalità

Parliamo ora delle nuove funzionalità di Jest 28, decisamente più entusiasmanti! E ce ne sono parecchie, quindi preparati.

Sharding dei test

Jest include ora una nuova opzione CLI --shard, contribuita da Mario Nebl. Ti permette di eseguire parti dei test su macchine diverse, una delle richieste più antiche per Jest.

La suite di test di Jest stessa su CI è passata da circa 10 minuti a 3 su Ubuntu, e su Windows da 20 minuti a 7.

package.json exports

Jest aveva introdotto un supporto minimale per exports nella versione 27.3. Tuttavia, supportava solo il punto d'ingresso principale (.) e solo se nel package.json non era presente il campo main. Con Jest 28 siamo entusiasti di annunciare il supporto completo!

In relazione, in Jest 27 fornivamo solo la condizione require o import. In Jest 28, jest-environment-node fornirà automaticamente le condizioni node e node-addons, mentre jest-environment-jsdom fornirà la condizione browser.

Questo è stato uno dei maggiori problemi di compatibilità di Jest, e speriamo sia ora risolto definitivamente.

Fake timers

Jest 26 ha introdotto i fake timers "moderni", che utilizzano @sinonjs/fake-timers internamente, e Jest 27 li ha resi predefiniti. In Jest 28, esponiamo maggiormente l'implementazione sottostante sia tramite configurazione che API runtime. Un enorme ringraziamento a Tom Mrazauskas per aver contribuito a questa funzionalità!

Questo ti permette di non dover simulare process.nextTick, migliorando la compatibilità con Promise simulate, oppure di abilitare advanceTimers che fa avanzare automaticamente i timer.

Consulta la configurazione fakeTimers per i dettagli.

Reporter per GitHub Actions

Jest include ora un reporter dedicato per GitHub Actions, che utilizza annotazioni per visualizzare gli errori dei test direttamente nel flusso.

Screenshot errori test GitHub Actions

Puoi attivare questo reporter aggiungendo github-actions all'opzione di configurazione reporters.

Un enorme ringraziamento a Bernie Reiter e agli altri contributori per averci supportato e implementato questa funzionalità.

Opzioni inline per testEnvironmentOptions

Ora puoi passare testEnvironmentOptions direttamente nel file, analogamente a come imposti l'ambiente di test. Utile per modificare ad esempio un URL in un singolo file.

/**
* @jest-environment jsdom
* @jest-environment-options {"url": "https://jestjs.io/"}
*/

test('use jsdom and set the URL in this test file', () => {
expect(window.location.href).toBe('https://jestjs.io/');
});

Tutte le globali di Node.js

Se usi la nuova implementazione di fetch in Node v18, avrai notato che questa funzione non è disponibile in Jest. Era un problema storico dovuto alla copia manuale delle globali. Con Jest 28 analizziamo l'ambiente globale in cui Jest opera, copiando automaticamente tutte le globali mancanti nell'ambiente di test.

Moduli ECMAScript (ESM)

Il supporto agli ESM nativi è sostanzialmente invariato rispetto a Jest 27. Siamo ancora in attesa della stabilizzazione in Node.js, sperando in miglioramenti a breve!

Tuttavia, in Jest 28 abbiamo introdotto alcune nuove funzionalità.

URL data:

Tommaso Bossi ha contribuito al supporto degli URL data, permettendoti di definire inline codice JavaScript senza usare eval.

import.meta.jest

Nonostante l'accesso a jest tramite import {jest} from '@jest/globals', molti hanno segnalato che è meno ergonomico della variabile globale jest disponibile in CJS. Jest 28 introduce quindi import.meta.jest per un accesso più semplice.

Altre novità

Queste erano le funzionalità principali, ma ne abbiamo molte altre che elenchiamo rapidamente:

Risolutori asincroni

Ian VanSchooten ha implementato il supporto per risolutori asincroni, migliorando l'integrazione con strumenti come Vite.

File di setup asincroni

Per operazioni asincrone nei setupFiles, ora puoi esportare una async function che Jest attenderà prima di caricare i test.

Nota: disponibile solo per CJS. Per ESM consigliamo invece top-level await.

Utilizzo di globalThis

Internamente, Jest utilizzava global per riferirsi all'ambiente globale. Tuttavia, poiché questo esiste solo in Node e non nei browser (window), ciò causava incompatibilità quando si tentava di utilizzare i moduli di Jest in altri ambienti.

Jest 28 utilizza invece globalThis, che funziona in tutti gli ambienti.

JSDOM 19

Sebbene, come menzionato, Jest non includa più jest-environment-jsdom nell'installazione predefinita, il pacchetto è ancora attivamente mantenuto. Come parte di questo, Jest 28 è stato aggiornato da jsdom@16 a jsdom@19.

TypeScript

Se utilizzi Jest con TypeScript, sia nei test che durante la scrittura di plugin come runner personalizzati, Jest 28 introduce miglioramenti significativi ai nostri tipi. Ecco un elenco non esaustivo delle modifiche in Jest 28.

expect

Quando si utilizzano i tipi propri di expect (direttamente o tramite import {expect} from '@jest/globals'), è finalmente possibile aggiungere matcher personalizzati. Consulta il nostro esempio per vedere come fare.

Plugin personalizzati

Se scrivi un runner personalizzato, un reporter di test, un resolver o altro, ora esportiamo più tipi che dovrebbero aiutarti a tipizzare questi elementi in modo più corretto. Questo è un obiettivo in evoluzione, quindi se sei l'autore di qualcosa di collegabile in Jest e i tipi non sono utili come potrebbero, apri pure un issue!

jest-runner-tsd

jest-runner-tsd è un runner personalizzato per eseguire test di tipo. È ciò che Jest utilizza internamente per testare i nostri tipi e speriamo possa essere usato anche da altri! Come suggerisce il nome, si basa su tsd, sebbene internamente utilizzi il fork tsd-lite.


Tutti questi miglioramenti e correzioni sono stati contribuiti da Tom Mrazauskas. Grazie mille, Tom! 👏

Infine, la versione minima supportata di TypeScript è ora la 4.3.

jest-light-runner

L'ultima novità che vogliamo evidenziare in questo post è un nuovissimo runner per Jest, creato da Nicolò Ribaudo, chiamato jest-light-runner. Questo runner mantiene quasi tutta l'esperienza sviluppatore per cui Jest è noto, ma la velocizza notevolmente grazie a un'astrazione più leggera su Node. I test di Babel sono diventati quasi due volte più veloci dopo la migrazione. Sebbene ci siano alcune limitazioni, l'esistenza di questo runner dovrebbe rendere ancora più semplice per chi deve testare piccoli moduli Node scegliere Jest. Grazie, Nicolò!

Futuro

Sebbene Jest 28 sia arrivato quasi un anno dopo Jest 27, Jest 29 arriverà prima, probabilmente in pochi mesi. L'attuale piano prevede un solo cambiamento breaking (oltre alla rimozione del supporto per alcune versioni di Node): impostare snapshotFormat predefinito su {escapeString: false, printBasicPrototype: false}. Questo rende gli snapshot più leggibili e più facili da copiare-incollare.

Sarà naturalmente possibile sovrascrivere questa impostazione se non si desidera cambiare, ma puoi già utilizzare queste opzioni oggi se non vuoi aspettare!

Ringraziamenti

Jest 28 include contributi da oltre 60 persone, di cui più di due terzi sono nuovi collaboratori. Un enorme grazie a tutti i contributori, sia storici che nuovi. Senza di voi il progetto non sarebbe così valido come lo è oggi! Vorrei ringraziare in particolare Tom Mrazauskas e Feng Yu per tutti i loro contributi: dal codice alla gestione delle issue, fino al debugging, che hanno reso Jest 28 quello che è oggi. Grazie di cuore! 🙏

Grazie per la lettura e buon testing con Jest! 🃏