Vai al contenuto principale

Jest 25: 🚀 Gettare le basi per il futuro

· 7 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 25 sta gettando le fondamenta per molti cambiamenti significativi futuri. Abbiamo mantenuto al minimo le modifiche breaking, ma i cambiamenti all'architettura interna potrebbero richiedere attenzione durante l'aggiornamento. Le principali novità includono l'aggiornamento di JSDOM dalla versione 11 alla 15, test eseguiti dal 10% al 15% più velocemente, una nuova visualizzazione diff per gli snapshot obsoleti e l'abbandono del supporto per Node 6.

Sono stati effettuati oltre 200 commit da più di 80 contributor da Jest 24.9, quindi come sempre, consulta il changelog per l'elenco completo delle modifiche.

Addio Node 6

Node 6 è EOL dal 30 aprile 2019, e Jest 25 lo abbandona. Rimuovere Node 6 ci consente di aggiornare le dipendenze, principalmente JSDOM, ora aggiornato alla versione 15. Questo aggiornamento elimina anche la necessità di transpilare la sintassi async-await, ottenendo sia esecuzione più rapida che minore consumo di memoria. Inoltre, il codice transpilato di Jest sarà più semplice da debug se vi capitasse di finire in quel particolare tunnel del coniglio.

Nonostante anche Node 8 sia diventato EOL, Jest 25 manterrà il supporto per facilitare l'aggiornamento a chi ancora utilizza Node 8. Ci sono però compromessi: JSDOM v16 è stato rilasciato senza supporto per Node 8, quindi dovrai usare jest-environment-jsdom-sixteen se vuoi la versione più recente.

Miglioramenti delle prestazioni

Abbiamo ricevuto segnalazioni sul rallentamento di Jest negli ultimi rilasci. Jest 25 include Micromatch aggiornato, che apporta notevoli vantaggi nei tempi di avvio, oltre a correzioni di bug e ottimizzazioni che riportano Jest alla velocità di Jest 23. Per Jest stesso, come menzionato all'inizio, questo significa una riduzione del 10-15% nel runtime dei test. Continuiamo a lavorare per migliorare, quindi verifica le performance rispetto alle versioni precedenti e apri issue se possiamo fare meglio!

Copertura del codice con V8

L'attuale strumentazione di code coverage di Jest si basa su babel-plugin-istanbul che inserisce codice di raccolta dati prima di generare report. Questo approccio è lento e dispendioso in memoria, specialmente per file e codebase grandi. Fortunatamente V8 include nativamente la code coverage, sempre più utilizzabile in Node grazie al lavoro di Benjamin Coe e altri team V8/Node.js. Jest 25 introduce supporto sperimentale tramite il nuovo flag --coverage-provider. Consulta la documentazione per avvertenze e utilizzo.

Pensare in modo rapido e lento quando i test falliscono

Lo sforzo non necessario per interpretare i report quando i test falliscono ostacola:

  • il "pensare rapido" per riconoscere pattern dall'esperienza passata

  • il "pensare lento" per analizzare cambiamenti e decidere se sono progressi attesi o regressioni inattese

Jest 25 completa la seconda metà di uno sforzo iniziato in Jest 24 per migliorare tutti i matcher:

  • righe di descrizione corrette, inclusi modificatori .rejects, .resolves e .not

  • etichette concise e allineamento coerente per valori attesi e ricevuti

  • evidenziazione inversa delle differenze tra sottostringhe quando i valori sono stringhe

  • conteggio righe modificate per identificare operazioni di sola eliminazione o inserimento

Un ringraziamento speciale al maintainer Jest Mark Pedrotti per aver guidato questo sforzo e il suo lavoro continuo per perfezionare gli errori di aspettativa.

Colori delle differenze quando i test degli snapshot falliscono

La modifica più evidente per sostituire la confusione con la fiducia sono i colori delle righe modificate nelle differenze quando i test degli snapshot falliscono:

  • - Snapshot cambia da verde a magenta

  • + Received cambia da rosso a primo piano verde acqua su sfondo ciano/acqua

Esempi di report dei test degli snapshot (prima a sinistra e dopo a destra)

  1. I conteggi delle righe modificate confermano la tua prima impressione su come è cambiato lo snapshot (ovvero, righe eliminate o inserite)

Esempio di inserimento righe snapshot

  1. I colori di sfondo attirano lo sguardo per confrontare righe modificate adiacenti

