Che cos’è e a cosa serve Jest nel testing software

Che cos’è e a cosa serve Jest nel testing software

Testing dinamico

Nel testing software, l’analisi dinamica è il processo di valutazione di un intero sistema, o di un suo componente, basato sull’osservazione del suo comportamento in esecuzione. Un prerequisito fondamentale per svolgere questo tipo di testing è conoscere il risultato atteso, in modo tale da poter effettuare un confronto con il comportamento osservato. Per essere in grado di fare ciò, è necessario quello che viene definito oracolo, ovvero un oggetto che conosce nel dettaglio ogni caso di test, ed è quindi in grado di prevederne il comportamento. L’oracolo può essere di due tipi: umano o automatico. Il primo si basa sulla conoscenza dei requisiti o su congetture personali, mentre il secondo prende forma grazie alla definizione di specifiche formali o sulla base dei risultati di uno stesso software, che ha origini differenti.

L’analisi dinamica si divide principalmente in due categorie, che differiscono per l’approccio che adottano. La prima è quella del black-box testing, o testing funzionale. Si basa sulla sola conoscenza dei requisiti di sistema, e si preoccupa di analizzare gli output generati dal sistema, o dal componente che si sta testando, in risposta ad input specifici. La seconda è definita white-box testing, o testing strutturale, in quanto richiede una profonda conoscenza della struttura del software, e quindi dell’intero codice. Sulla base di queste informazioni vengono poi definiti i casi di test, gli input associati e i risultati attesi.

Nel prossimo paragrafo analizzeremo nel dettaglio il testing dinamico, in particolare approfondiremo quello basato sui test unitari, realizzati mediante l’utilizzo del tool Jest.

Che cos'è e a cosa serve Jest nel testing software

Test unitari con Jest

Lo Unit Testing o, letteralmente, testing di unità, ha come scopo quello di verificare il corretto funzionamento dei singoli moduli di cui il sistema è composto, quindi isolati da tutto il resto. E’ un’attività che è stata riconosciuta come modello standardizzato da IEEE (1008-1987), e può essere vista come un insieme delle seguenti fasi:

  1. Pianificare il metodo da utilizzare, quindi individuare quali saranno le risorse richieste e le tempistiche previste.
  2. Individuare le funzionalità da testare.
  3. Determinare, quindi realizzare, l’insieme degli script di test.
  4. Eseguire i test.
  5. Verificare se è necessario scrivere ulteriori test.
  6. Valutare i risultati finali.

E’ quindi importante prestare una particolare attenzione ai servizi che dipendono da componenti esterni, in quanto stiamo andando a testare la singola unità, andando ad isolarla dall’intero sistema.

Test Doubles

Ci sono diversi modi in cui è possibile simulare un elemento da cui dipende un componente, o isolare un singolo modulo:

  • Dummy: è un oggetto che non viene effettivamente utilizzato, la cui presenza è però necessaria affinché il metodo venga eseguito, e se ne possa così verificare la correttezza.
  • Stub: fornisce risposte cablate per causare particolari comportamenti del sistema sotto verifica, per i soli casi previsti dalle procedure di L’esito è determinato solo al termine dell’interazione tra il sistema e il test double.
  • Spy: è un particolare tipo di stub che, in più, registra le chiamate effettuate dall’oggetto sotto test, per permettere di verificare a posteriori la corretta comunicazione con il componente originale.
  • Fake: è un oggetto che sostituisce il componente originale per ragioni che esulano dalla verifica del buon funzionamento del sistema.
  • Mock: è uno stub che verifica il funzionamento del sistema, essendo in grado di stabilire l’esito della verifica durante lo svolgimento dell’interazione stessa.

Questo significa che la realizzazione di una buona suite di test non implica semplicemente la scrittura di test cases validi, ma anche di classi mock che andranno a sostituire le dipendenze durante l’esecuzione dei test.

Jest

Jest è un JavaScript test runner, ovvero una libreria che permette di scrivere, eseguire e strutturare i test in modo molto semplice. Riassumiamo alcune delle sue caratteristiche principali:

  • Configurazione. Molto semplice da configurare, basta installare il pacchetto in qualsiasi tipo progetto, e tutte le funzionalità di Jest saranno subito disponibili.
  • Sicuro. Si accerta che tutti i test girino in un proprio processo, riuscendo cosi ad eseguirne di più in parallelo.
  • Veloce. Per accelerare la fase di testing, Jest esegue prima quelli che hanno fallito in precedenza, e riorganizza gli altri in base al tempo di cui necessitano.
  • Code Coverage. Genera in automatico un report sulla code coverage, se il comando viene eseguito con il flag –coverage, senza bisogno di ulteriori installazioni.
  • Debug. E’ molto semplice capire il motivo per cui un test è fallito, in quanto Jest mette a disposizione un log di errore ricco ed esaustivo, che rende il lavoro di debug rapido ed efficace.

Jest vs Karma

Anche Karma è un test runner, creato dal team di AngularJS, infatti è quello usato di default per testare progetti scritti in Angular. Per eseguire gli script di test, Karma apre il proprio browser, e fa girare tutti test che sono specificati nel file chiamato karma.conf.ts, il che è un vantaggio, ma dall’altro lato non è possibile ottenere un report sulla code coverage, a meno che non si installino dei plugin aggiuntivi.

Jest è invece basato su Jasmine, un altro framework che permette, tramite alcune funzioni come equal e toBe, di verificare se un determinato comportamento sta funzionando come previsto, e che supporta anche il mocking, rendendo possibile l’isolamento dei test. La letteratura sul testing suggerisce i seguenti motivi per cui usare Jest al posto di Karma:

  • Jest è da 2 a 3 volte più veloce. Il motivo è che Karma utilizza un vero browser per eseguire i test, mentre Jest utilizza la riga di comando, per cui il tempo necessario viene dimezzato. Ciò è particolarmente importante quando si utilizza una pipeline CI/CD. Essendo i test più veloci, anche i tempi di esecuzione verranno ridotti.
  • Istantanee. Quando viene eseguito un test per la prima volta, tramite il metodo toMatchSnapshot() è possibile creare un’istantanea del componente e memorizzarla in una cartella. Ogni volta che testiamo l’applicazione, Jest genera istantanee per tutti i componenti e le abbina a quelle precedenti. Questa è un’ottima funzionalità perché garantisce che l’interfaccia utente non cambi in modo imprevisto.
  • Procedura di installazione. Una delle filosofie portate avanti dai creatori di Jest, come già detto, è quella della zero-configuration experience, che si dimostra essere vera, in quanto Jest funziona benissimo con la maggior parte delle applicazioni JavaScript, almeno nelle sue funzionalità di base. A differenza di Karma, che invece necessita di molte più configurazioni iniziali.

Tuttavia evidenzia anche alcuni svantaggi:

  • Poichè Jest non gira su un vero browser, ma usa jsdom, c’è il rischio che questo differisca da quello che andremo poi ad utilizzare.
  • Il debugging, a livello visivo, è più difficile rispetto a Karma.

Infine, Jest supporta quindi tutte le funzionalità di Jasmine, e integra anche quelle di Karma, motivo per il quale andremo a disinstallare quest’ultimo, insieme a tutte le sue dipendenze, cosi da avere un codice più pulito.

Pubblicato da Vito Lavecchia

Lavecchia Vito Ingegnere Informatico (Politecnico di Bari) Email: [email protected] Sito Web: https://vitolavecchia.altervista.org

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *