Vai al contenuto principale

Jest 22: Raffinatezze e Runner Personalizzati

· 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 →

Oggi annunciamo una nuova versione major di Jest che affina quasi ogni aspetto del framework per fornire una base di testing più solida. Insieme alla community di Jest, abbiamo implementato numerosi cambiamenti che ti aiuteranno a sfruttare al meglio Jest. Abbiamo inoltre portato alla fase stabile la funzionalità dei runner personalizzati e aggiunto un nuovo pacchetto, jest-worker, per parallelizzare il lavoro su più processi. Abbiamo compilato una lista di punti salienti qui sotto, ma ti invitiamo a consultare il (sempre) massivo changelog.

Addio Node 4 e benvenuto JSDOM 11

Con questa release interrompiamo il supporto per Node 4, principalmente perché una delle nostre dipendenze principali, JSDOM, ha terminato il suo supporto. Jest ora include direttamente JSDOM 11 che offre un miglior supporto per SVG, requestAnimationFrame, URL e URLSearchParams integrati, e molto altro.

Runner Personalizzati + Parallelizzazione semplice con jest-worker

In Jest 21 abbiamo introdotto il concetto di runner personalizzati. Da allora, Rogelio, uno dei core contributor di Jest, ha creato diversi runner utili: se hai molti test esistenti scritti con altri framework ma vuoi subito beneficiare delle funzionalità di Jest, prova jest-runner-mocha. Se hai una codebase ampia che richiede linting, potresti ottenere un significativo aumento di velocità eseguendo eslint tramite Jest con jest-runner-eslint.

Per ottenere un controllo più granulare sulla parallelizzazione di task pesanti (es. trasformazione file o crawling del file system), abbiamo progettato una nuova libreria perfetta per lo scopo. Abbiamo sviluppato un modulo moderno basato su Promise con un'API accessibile, chiamato jest-worker, che permette di delegare a processi figlio le funzioni più intensive. Poiché jest-worker, come ogni altro pacchetto Jest, fa parte della piattaforma Jest, puoi usarlo liberamente anche senza utilizzare Jest stesso. Trovi maggiori informazioni nella documentazione qui.

Per comprendere meglio i runner personalizzati e Jest come piattaforma, non perderti l'intervento di Rogelio alla Reactive Conf 2017: Jest as a Platform.

Codeframe nei fallimenti dei test

Per identificare più facilmente quale asserzione fa fallire il test, abbiamo aggiunto un codeframe che mostra il contesto dell'asserzione, concentrandoti sul tuo codice. Considera questo test di esempio:

test('some test', () => {
function someFunctionWhichShouldThrow() {
if (false) {
throw new Error();
}

return 'success!';
}

expect(someFunctionWhichShouldThrow).toThrow();
});

In Jest 21, visualizzavamo il seguente errore:

failure in Jest 21

In Jest 22, abbiamo aggiunto un codeframe che fornisce più contesto alle asserzioni fallite. Abbiamo anche ripulito la stack trace rimuovendo più rumore che mai.

failure in Jest 22

Test più semplici per errori in codice asincrono

Ora puoi usare toThrow e toThrowErrorMatchingSnapshot sui rejection di promise esattamente come fai per gli errori sincroni.

async function throwingFunction() {
throw new Error('This failed');
}

test('asynchronous rejection', async () => {
await expect(throwingFunction()).rejects.toThrowErrorMatchingSnapshot();
});

Ambienti di test asincroni

Quando il team di Google Chrome ha annunciato Puppeteer, un modo per interagire programmaticamente con un vero browser Chromium, molti hanno voluto usare Jest per scrivere test eseguiti in Chrome. La community ci ha aiutato a renderlo possibile permettendo ambienti di test asincroni. Stiamo ancora lavorando per perfezionare questa esperienza, ma consulta questa guida per usare Puppeteer con Jest a partire da oggi.

Rilevamento Sperimentale delle Perdite

Abbiamo aggiunto un'impostazione sperimentale --detectLeaks a Jest che ti segnala se l'istanza interna dell'ambiente viene persa dopo l'esecuzione di un test. Ti avviserà anche quando la tua test suite tenta di richiedere un file dopo il completamento del test, indicando che hai dimenticato di attendere operazioni asincrone o lasciato qualcosa non pulito correttamente. Questo però non scopre perdite nel codice utente, solo nel codice di test; sebbene la tecnologia sottostante possa aiutarti (vedi jest-leak-detector). Se segnali un bug sull'uso della memoria in Jest, fornisci un repro in cui --detectLeaks fa fallire la test suite. Abbiamo iniziato a costruire un meccanismo di sandboxing migliore per Jest ma non è ancora pronto per essere abilitato di default. Se vuoi aiutare, contattaci su Discord!

Miglioramenti alla Modalità Watch

Nella modalità watch, ora puoi concentrarti solo sui test falliti precedentemente. In questa modalità, Jest non rieseguirà i test passati in precedenza, aiutandoti a sistemare tutti i fallimenti. Inoltre, abbiamo aggiunto un sistema di plugin alla watch mode. Aggiungendo moduli a watchPlugins nella configurazione, puoi estendere le funzionalità della modalità watch.

Supporto Babel 7

Jest utilizza Babel per la code coverage e le funzionalità avanzate di mocking. Con Jest 22, supporta anche il prossimo Babel 7. Trovi maggiori informazioni nella documentazione qui.

Miglioramenti alle funzioni mock

Ci sono stati alcuni cambiamenti alle funzioni mock in Jest 22, che le rendono ancora più semplici da usare. Innanzitutto, abbiamo aggiunto una proprietà mockName che ti permette di nominare i mock, utile nei fallimenti delle asserzioni. Abbiamo anche reso serializzabile la funzione mock di Jest in pretty-format, permettendoti di testare i mock con gli snapshot. In Jest 21, expect(jest.fn()).toMatchSnapshot() si serializzava come [Function], in Jest 22 potresti ottenere qualcosa del genere:

test('my mocking test', () => {
const mock = jest.fn().mockName('myMock');

mock('hello', {foo: 'bar'});

expect(mock).toMatchSnapshot();
});

// Serializes to:

exports[`my mocking test 1`] = `
[MockFunction myMock] {
"calls": Array [
Array [
"hello",
Object {
"foo": "bar",
},
],
],
}
`;

Punti salienti di Jest 21

Jest 21 è stato rilasciato a settembre, ma purtroppo non siamo riusciti a scrivere un blog post. Ecco quindi un rapido riepilogo delle principali novità della versione 21:

  1. Usa expect e jest-mock nel browser: Michael Jackson ha donato il suo eccellente pacchetto expect al progetto Jest. Durante questa transizione, il core team di Jest, con l'aiuto di Kenneth Skovhus, ha fatto funzionare sia jest-matchers (rinominato in expect) che jest-mock nei browser. Ciò significa che, sebbene non sia possibile usare Jest stesso nei browser (per ora), puoi usare le sue fantastiche asserzioni e mock come sostituti di Chai e Sinon in test Mocha. Se stai migrando dalla vecchia expect alla nuova expect basata su Jest, puoi usare jest-codemods per automatizzare la migrazione.

  2. Licenza MIT: Abbiamo cambiato la licenza di Jest in MIT. Evviva!

  3. Fallimento suite di test su errori asincroni: Jest aveva un bug che causava crash quando venivano lanciati errori in parti specifiche del codice asincrono. Questo è stato risolto dai contributori della comunità.

  4. Avvio più rapido: Con Jest 21 abbiamo ottimizzato l'avvio di Jest rendendolo oltre il 50% più veloce. L'elevato overhead di Jest nell'esecuzione di test piccoli e veloci è sempre stato un problema per noi, e ora non dovrebbe più trattenervi dall'utilizzare Jest.

Comunità Jest

La comunità attorno a Jest sta lavorando intensamente per migliorare ulteriormente l'esperienza di testing. Questi sono progetti separati dal core di Jest, ma vogliamo evidenziare qui alcuni dei nostri preferiti personali.

  • jest-image-snapshot – matcher personalizzato per confrontare immagini con snapshot, sviluppato dagli ingegneri di American Express

  • ts-jest – tutto il necessario per eseguire Jest con successo in progetti TypeScript, realizzato da @kulshekhar

  • jest-codemods – migra facilmente i tuoi test da altri framework a Jest

  • jest-plugins – nuovo progetto comunitario per semplificare la configurazione degli ambienti di test per strumenti specifici come React, fornendo utility pratiche

Annunciamo anche il lancio recente di un nuovo spazio per estensioni Jest di alta qualità: jest-community. È una nuova organizzazione GitHub che già ospita progetti preferiti come vscode-jest e jest-extended, curati dai maintainer e collaboratori di Jest. Abbiamo migrato anche eslint-plugin-jest e stiamo già ricevendo ottimi contributi pubblicati indipendentemente a ritmo accelerato.

Comunità Jest

Raggruppare progetti comunitari in un'unica organizzazione ci permette anche di sperimentare funzionalità come i rilasci automatizzati, che vorremmo implementare in Jest. Inoltre facilitiamo la condivisione di elementi comuni come la struttura del README (ispirati dalla comunità webpack), semplificando l'apprendimento e l'utilizzo per tutti.

Se hai qualcosa di straordinario da condividere, contattaci pure! Saremo felici di presentare il tuo progetto qui.