Esempio di modifica righe snapshot

  1. I colori di sfondo aiutano anche a identificare quali test toThrow richiedono una decisione sull'aggiornamento dello snapshot

Esempio modifica sottostringhe snapshot

Ecco alcuni motivi per cui abbiamo scelto colori univoci:

  • Il 95% delle persone con visione cromatica completa può riconoscere rapidamente quali report provengono da test snapshot rispetto ad altri matcher.

  • Risolve il conflitto diretto tra il significato di verde/rosso nei test Jest e rosso/verde nella code review.

  • A differenza di un'inversione a rosso/verde che suggerisce l'aggiornamento come scelta predefinita, indica che le differenze richiedono una revisione più attenta per possibili regressioni nei fallimenti locali dei test snapshot.

La differenza di tonalità dal magenta a 300° al verde acqua/ciano/acqua a 180° offre migliore accessibilità visiva, mentre lo sfondo chiaro per le righe modificate garantisce contrasto coerente su temi chiari e scuri.

Se mantieni uno strumento da riga di comando, potresti trovare ispirazione per migliorarne l'accessibilità in #9132.

Supporto per moduli ECMAScript

Node 13 ha abilitato nativamente il supporto ESM, e abbiamo iniziato a lavorare per implementarlo in Jest. Jest 25 include supporto per file di configurazione jest.config.cjs e jest.config.mjs, ma i test non possono ancora essere scritti in ESM senza trasformazione in CJS tramite Babel/TypeScript.

Le API che Jest utilizzerà sono ancora contrassegnate come sperimentali, quindi non aspettarti supporto immediato. Il Node.js Modules team sta lavorando attivamente a queste API, e monitoreremo i progressi per fornire feedback. Iscriviti a questo issue per aggiornamenti sull'implementazione in Jest.

Altre migliorie e aggiornamenti

  • Jest ha superato 1000 contributori unici. Un traguardo incredibile! Grazie a tutti per aiutare a rendere i test un'esperienza piacevole.

  • Grazie al membro della community Josh Rosenstein, Jest supporta ora BigInt nella maggior parte dei matcher (come toBeGreaterThan) e riconosce i letterali bigint senza configurazione aggiuntiva.

  • La funzionalità --detect-leaks di Jest era interrotta per Node 12+ - risolta in Jest 25.

  • Come annunciato per Jest 24, la codebase di Jest è stata riscritta in TypeScript (completata in Jest 24.3). Se usi parti di Jest, avrai una migliore integrazione IDE. Stiamo lavorando per migliorare l'interazione dei mock con i sistemi di tipi e accogliamo contributi: condividi idee qui o invia PR! Valuteremo anche di integrare direttamente in Jest le tipizzazioni per usarlo come test runner.

  • Il pacchetto jest-diff ora esporta funzioni come diffLinesUnified e diffStringsUnified che includono opzioni di configurazione, permettendo ad altre applicazioni di formattare le differenze in modo personalizzato. Per maggiori informazioni ed esempi di codice, consulta il nuovo file README.md nel repository Jest o nei repository dei pacchetti.

  • Grazie al membro della community Wei An Yen, Jest non evidenzierà più i matcher asimmetrici superati negli errori di aspettativa. Era un punto dolente da tempo con i matcher asimmetrici e siamo felici che sia finalmente risolto.

  • Per il secondo anno consecutivo, Jest ha vinto il premio Highest Satisfaction da State of JS. Siamo incredibilmente grati per il supporto della community e speriamo di capitalizzare questo slancio per rendere il 2020 ancora migliore!

Progetti futuri

  • La configurazione di Jest è vasta e un po' macchinosa: spesso esistono almeno due modi per fare la stessa cosa, a volte anche di più. Per Jest 26 speriamo di condensare la configurazione e renderla più prevedibile. Vedi questo issue per dettagli.

  • Speriamo anche di fornire una corretta API programmatica per eseguire Jest, facilitando l'integrazione in IDE e altri strumenti. Segui questo issue di tracciamento.

  • Esiste una PR aperta per aggiungere Lolex come implementazione dei timer fittizi di Jest dal dicembre 2017. Anche se non lo aggiungeremo alle API pubbliche in Jest 25, il supporto è tecnicamente incluso e stiamo valutando come esporlo per permettere test e sperimentazioni. Usarlo consentirebbe di simulare Date e altre funzioni temporali che Jest attualmente non gestisce. Consideralo sperimentale: un supporto API completo arriverà in release successive. Segui questa PR per aggiornamenti.

Buon testing! 🃏