Angular day 2018, ep. 2: Jiayi Hu parla di quality, linting e tipologie di testing del codice

Angular day, seconda pillola: Jiayi Hu terrà il talk The pursuit of Quality, dove approfondirà il problema della QA in Angular 6. Si parlerà di analisi statica del codice, tecniche di test e metriche.

Garantire la qualità del codice è un problema annoso, non solo per Angular e JavaScript/TypeScript, ma per un po’ tutti i linguaggi e framework. Facciamo il consueto breve excursus.

Linting

Per linting si intende l’analisi statica del codice, tramite tool appropriati, per individuare eventuali errori potenziali, ma anche difformità di stile che possano inficiare la leggibilità del codice stesso.

Perché è importante? Nell’esempio sottostante viene definito un metodo di get (i getter sono stati introdotti con EcmaScript 5) “age”. Tuttavia, i get si aspettano un valore di ritorno, che nell’esempio non è definito, quindi quando person verrà interrogato con person.age il risultato sarà “undefined”. Questo tipo di errori non è sempre facile da individuare ad occhio, specie in applicazioni complesse.

// errore
Object.defineProperty(person, "age", {
    get: function (){
    }
});
// codice corretto
Object.defineProperty(p, "age", {
    get: function (){
        return 18;
    }
});
Linting

Per questo vengono in aiuto tools di analisi statica, come ESLint, JSLint o JSHint, che analizzano tutto il codice senza eseguirlo, alla ricerca di errori come quello citato.

Angular e Test Driven Development

È oramai comprovato che l’approccio test-driven (sviluppare attorno ai test). In Angular ci sono vari tool per facilitare questa tecnica, come Jasmine e Karma.

Jasmine è un framework di unit testing, tra i più utilizzati in JavaScript, ed è per JavaScript quello che JUnit è per Java, e NUnit per .Net. Un altro framework ritenuto interessante per la sua capacità di parallelizzare i test è Jest.

Test suite Jest in esecuzione

L’automazione dei test risulta particolarmente importante quando si tratta di regressione, ovvero verificare a ogni nuova build che il codice aggiunto non abbia “rotto” nessuna delle funzionalità precedenti già in essere.

Karma è un test runner, in grado di lanciare diverse istanze di browser (anche differenti tipi di browser), e di eseguire i test creati con pacchetti come Jasmine. Un test potrà quindi essere eseguito contemporaneamente, e in modo automatico, su molti browser.

Karma browsers infografica

Test di performance

Non è solo importante capire se un’applicazione sta funzionando correttamente e scovare eventuali bug, ma anche se la performance, ovvero la rapidità di risposta alle chiamate è accettabile per i requisiti. In sostanza si tratta di definire un carico (numero di richieste contemporanee di solito) crescente nel tempo e misurare come cambia la risposta dell’applicazione.

Performance Testing using Jmeter
Performance di Google per 100 utenti simulati con Jmeter

Ci sono diversi tool sul mercato per questo, e si va da strumenti client come Jmeter (sopra), che girano sostanzialmente in locale, a strumenti di profilazione molto più complessi, come New Relic, in grado anche di profilare applicazioni remote e individuare quali parti dell’applicazione sono il collo di bottiglia.

new relic

LINK

TDD the RITE Way

An alternative approach of writing JUnit tests (the Jasmine way)

Comparing js unit testing frameworks: mocha, jasmine & more [2018]

JavaScript Unit Testing Performance

Effective and Affordable Load Testing Using JMeter

Performance Testing using Jmeter