Jest 20: 💖 Test Piacevoli & 🏃🏽 Multi-Project-Runner
Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →
Alcuni mesi fa abbiamo annunciato Jest 19 con importanti nuove funzionalità, diventando la release più grande fino ad oggi. Jest 20 contiene il doppio delle modifiche rispetto alla versione precedente, presenta una completa riscrittura del test runner e aggiunge nuove API di testing. Questa nuova release abilita un nuovo livello di personalizzazione e configurazione per i progetti, semplificando al contempo gli aggiornamenti. Oltre al "Painless JavaScript Testing", crediamo che Jest offra ora un'esperienza di Delightful JavaScript Testing. Esaminiamo nel dettaglio le migliori nuove funzionalità:
Multi-Project-Runner & Revisione della Configurazione
Finora Jest poteva operare solo su un progetto alla volta. Ciò risultava spesso scomodo quando si lavora su molti piccoli progetti con configurazioni autonome. Con Jest 20 abbiamo completamente riscritto il test runner per eseguire più progetti contemporaneamente all'interno di una singola istanza di Jest, ad esempio lavorando su un frontend React e un backend node.js. Ecco un video di Jest che esegue test per React, Relay, Yarn e Jest stesso contemporaneamente:

Jest ora comprime la guida all'utilizzo dopo la prima esecuzione per risparmiare spazio verticale nel terminale.
Inoltre, abbiamo completamente rivisto il sistema di configurazione interno di Jest. È ora possibile passare qualsiasi opzione di configurazione tramite CLI per sovrascrivere quelle specificate nel file di configurazione. Contestualmente, abbiamo modificato Jest per cercare automaticamente un file jest.config.js, permettendo di definire la configurazione via JavaScript oltre che tramite package.json. Grazie a queste nuove funzionalità, Jest può essere combinato in modi più potenti che mai. Ad esempio, per identificare quali test verrebbero eseguiti in base ai file modificati da un commit in progetti multipli di un monorepo, è possibile combinare argomenti CLI così:
$ jest --projects projectA projectB --listTests --findRelatedTests projectA/banana.js projectB/kiwi.js
[
"projectA/banana.test.js",
"projectB/kiwi.test.js",
"projectB/pineapple.test.js",
]
Questo è particolarmente utile per sistemi di integrazione continua (CI), dove si potrebbero eseguire solo sottoinsiemi di test per le Pull Request, evitando che Jest esegua migliaia di test file ad ogni piccola modifica.
Infine, mappiamo correttamente la code coverage con TypeScript ed eseguiamo l'analisi per file non testati in processi worker, ottenendo significativi miglioramenti prestazionali.
Nuove & Migliorate API di Testing
Abbiamo apportato numerosi miglioramenti alle API di testing per scrivere test più efficaci. Sottolineiamo che tutti questi miglioramenti sono stati realizzati interamente da membri della community!
-
Testing asincrono migliorato: Nuovo supporto async/Promise tramite modificatori resolves/rejects su expect:
expect(Promise(…)).resolves.toEqual(…). Vedi documentazione. -
Verifica di
nasserzioni: Oltre all'esistenteexpect.assertions(n), il nuovoexpect.hasAssertions()assicura che un test contenga almeno un'asserzione. -
Plugin Lint: Aggiunta la regola
valid-expectineslint-plugin-jestper garantire che venga chiamata un'asserzione dopoexpect. Previene errori comeexpect(banana);senza successiva chiamata di asserzione. -
Plugin Pretty-Format: Aggiunti nuovi plugin per formattare strutture dati Immutable.js e HtmlElements negli errori di asserzione e snapshot.
-
Ambiente personalizzato: Ora è possibile aggiungere un'annotazione
@jest-environment node|jsdomnel doc-block comment di un test file per usare un ambiente diverso da quello predefinito per test specifici.
Ecco un esempio di come tutte le nuove API insieme renderanno i test più piacevoli:
/**
* @jest-environment node
*/
test('compares apples and bananas', async () => {
expect.hasAssertions(); // Ensure this test has at least one assertion.
await expect(
Promise.resolve(Immutable.Map({apples: 1, bananas: 2})),
).resolves.toEqual(Immutable.Map({apples: 1, bananas: 3}));
expect('banana'); // valid-expect in eslint-plugin-jest will show an error.
});
Questo esempio stamperà un fallimento del test simile a questo:

Modifiche di Rottura
Come per ogni rilascio importante, stiamo apportando diverse modifiche di rottura per consentire cambiamenti più grandi in futuro e portare l'esperienza di testing a un nuovo livello. Questa volta, abbiamo fatto del nostro meglio per interrompere solo API che non ci aspettiamo influenzino la maggior parte degli utenti di Jest:
-
Fork di Jasmine 2.5: Abbiamo finalmente deciso di effettuare un fork di Jasmine stessa e prendere il controllo del test runner di Jest. Questo ci permetterà di migliorare tutti gli aspetti dell'esperienza di unit testing in futuro, ma per ora ci concentriamo su riscritture incrementali e sulla riduzione della superficie delle API. Se noti che un test fallisce a causa di un'API Jasmine ora mancante, dovrebbe esserci una funzionalità equivalente sugli oggetti
jestoexpect. Di conseguenza, abbiamo rimosso molte funzionalità di Jasmine che non sono generalmente utilizzate nella maggior parte delle codebase. -
Nuovi Snapshot su CI: Gli snapshot devono sempre essere commitati insieme al test e ai moduli che stanno testando. Abbiamo modificato Jest in modo che non salvi automaticamente nuovi snapshot negli ambienti di Continuous Integration (CI) o quando viene specificato il flag
--ci. Per sovrascrivere questo comportamento, generalmente non consigliato, è possibile utilizzare il flag--updateSnapshot. -
Babel-Polyfill: Jest caricava automaticamente
babel-polyfillquando si utilizzava babel-jest, il che causava perdite di memoria all'interno di Jest. Nella maggior parte delle versioni di Node, non è necessario caricarebabel-polyfill, quindi abbiamo rimosso questa inclusione automatica e invece abbiamo modificato Jest in modo che includa soloregenerator-runtimeper impostazione predefinita, che è comunemente utilizzato per supportare async/await nelle versioni più vecchie di Node.js. Se hai bisogno dibabel-polyfill, puoi richiederlo manualmente nei tuoi file di setup.
Altri Miglioramenti
-
Documentazione: La documentazione è fondamentale per condividere le best practice e insegnare a tutti come scrivere test efficaci che porteranno a software migliore. Nell'ultime settimane abbiamo anche ampliato la documentazione di Jest per includere una FAQ sullo Snapshot Testing, una guida con informazioni su come utilizzare Jest con le librerie JavaScript più comuni e abbiamo documentato le nuove funzionalità menzionate sopra.
-
Traduzioni: Stiamo chiedendo il tuo aiuto per tradurre la documentazione di Jest per rendere più facile per le persone imparare come usare Jest.
-
Reporters Personalizzati: Jest supporta ora reporter di test personalizzati tramite l'opzione di configurazione
reporters. Puoi finalmente personalizzare l'output di Jest e integrarlo con altri strumenti generando report in formati come XML. Vedi documentazione. -
Salute della Codebase: È stato possibile iterare così rapidamente in Jest perché abbiamo dedicato molto tempo alla salute della codebase. Siamo stati uno dei primi ad adottare prettier, abbiamo aumentato notevolmente la copertura di flow, effettuato un fork di Jasmine per migliorare la nostra libreria di test runner e abbiamo riscritto e refattorizzato porzioni significative di Jest stesso per preparare Jest al successo futuro.
-
Correzioni di Bug: Come sempre, abbiamo fatto molte correzioni di bug in Jest. Il changelog completo può essere trovato nel repository Jest.
Talk su Jest
Recentemente il core team di Jest e altri contributor hanno iniziato a parlare di più di Jest e dell'esperienza di lavorare su Jest alle conferenze:
-
Rogelio Guzman ha tenuto un talk su Jest Snapshots and Beyond alla React Conf.
-
Ho parlato di Building High-Quality JavaScript Tools alla conferenza F8 di Facebook.
Come sempre, questa release non sarebbe stata possibile senza di voi, la comunità JavaScript. Siamo incredibilmente grati per l'opportunità di lavorare insieme al miglioramento dei test JavaScript. Se desiderate contribuire a Jest, non esitate a contattarci su GitHub o su Discord.
