Sviluppo test driven di un front-end con AngularJS

71
Università degli Studi di Padova Dipartimento di Matematica Corso di Laurea in Informatica Sviluppo test driven di un front-end con AngularJS Tesi di laurea triennale Relatore Prof. Mauro Conti Laureando Mattia Sorgato Anno Accademico 2014-2015

Transcript of Sviluppo test driven di un front-end con AngularJS

Page 1: Sviluppo test driven di un front-end con AngularJS

Università degli Studi di Padova

Dipartimento di Matematica

Corso di Laurea in Informatica

Sviluppo test driven di un front-end conAngularJS

Tesi di laurea triennale

Relatore

Prof. Mauro Conti

Laureando

Mattia Sorgato

Anno Accademico 2014-2015

Page 2: Sviluppo test driven di un front-end con AngularJS

Mattia Sorgato: Sviluppo test driven di un front-end con AngularJS, Tesi di laureatriennale, c© Ott 2015.

Page 3: Sviluppo test driven di un front-end con AngularJS

Sommario

Il presente documento descrive il lavoro svolto durante il periodo di Stage, della duratadi circa trecento ore, dal laureando Mattia Sorgato presso l’azienda IKS s.r.l. Gliobbiettivi da raggiungere erano molteplici.In primo luogo, l’ideazione e l’implementazione del front-end[g] di un software per lagestione del personale e dei progetti aziendali, per la quale scrittura è stato richiestol’impiego del framework AngularJS.In secondo luogo, la scrittura delle Application Program Interface (API)[g] necessariealla stesura del back-end[g].Per garantire la qualità del codice, durante l’intero progetto l’approccio utilizzato èstato Test Driven.

iii

Page 4: Sviluppo test driven di un front-end con AngularJS
Page 5: Sviluppo test driven di un front-end con AngularJS

Ringraziamenti

Innanzitutto, vorrei esprimere la mia gratitudine al Prof. Mauro Conti, relatore dellamia tesi, per l’aiuto e il sostegno fornitomi durante la stesura del lavoro.

Desidero ringraziare con affetto i miei genitori per il sostegno, il grande aiuto e peressermi stati vicini in ogni momento durante gli anni di studio.

Ho desiderio di ringraziare poi i miei amici per tutti i bellissimi anni passati insieme ele mille avventure vissute.

Padova, Ott 2015 Mattia Sorgato

v

Page 6: Sviluppo test driven di un front-end con AngularJS
Page 7: Sviluppo test driven di un front-end con AngularJS

Indice

1 Introduzione 11.1 L’azienda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1 Aree di intervento . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 L’idea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Vincoli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.3.1 Tecnologici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3.2 Temporali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3.3 Organizzativi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.4 Organizzazione del testo . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2 Metodologie e tecnologie 52.1 Metodologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.1.1 Agile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1.2 Test Driven Developement . . . . . . . . . . . . . . . . . . . . . 8

2.2 Tecnologie utilizzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2.1 Tecnologie di sviluppo . . . . . . . . . . . . . . . . . . . . . . . 92.2.2 Strumenti di supporto ai processi . . . . . . . . . . . . . . . . . 112.2.3 Ambiente di sviluppo . . . . . . . . . . . . . . . . . . . . . . . 132.2.4 Tecnologie di Testing . . . . . . . . . . . . . . . . . . . . . . . . 142.2.5 Strumenti di Automazione . . . . . . . . . . . . . . . . . . . . . 14

3 Descrizione dello stage 173.1 Analisi preventiva dei rischi . . . . . . . . . . . . . . . . . . . . . . . . 173.2 Requisiti e obiettivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.3 Pianificazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.3.1 Fase 1: Formazione (40 ore) . . . . . . . . . . . . . . . . . . . . 183.3.2 Fase 2: Analisi e Progettazione (40 ore) . . . . . . . . . . . . . 193.3.3 Fase 3: Implementazione (180 ore) . . . . . . . . . . . . . . . . 193.3.4 Fase 4: Test e Verifica (40 ore) . . . . . . . . . . . . . . . . . . 20

4 Analisi dei requisiti 214.1 Casi d’uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.2 Tracciamento dei requisiti . . . . . . . . . . . . . . . . . . . . . . . . . 24

5 Progettazione e codifica 275.1 Progettazione Architetturale . . . . . . . . . . . . . . . . . . . . . . . . 27

5.1.1 Front-end REST . . . . . . . . . . . . . . . . . . . . . . . . . . 275.2 Architettura di AngularJS . . . . . . . . . . . . . . . . . . . . . . . . . 28

5.2.1 Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

vii

Page 8: Sviluppo test driven di un front-end con AngularJS

viii INDICE

5.2.2 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285.2.3 Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295.2.4 Two-way Data Binding . . . . . . . . . . . . . . . . . . . . . . . 305.2.5 Dependency Injection . . . . . . . . . . . . . . . . . . . . . . . 31

5.3 Definizione delle API REST . . . . . . . . . . . . . . . . . . . . . . . . 315.3.1 Informazioni utente . . . . . . . . . . . . . . . . . . . . . . . . 325.3.2 Esperienze professionali . . . . . . . . . . . . . . . . . . . . . . 335.3.3 Titoli di studio ed abilitazioni professionali . . . . . . . . . . . 355.3.4 Skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365.3.5 Progetti associati . . . . . . . . . . . . . . . . . . . . . . . . . . 37

5.4 Stub Back-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395.5 Codifica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

5.5.1 Callback e Promesse JavaScript . . . . . . . . . . . . . . . . . . 405.5.2 Diagrammi di attività . . . . . . . . . . . . . . . . . . . . . . . 42

6 Verifica e validazione 456.1 Test di unità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

6.1.1 Test di unità di AngularJS . . . . . . . . . . . . . . . . . . . . 456.2 Test End-To-End . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

7 Conclusioni 517.1 Bilancio finale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517.2 Problematiche incontrate . . . . . . . . . . . . . . . . . . . . . . . . . 527.3 Conoscenze acquisite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527.4 Valutazione personale . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Glossary 55

Acronyms 59

Bibliografia 61

Page 9: Sviluppo test driven di un front-end con AngularJS

Elenco delle figure

1.1 Logo di IKS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

2.1 Esempio di Kanban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2 Logo di AngularJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3 Logo di Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.4 Logo di Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.5 Logo di JIRA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.6 Esempio di schermata di una kanban di JIRA . . . . . . . . . . . . . . 122.7 Logo di Stash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.8 Branching e merging in STASH . . . . . . . . . . . . . . . . . . . . . . 132.9 Logo di PhPStorm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.10 Logo di Jasmine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.11 Logo di Grunt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.12 Logo di Karma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.13 Logo di NPM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.14 Logo di Protractor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.1 Diagramma Gantt della pianificazione iniziale . . . . . . . . . . . . . . 18

4.1 Use Case - Login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.2 Use Case - Dashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

5.1 Esempio di legame tra vista-controller -servizio . . . . . . . . . . . . . 295.2 Esempio di template di una vista e Data Binding . . . . . . . . . . . . 305.3 Esempio di legame tra template e Controller . . . . . . . . . . . . . . 305.4 Doppio legame tra vista e modello di AngularJS . . . . . . . . . . . . 315.5 Esempio di configurazione di una factory per l’iniettore . . . . . . . . 325.6 Diagramma di attività generale di SkillMatrix . . . . . . . . . . . . . . 425.7 Diagramma di attività di gestione delle skill di SkillMatrix . . . . . . 43

6.1 Metriche di copertura generali nel progetto SkillMatrix . . . . . . . . . 466.2 Metriche di copertura dei controller nel progetto SkillMatrix . . . . . 466.3 Metriche di copertura dei servizi nel progetto SkillMatrix . . . . . . . 466.4 Grafica da console dell’esecuzione di test End-To-End (E2E) di Protractor 48

7.1 Grafico di rapporto tra requisiti totali e soddisfatti . . . . . . . . . . . 51

ix

Page 10: Sviluppo test driven di un front-end con AngularJS

x ELENCO DELLE TABELLE

Elenco delle tabelle

4.1 Tabella del tracciamento dei requisti funzionali . . . . . . . . . . . . . 254.2 Tabella del tracciamento dei requisiti qualitativi . . . . . . . . . . . . 264.3 Tabella del tracciamento dei requisiti di vincolo . . . . . . . . . . . . . 26

Page 11: Sviluppo test driven di un front-end con AngularJS

Capitolo 1

Introduzione

Breve introduzione al capitoloIntroduzione al contesto applicativo dello Stage ed ai vincoli posti per la sua riuscita.

1.1 L’azienda

Dal 1999 IKS s.r.l. focalizza il proprio agire per fornire ai Clienti soluzioni abilitanti perla realizzazione di servizi di e-business, nell’ambito della sicurezza e della governance[g]Information and Communication Technology (ICT)[g] , il tutto con un approccio rivoltoall’ottimizzazione.Sin dall’inizio, l’azienda investe su temi strategici per l’ICT: sicurezza informatica,automazione e governance di infrastrutture, sviluppo di soluzioni software complesse etecnologicamente innovative, ottimizzazione di architetture informatiche di alto livello.La propensione all’innovazione ed il costante investimento nella formazione permettonoalla società a metà degli anni Duemila di affermarsi a livello nazionale con sedi aPadova, Milano e Roma e di diventare il riferimento tecnologico di aziende di altolivello che affidano all’infrastruttura ICT applicazioni e servizi business critical.Grazie alla propria vocazione innovativa ed al continuo sviluppo, IKS oggi si pre-senta come un gruppo aziendale in grado di fornire supporto su temi che spazianodalla compliance[g] all’ottimizzazione di processi di filiera, dal WEB 2.0 all’energymanagement.

figura 1.1: Logo di IKS

1

Page 12: Sviluppo test driven di un front-end con AngularJS

2 CAPITOLO 1. INTRODUZIONE

1.1.1 Aree di intervento

Sicurezza La priorità è garantire che le risorse e i servizi di un sistema informa-tivo siano sempre accessibili, fruibili, garantendone però l’integrità e la conformità;proteggere l’azienda da violazioni e attacchi informatici accidentali e fraudolenti.

Ottimizzazione dell’infrastruttura In tempi di virtualizzazione, consolidamentoe risparmio energetico ed in attesa del cloud computing è fondamentale ripensare almodello di infrastruttura con criteri legati alle modalità e tempistiche di provisioningdei sistemi, alla semplificazione dell’infrastruttura, al nuovo paradigma di sicurezza, alcost effective.

Governance La governance è la risposta per l’azienda che oggi è chiamata a con-frontarsi con la sempre maggiore complessità dei data center e delle applicazioni, lanecessità di gestire i fenomeni dirompenti della virtualizzazione e dell’accesso a servizi inthe cloud, l’obbligo stringente e vincolante di mantenere adeguati livelli di performance,nonché di ottimizzare i costi IT.

Ricerca e innovazione Progettare e costruire un’applicazione a valore aggiuntosignifica conoscere le possibilità e potenzialità della tecnologia. Il valore aggiunto èdato dal poter garantire competenze sempre aggiornate, continue attività di ricerca edi prototipizzazione su temi innovativi, capacità consolidate nel disegno di architetturecomplesse e di integrazione, forti partnership tecnologiche con i principali leader dimercato. Tutto ciò sostenuto da una forte, determinata quanto ragionevole propensioneall’innovazione.

1.2 L’idea

Il progetto SkillMatrix nasce come strumento di gestione interna delle competenzedei dipendenti e dei progetti presenti in azienda. L’obiettivo di tale progetto è unamigliore organizzazione del personale dedicato ai vari progetti, con una conseguentemaggiore efficienza ed efficacia nell’assegnazione dei ruoli nei processi ed attività. Finoad ora, all’interno di IKS, tale compito veniva svolto dalla consultazione e modifica diun foglio elettronico Excel. Questa soluzione, oltre ad essere poco pratica e difficilmentemanutenibile, ha portato all’esigenza di uno strumento più specifico ed espandibile.Da qui la creazione del progetto SkillMatrix.Lo strumento SkillMatrix è pensato per essere utilizzato da diverse tipologie di utenti,dal singolo sviluppatore al project manager.L’applicazione sarà composta da un front-end realizzato in AngularJS, un back-endrealizzato tramite Spring[g] e un database di persistenza. L’attività di Stage hariguardato la realizzazione del front-end e la definizione delle API RepresentationalState Transfer (REST)[g] del back-end.L’utente finale sviluppatore può vedere SkillMatrix come una sorta di curriculumdigitale ampliato, in cui poter inserire le proprie competenze riconosciute, le esperienzeacquisite ed i progetti a cui ha preso parte. Nella propria dashboard, l’utente finale puògestire le proprie informazioni e richiedere l’inserimento di nuove entità, come nuoviprogetti a cui ha preso parte, nuove skill acquisite, certificazioni esterne o interne oaltri titoli formativi e le sue esperienze lavorative pregresse.Chi ha compiti di gestione (ad esempio la figura del Responsabile di progetto), utilizza

Page 13: Sviluppo test driven di un front-end con AngularJS

1.3. VINCOLI 3

lo strumento per vedere quali risorse può utilizzare per un dato progetto. In base allecompetenze richieste può quindi consultare quali risorse può richiedere per svolgere ilprogetto con maggior efficienza ed efficacia.Si prefissa quindi come obiettivo la creazione di un portale aziendale unificato per unamigliore gestione del personale ed il suo dislocamento all’interno dei progetti aziendali,oltre che alla gestione dei curricula vitae del personale aziendale.Per quanto riguarda l’organizzazione del progetto, è stato deciso che SkillMatrixavrebbe avuto due layer front-end e back-end comunicanti tramite chiamate REST.Questo per rendere le due componenti più separate possibile, dovendo soltanto definirele API di comunicazione tra il client ed il server. Inoltre, essendo che questo progettodi Stage ha coperto la parte front-end, in un progetto futuro di implementazione delback-end, il server dovrà solamente esporre le corrette funzionalità alla chiamata delleAPI REST concordate.

1.3 VincoliQuesta sezione illustra i vincoli che sono stati stipulati all’inizio dell’attività di Stage,sia tecnici che organizzativi.

1.3.1 TecnologiciI vincoli sullo stack tecnologico da utilizzare nell’implementazione di SkillMatrix sonostati fissati sin dai primi contatti. Per questo, la prima settimana di Stage è statarivolta all’apprendimento di tali strumenti e all’integrazione con gli strumenti e leprocedure aziendali.Tali strumenti sono:

∗ AngularJS, framework JavaScript per la scrittura di applicazioni web front-end;

∗ Bootstrap, libreria Cascading Style Sheet (CSS)[g] grafica per gestire presentazionee formattazione di pagine web HyperText Markup Language (HTML)[g];

∗ Jasmine, framework JavaScript utilizzato per la scrittura di test, soprattutto diunità ed E2E[g].

La scelta di queste tecnologie ovviamente non è casuale. Nello sviluppo di applicazioniweb con AngularJS, lo stack tecnologico utilizzato più diffusamente è proprio questo.L’utilizzo di Jasmine è quasi obbligatorio, data la sua immediatezza di configurazionecon AngularJS e la filosofia stessa del framework front-end, che è stato pensato appuntoper rendere il testing più semplice.Bootstrap, d’altro canto, è estremamente facile da integrare con qualsiasi strumentoche si basi su HTML per fornire le sue viste, e quindi anche con lo stack corrente.

1.3.2 TemporaliPer la realizzazione di questo progetto sono state impiegate 8 settimane di lavoro di 40ore/settimana. Il periodo in cui si è svolto ha compreso le settimane che sono intercorsetra il 20 Aprile e il 13 Giugno, per un totale di ore compreso tra le 300 e 320 stabiliteall’inizio della pianificazione.Di queste ore, le prime 40 sono state dedicate alla mia formazione sulle tecnologieadottate nel progetto e nell’istruzione sull’utilizzo degli strumenti aziendali, per poicontinuare con la progettazione e lo sviluppo vero e proprio del progetto.

Page 14: Sviluppo test driven di un front-end con AngularJS

4 CAPITOLO 1. INTRODUZIONE

1.3.3 OrganizzativiLa realizzazione del progetto prevedeva un ciclo di vita basato sullo stile Agile1.Questo è l’approccio maggiormente utilizzato all’interno dell’azienda, caratterizzatodall’applicazione dei principi dell’Agile programming con consultazione di una kanban.Inoltre, i progetti aziendali di IKS sono gestiti da un sistema di versionamento diAtlassian, compreso il progetto oggetto del mio stage.I vincoli organizzativi si sono quindi concretizzati attraverso la comprensione e l’utilizzodegli strumenti JIRA e STASH utilizzati all’interno dell’azienda, i quali assolvonoappunto i compiti di gestione, rispettivamente, di una Agile kanban e di un repositoryaziendale.

1.4 Organizzazione del testoRiguardo la stesura del testo, relativamente al documento sono state adottate leseguenti convenzioni tipografiche:

∗ gli acronimi, le abbreviazioni e i termini ambigui o di uso non comune menzionativengono definiti nel glossario, situato alla fine del presente documento;

∗ per la prima occorrenza dei termini riportati nel glossario viene utilizzata laseguente nomenclatura: parola [g];

∗ i termini in lingua straniera o facenti parti del gergo tecnico sono evidenziati conlo stile corsivo.

1Manifesto Agile. url: http://agilemanifesto.org/iso/it/.

Page 15: Sviluppo test driven di un front-end con AngularJS

Capitolo 2

Metodologie e tecnologie

Breve introduzione al capitoloQuesto capitolo tratta delle metodologie di sviluppo adottate nello sviluppo del progettoe dello stack tecnologico che ha permesso il suo completamento.

2.1 Metodologie

2.1.1 Agile

Agile è una metodologia di sviluppo nata in contrapposizione ad altri modelli piùstringenti e formali, quali ad esempio il modello a Cascata o a Spirale.I principi generali dell’Agile Programming sono descritti nell’Agile Manifesto1, e possonoessere riassunti in quattro punti cardine:

∗ individui e interazioni: organizzazione e motivazione autonoma sono importanti,come lo sono le interazioni personali come la condivisione dello stesso luogo disviluppo;

∗ software funzionante: un prodotto che funziona è più utile e meglio accettato didocumenti cartacei presentati agli acquirenti durante i meeting;

∗ collaborazione con gli acquirenti: i requisiti non possono essere pienamenteindividuati all’inizio del ciclo di sviluppo del software. Perciò l’interazione con iclienti e gli stakeholder è estremamente importante;

∗ responsività al cambiamento: i metodi agile sono focalizzati sul fornire risposteveloci al cambiamento e allo sviluppo continuo.

Lo sviluppo Agile permette di valutare ed eventualmente correggere la direzione duranteil processo stesso. Questo risultato è ottenuto attraverso brevi e regolari iterazionidi lavoro, alla fine delle quali ogni team deve presentare un incremento del prodotto,considerandolo come una nuova feature applicabile e funzionante. Concentrandosisulla ripetizione di cicli di lavoro brevi e definiti, proporzionati alla funzionalità daconsegnare, le metodologie Agile si definiscono “iterative” o “incrementali”. Nel modelloa cascata, i team di sviluppo hanno una sola opportunità di realizzare un aspetto delprogetto nel modo giusto. Nel paradigma Agile, ogni aspetto dello sviluppo - requisiti,

1Ibid.

5

Page 16: Sviluppo test driven di un front-end con AngularJS

6 CAPITOLO 2. METODOLOGIE E TECNOLOGIE

progettazione, ecc. - è continuamente rivisitato. Quando un team si ferma e rivalutala direzione di un progetto ogni due settimane, è possibile cambiare tale direzione confacilità.Questo approccio “ispeziona-e-adatta” riduce i costi e il tempo di consegna dellosviluppo. Dato che i vari team possono sviluppare software nello stesso tempo incui individuano i requisiti, la “paralisi dell’analisi” ha meno probabilità di bloccare iprogressi di un team. E siccome il ciclo di lavoro di un team è limitato a due settimane,gli stakeholder hanno opportunità ricorrenti di analizzare i rilasci del software e il lorofeedback dal mercato.La metodologia Agile si basa sul concetto di User Story, ovvero un compito significativoche l’utente vuole poter svolgere attraverso il software realizzato. Le User Storiescatturano il ’chi’, ’cosa’ e ’perché’ di un requisito in maniera semplice e concisa.

Kanban

Kanban è un framework usato per implementare la metodologia Agile. Negli anni‘40, Toyota ottimizzò i suoi processi modellandoli come se fossero degli scaffali inun supermercato. I supermercati offrono una quantità di prodotti atti a soddisfarecon il minimo spreco la domanda dei consumatori. Siccome i livelli di inventariosono conseguenti ai pattern di consumazione, il supermercato ottiene una significanteefficienza ed ottimizzazione nella gestione dell’inventario.Quando Toyota portò questa idea ai suoi piani di lavoro, i team (come ad esempio ilteam che aggiunge le portiere al telaio dell’auto) consegnavano una carta, o “kanban”,agli altri dipendenti (ad esempio, ai team che assemblano le portiere) per segnalaredi aver ecceduto la capacità e di essere pronti a ritirare più materiale. Anche sela tecnologia di segnalazione si sia evoluta, questo sistema è ancora al centro dellaproduzione “just in time”.Kanban presenta lo stesso comportamento per i team software. Tramite la comparazionedell’ammontare del lavoro in progresso rispetto alla capacità del team, kanban fornisceagli stessi opzioni di pianificazione più flessibili, output più veloci, miglior concentrazionesui singoli compiti e trasparenza durante il ciclo di sviluppo.Kanban è un metodo di gestione della consapevolezza del lavoro con un’enfasi particolaresulla consegna “just in time”, assicurandosi nel mentre che i membri del team nonabbiano troppo lavoro rispetto alle loro capacità di carico. In questo approccio, ilprocesso, dalla definizione dei task alla consegna al cliente, è mostrato visivamente aipartecipanti. I membri del team estraggono ogni unità di lavoro da una coda.Kanban nel contesto dello sviluppo software può essere inteso come un sistema digestione di processo visuale, che dice cosa produrre, quando e in quale quantità produrlo- ispirato dal sistema di produzione Toyota.Nella sua forma più basilare, un sistema di kanban consiste di una grande lavagnaappesa ad un muro con delle carte o dei postit organizzati in colonne con dei numerisu ogni colonna2.Le carte rappresentano le unità di lavoro mentre attraversano il processo di sviluppo,rappresentato dalle colonne.I limiti sono la differenza sostanziale tra una lavagna Kanban e un’altra storyboardqualsiasi. Limitando l’ammontare di Work-In-Progress ad ogni passo del processo, sipreviene la sovrapproduzione di risorse e si rivelano dinamicamente i colli di bottiglia,così che possano essere presi dei provvedimenti adattativi il prima possibile.Ogni team può quindi avere una determinata quantità di lavoro in esecuzione per unità

2Kanban Agile. url: http://kanbanblog.com/explained/.

Page 17: Sviluppo test driven di un front-end con AngularJS

2.1. METODOLOGIE 7

di tempo. Così facendo si limitano gli sprechi di tempo dovuti al cambio di contestochiesto se si implementa un certo numero di User Stories parallelamente. Ogni membrodel team, ogniqualvolta finisce uno step del processo di realizzazione di una UserStory, sposta la scheda corrispondente nella colonna successiva della kanban, la qualeproseguirà nel suo processo, mentre lo sviluppatore potrà passare all’implementazionedi una nuova User Story.

figura 2.1: Esempio di Kanban

Procedure Le procedure seguite nell’applicazione della metodologia Kanban siappoggiano ai software aziendali rilasciati da Atlassian, ovvero JIRA e STASH.In particolare, l’implementazione di una singola User Story passa attraverso diversipassi definiti.Dal lato organizzativo della stesura e realizzazione delle User Stories e della Kanbanvera e propria, i passi da seguire sono stati i seguenti, applicati al framework JIRA:

1. il Responsabile di progetto scrive la User Story ;

2. il Responsabile decide a chi assegnare l’implementazione della User Story ;

3. lo sviluppatore designato prende in carico il ticket aperto, contrassegnandolocome "In Progress";

4. lo sviluppatore realizza la funzionalità descritta nella User Story della comanda;

5. lo sviluppatore notifica l’avvenuta implementazione della funzionalità contrasse-gnando il ticket come "Done";

6. il Responsabile viene notificato dell’avvenuta realizzazione e provvede all’inseri-mento della nuova funzionalità nel progetto.

A questa procedura si associa anche la gestione vera e propria dei sorgenti aziendali,memorizzati in repository acceduti tramite il framework STASH. L’implementazionedi ogni feature prevede il passaggio per vari punti, necessari alla stabilità e all’organiz-zazione del sistema.La procedura da seguire quando si utilizza il framework STASH è la seguente:

1. prendere in carico una User Story dal backlog ;

Page 18: Sviluppo test driven di un front-end con AngularJS

8 CAPITOLO 2. METODOLOGIE E TECNOLOGIE

2. creare un nuovo branch dall’attuale branch develop del repository ;

3. implementare la funzionalità presa in carico, ricordandosi di effettuare commitperiodici con messaggi esplicativi del lavoro effettuato;

4. al termine dell’implementazione, assicurarsi che i test disegnati per le unitàimplementate passino, così da non introdurre errori di unità nel sistema;

5. una volta appurato che i test sono positivi, proseguire con la richiesta di pull nelbranch develop da notificare al Responsabile del progetto.

A questo punto si può verificare un imprevisto, ovvero che nel tempo in cui vieneimplementata una User Story, il branch develop subisca delle modifiche. Questo fattocomporta una pull del develop nel branch attuale ed una conseguente risoluzione deconflitti che potrebbero venirsi a creare. Dopodiché si prosegue con la procedura:

6. esaminare la risposta del Responsabile; in caso di approvazione, la proceduratermina;

7. in caso di mancata approvazione della pull request, esaminare i punti in cuivengono alzate obiezioni da parte del Responsabile apportare le dovute modificheal codice;

8. ritornare al punto 4 e iterare fino ad avvenuta approvazione della pull request.

2.1.2 Test Driven DevelopementIl modello di sviluppo Test Driven (letteralmente tradotto in "guidato dai test")prevede che lo sviluppo di ogni unità software avvenga soltanto dopo aver scritto ilcorrispondente test sulla base delle specifiche dell’unità stessa.Il dovere di ogni programmatore che segue questo modello è quello di scrivere ilminimo quantitativo di codice necessario a far validare un test precedentemente scritto,minimizzando gli sprechi e provando la correttezza del prodotto, delegando il refactoringstilistico ad un momento successivo, in cui si ha già un codice testato e funzionante.Il motto dello sviluppo Test Driven è appunto “Red, Green, Refactor”; la procedura daseguire prevista da questa metodologia è la seguente:

1. scrivere un “singolo” test di unità che descrive una funzionalità del programma;

2. eseguire il test, il quale dovrebbe fallire, dato che il programma non presentaancora la feature descritta (da qui, la fase Rossa);

3. scrivere la quantità minima di codice necessaria far passare il test (fase Verde);

4. eseguire il refactoring del codice, in modo da eliminare eventuali ridondanze esuperficialità;

5. ripetere, accumulando test di unità con il passare dello sviluppo.

È stato scelto di utilizzare questo approccio in quanto presenta dei vantaggi significativi.Questi test permettono di individuare con precisione le specifiche del codice, e quindi ilsuo comportamento in base alle situazioni a cui sarà sottoposto. Ciò facilita la scritturadi un codice funzionante, più pulito, più affidabile e manutenibile.La stesura di un test aiuta molto nella comprensione delle funzionalità di un modulo,evitando così errori concettuali che si potrebbero avere a priori nell’implementazione. La

Page 19: Sviluppo test driven di un front-end con AngularJS

2.2. TECNOLOGIE UTILIZZATE 9

scrittura di un singolo test implica la piena comprensione dei metodi e delle funzionalitàesposte, quindi permette di stabilire già prima della stesura di un modulo gli outputattesi.Il framework AngularJS è stato creato appositamente per rendere il testing più efficientee semplice possibile, grazie a molte funzionalità focalizzate al testing già compreseall’interno del framework. Questa scelta è stata compiuta perché JavaScript ha unagrandissima potenza espressiva, ma quasi nessun controllo da parte del compilatore, ilche rende necessaria la costante presenza dei test nello sviluppo con questo linguaggio.

Test di Unità

La tipologia di test utilizzata maggiormente con questo approccio è l’insieme dei testdi unità. Questa tipologia di test si prefissa di verificare il corretto funzionamento diuna singola unità software. Per unità si intende normalmente il minimo componentedi un programma dotato di funzionamento autonomo; a seconda del paradigma diprogrammazione o linguaggio di programmazione, questo può corrispondere per esempioa una singola funzione nella programmazione procedurale, o una singola classe o unsingolo metodo nella programmazione a oggetti.Applicando questo concetto al progetto in analisi, i test di unità scritti verificanola correttezza di ogni funzione scritta nei vari componenti del pattern Model ViewController (MVC)[g] di AngularJS.

Test di scenario

I test di scenario, conosciuti anche come E2E, sono una metodologia di test utilizzataper verificare il corretto flusso di un’applicazione, se questa si comporta come pianificatodall’inizio alla fine del flusso. L’obiettivo che sta alla base della creazione di test discenario è di identificare le dipendenze di sistema e di assicurarsi che le informazioni (eil loro formato) siano passate correttamente tra le varie componenti del sistema.

2.2 Tecnologie utilizzate

2.2.1 Tecnologie di sviluppo

AngularJS

figura 2.2: Logo di AngularJS

AngularJS è un framework open source JavaScript mantenuto da Google, utilizzatoprevalentemente nello sviluppo di Single Page Application (SPA)[g]. Attraverso questo

Page 20: Sviluppo test driven di un front-end con AngularJS

10 CAPITOLO 2. METODOLOGIE E TECNOLOGIE

framework è possibile aumentare le capacità del classico linguaggio HTML (o simili,quali Jade), per poter realizzare applicazioni web responsive e solide. L’obiettivo diquesto framework, infatti, è quello di semplificare lo sviluppo ed il testing di applicazioniscritte in JavaScript, fornendo una base di librerie e direttive utili ad implementare unapplicazione di architettura MVC.Come altri framework utilizzati con lo stesso fine, una delle feature più utili edinteressanti di AngularJS è il cosiddetto “two-way data binding”. Tramite l’utilizzo didirettive proprie del framework, uno sviluppatore può “legare” una variabile della vistaad una particolare entità di un modello, facendo sì che i dati visualizzati rappresentinocostantemente il dato aggiornato; dualmente, tramite AngularJS, se si utilizza questolegame è possibile aggiornare i dati del modello direttamente dalla vista.AngularJS inoltre fornisce degli strumenti per astrarre e realizzare la comunicazionecon un back-end. Tramite AngularJS, infatti, è possibile creare un’applicazione webtotalmente REST-ful, tramite l’utilizzo delle $resource e dei servizi $http messi adisposizione dal framework.

Bootstrap

figura 2.3: Logo di Bootstrap

Bootstrap è una raccolta di strumenti liberi per la creazione di siti e applicazioni web.Essa contiene modelli di progettazione basati su HTML e CSS, sia per la tipografia,che per le varie componenti dell’interfaccia, come moduli, bottoni e navigazione, ealtri componenti dell’interfaccia, così come alcune estensioni opzionali di JavaScript.Includendo Bootstrap nella propria pagina web (sia da Content Delivery Network(CDN)[g] che da codice sorgente), è possibile usufruire di tutta una serie di agevolazioninello sviluppo di una pagina, dalla stilistica di base della pagina stessa, agli effetti distransizione CSS avanzati, al layout stesso. Bootstrap include una libreria CSS di basecon una grande varietà di classi da applicare agli elementi di HTML statico, più unfile JavaScript con le funzioni jQuery basilari di comportamento, entrambi facilmenteestendibili dallo sviluppatore con file personalizzati. è una raccolta di strumenti liberiper la creazione di siti e applicazioni web. Essa contiene modelli di progettazione basatisu HTML e CSS, sia per la tipografia, che per le varie componenti dell’interfaccia, comemoduli, bottoni e navigazione, e altri componenti dell’interfaccia, così come alcuneestensioni opzionali di JavaScript.

Page 21: Sviluppo test driven di un front-end con AngularJS

2.2. TECNOLOGIE UTILIZZATE 11

figura 2.4: Logo di Git

2.2.2 Strumenti di supporto ai processiGit

Git è un sistema software di controllo di versione distribuito. Le funzionalità principalidi Git sono le seguenti:

∗ distribuzione: Git dà ad ogni sviluppatore una copia locale dell’intera cronologiadi sviluppo, e le modifiche vengono copiate da un tale repository a un altro. Questemodifiche vengono importate come diramazioni aggiuntive di sviluppo, e possonoessere fuse allo stesso modo di una diramazione sviluppata localmente;

∗ grande community: considerata l’estesa community di sviluppatori che usaGit è possibile trovare diversi strumenti e plugin che spesso semplificano il lavoro,risparmiando così tempo e risorse;

∗ sviluppo non lineare: Git, attraverso il suo sistema di branching e mergingconsente lo sviluppo di codice parallelamente, su più linee che possono dividersio unirsi.

JIRA

figura 2.5: Logo di JIRA

Jira è un prodotto proprietario finalizzato al tracciamento dei compiti, sviluppatoda Atlassian dal 20023. Esso fornisce il tracciamento di bug, compiti e funzionalitàdi project management. JIRA non è un acronimo, bensì il troncamento della parolagiapponese Gojira.JIRA è scritto in Java e si basa sul sistema di inversione di controllo sviluppato daPico, su Apache OFBiz e lo stack tecnologico di WebWork 1. JIRA supporta diversechiamate procedurali remote, quali ad esempio REST e Simple Object Access Protocol(SOAP)[g]. JIRA si integra con i programmi di versionamento Clearcase, CVS, Git,

3About Atlassian – customers, life, community, FedEx days. Atlassian, 2012.

Page 22: Sviluppo test driven di un front-end con AngularJS

12 CAPITOLO 2. METODOLOGIE E TECNOLOGIE

Mercurial, Perforce, Subversion e Team Foundation Server.Secondo i dati di Atlassian, JIRA viene usato nel tracciamento delle attività e nel projectmanagement da oltre 25,000 utenti in 122 paesi nel mondo. Alcune delle organizzazioniche usano JIRA sono Fedora Commons, Hibernate, Honeywell Aerospace, JBoss, LindenLab, Skype, Spring Framework e The Apache Software Fundation.

figura 2.6: Esempio di schermata di una kanban di JIRA

Stash

figura 2.7: Logo di Stash

STASH è un software aziendale di controllo di versionamento distribuito basato suGit.Esso offre un sistema di gestione dei repository a progetto, il che predispone un naturaleaccompagnamento con il sistema di project management JIRA.

Branching L’implementazione di una nuova funzionalità, secondo le strategie azien-dali, viene effettuata su un nuovo branch. Questa scelta permette lo sviluppo indipen-dente di più feature, partendo da un punto comune (solitamente il branch "develop"del repository) e diversificando in base ai task assegnati agli sviluppatori del team.

Pull request Ogniqualvolta una nuova funzionalità viene implementata, con ilcorrispondente completamento del ticket dell’attività di JIRA, viene creata una “pullrequest” per integrare il nuovo contenuto. Questa pull request viene effettuata in unbranch più generale, solitamente nel “develop” se il prodotto è ancora in via di sviluppo,oppure direttamente nel “master” se si sta per rilasciare una nuova release del prodotto.Ogni pull request non viene integrata finché non viene approvata dal Responsabile,il quale visiona i cambiamenti introdotti nella nuova funzionalità; egli può in ogni

Page 23: Sviluppo test driven di un front-end con AngularJS

2.2. TECNOLOGIE UTILIZZATE 13

figura 2.8: Branching e merging in STASH

caso segnalare eventuali cambiamenti indesiderati allo sviluppatore e richiedere unamodifica del codice.

2.2.3 Ambiente di sviluppo

PhPStorm

figura 2.9: Logo di PhPStorm

PhpStorm è un Integrated Development Environment (IDE)[g] commerciale svilup-pato e distribuito da JetBrains e si basa su IntelliJ IDEA. PhpStorm fornisce un editorper PHP, HTML e JavaScript, aiutando lo sviluppatore con correzioni e segnalazioniin real time e molte feature di refactoring del codice.PhpStorm è basato su IntelliJ IDEA, che è scritto in Java. Oltre alle funzioni coredell’IDE, l’utente può estendere le funzionalità installando i numerosi plugin disponibilio scrivendone alcuni propri.Oltre ad offrire un editor responsivo ed efficiente, PhpStorm si presta molto beneper lo sviluppo di applicazioni in JavaScript, supportando i maggiori framework dellinguaggio, come soprattutto AngularJS e NodeJS. Inoltre è possibile configurare l’IDEper l’esecuzione automatica di test scritti con Jasmine, mostrando direttamente i

Page 24: Sviluppo test driven di un front-end con AngularJS

14 CAPITOLO 2. METODOLOGIE E TECNOLOGIE

risultati di tali esecuzioni all’interno dell’IDE stesso, senza bisogno di un cambio dicontesto e strumenti, oltre alla classica funzionalità di debugging.

2.2.4 Tecnologie di Testing

Jasmine

figura 2.10: Logo di Jasmine

Jasmine è un framework di testing open source per il linguaggio JavaScript. Jasmine,all’interno di un progetto in AngularJS o più in generale, può essere utilizzato sia per itest di unità dei componenti, sia per i test E2E.Jasmine si basa sulla sua facilità di comprensione dei test. Infatti, ogni test di Jasmineè diviso in blocchi di più suite. Ogni blocco riguarda una particolare componente delcodice, ed ogni funzionalità testata viene correlata da una specifica descrizione delcomportamento atteso.Idealmente ogni statement di controllo di Jasmine dovrebbe testare non più di unafunzione del codice, così da rendere i controlli maggiormente atomici. Per aiutare losviluppatore nella scrittura dei test, Jasmine presenta al suo interno una grande quantitàdi costrutti di confronto, che spaziano sui diversi tipi di dato che si possono incontrare,lasciando comunque allo sviluppatore il modo di creare confronti personalizzati.Usato insieme ad AngularJS, Jasmine arricchisce ulteriormente le sue potenzialità,in quanto AngularJS comprende un modulo apposito scritto per il testing, ovveroangular-mocks. In questo modulo, da includere in Jasmine, troviamo i costruttori diogni componente di Angular, con cui iniettare le varie componenti mockate quando neabbiamo l’esigenza, come ad esempio nel test di un controller che dipende da uno opiù servizi, più altre componenti utili allo sviluppatore.Per quanto riguarda i test E2E, Jasmine contiene al suo interno vari strumenti disimulazione di input utente, quali ad esempio il click su un elemento o l’inserimentodi testo in una casella. Attraverso l’uso di questi strumenti, è possibile simulare variscenari di interazione con le varie funzionalità del sistema, andando quindi a testareil corretto funzionamento delle varie unità. Questo si ottiene sfruttando di browserdriver come Selenium, i quali automatizzano l’interazione con i vari browser.

2.2.5 Strumenti di Automazione

Grunt

Grunt è un gestore ed un esecutore di attività JavaScript. Utilizzato soprattutto perl’automazione di attività come minificazione, compilazione, test di unità, di scenario,ecc., aiuta lo sviluppatore soprattutto nella creazione di applicazioni client side, au-mentando l’efficienza nello sviluppo.A seconda delle esigenze e delle possibilità hardware, infatti, Grunt può essere con-figurato in modo che vengano eseguiti certi script ad ogni modifica di un file, o solodi alcuni. Si può quindi ricaricare un webserver alla modifica di un file HTML oeseguire un certo test di unità alla modifica di un file JavaScript, il tutto assolutamente

Page 25: Sviluppo test driven di un front-end con AngularJS

2.2. TECNOLOGIE UTILIZZATE 15

figura 2.11: Logo di Grunt

automatizzato.Inoltre Grunt e la sua community sono in continuo sviluppo; ci sono molti sviluppatoriche scrivono attorno a questa tecnologia, creando plugin da utilizzare per automatizzareanche il sistema di configurazione di Grunt, per adattarsi ai vari framework utilizzatidurante lo sviluppo.

Karma

figura 2.12: Logo di Karma

Karma, precedentemente conosciuto come Testacular, è un ambiente creato per illancio e la gestione dei test in ambiente JavaScript.Karma supporta diversi framework di testing, inoltre è compatibile con i maggioribrowser per assicurare che l’ambiente utilizzato per il testing sia funzionante in tutti icasi.L’unico compito che ha lo sviluppatore, per poter utilizzare Karma, è (oltre all’instal-lazione del client e dei plugin necessari) creare e personalizzare il file di configurazionedi Karma, la cui struttura viene creata in automatico con un comando del client daterminale.All’interno del file di configurazione, lo sviluppatore può configurare tutti gli aspettidell’esecuzione dei test, dai browser utilizzati alla selezione di quali test eseguire, inuna esecuzione singola o ad aggiornamento dei file. Oltre ad eseguire i test che vengonospecificati nei path del file di configurazione, Karma offre anche altre funzionalità inte-ressanti che si appoggiano sui test scritti. Una di queste funzionalità è la generazioneautomatica di un file di html statico in cui vengono mostrate le singole metriche dicoverage di ogni file e in media per il progetto. Le metriche di copertura generateautomaticamente con il plugin coverage di Karma sono:

∗ line coverage;

∗ statement coverage;

∗ branch coverage;

Page 26: Sviluppo test driven di un front-end con AngularJS

16 CAPITOLO 2. METODOLOGIE E TECNOLOGIE

∗ function coverage.

Nella “vista” che viene creata dal plugin, è possibile visualizzare quali linee non sonoeventualmente coperte dai test, quali branch e quali funzioni, su cui quindi andare adintervenire o meno per aumentare la copertura, o per verificare che ogni funzionalitàsia effettivamente implementata e testata.

NPM

figura 2.13: Logo di NPM

Acronimo di Node Package Manager. Come da definizione, Node Package Manager(NPM)[g] è un gestore di pacchetti e moduli JavaScript, basato su Node.js.Tramite NPM è possibile cercare ed installare localmente ad un progetto o globalmenteuna grande serie di utilità pubblicate nel registro stesso di NPM. Oltre a questo, èpossibile gestire ed aggiornare facilmente ogni pacchetto installato tramite semplicicomandi da terminale.La gestione dei pacchetti di npm consente di suddividere i moduli in funzionalità, pergarantire così il riutilizzo atomico e una maggiore manutenibilità dei singoli file, cosìcome la condivisione con altri sviluppatori attraverso il registro NPM.

Protractor

figura 2.14: Logo di Protractor

Protractor è un framework utilizzato per eseguire test e2e, pensato soprattutto perla compatibilità con AngularJS. Protractor è un framework scritto in NodeJS, mentrela sua base e l’interazione con i vari browser è mediata da WebDriverJS.Questo framework permette di eseguire i comandi pensati e scritti nei test E2E. Ovvero,permette di simulare il comportamento di un utente con una certa applicazione web,verificando che gli output attesi di una certa applicazione ad un certo comportamentoutente, siano quelli previsti. Tramite l’utilizzo di Selenium WebDriverJS, questoprocedimento di testing viene completamente automatizzato; si riescono a replicare letipiche azioni di un utente e Protractor analizza ogni risposta dell’applicazione e laconfronta con le attese.Alla fine di ogni test suite, ci vengono presentati i risultati dell’esecuzione dei test e, seci sono, quali statement hanno provocato un errore.

Page 27: Sviluppo test driven di un front-end con AngularJS

Capitolo 3

Descrizione dello stage

Breve introduzione al capitoloQuesto capitolo tratterà l’organizzazione temporale del progetto, ovvero la sua divisionein attività e l’estensione temporale di ognuna. Il progetto è stato diviso in quattro fasidistinte, con diverse attività.

3.1 Analisi preventiva dei rischiDurante la fase di analisi iniziale sono stati individuati alcuni possibili rischi a cui sipotrà andare incontro. Si è quindi proceduto a elaborare delle possibili soluzioni perfar fronte a tali rischi.

1. Conflitti nell’implementazione parallela di User StoriesDescrizione: durante lo svolgimento di un progetto, ogni implementazione di unaUser Story deve trovarsi su un branch separato, derivato dal branch develop. Può quindiaccadere che, in determinati casi, l’esecuzione di ogni ticket e il suo assorbimento nelsistema non siano sequenziali, in quanto il Responsabile di progetto può non esseresempre presente. Quindi, nel caso in cui si realizzino più feature senza avere una pullrequest alla fine di ognuna, il codice che poi dovrà essere inserito nel sistema darà quasicertamente conflitto nella fase di merge.Soluzione: sollecitare il Responsabile di progetto all’analisi dei cambiamenti apportatiad ogni feature, notificandolo periodicamente sullo stato di esecuzione del ticket, inmodo che il Responsabile sia pronto all’esaminazione della User Story implementatain modo più repentino.

2. Mancata competenza in strumenti e tecnologie aziendaliDescrizione: al momento del mio inserimento in azienda, la mia competenza sull’ap-plicazione di metodologie Agile è stata pressoché nulla, così anche per quanto riguardagli strumenti aziendali utilizzati in IKS e per determinate tecnologie da applicaredurante il progetto. Questo fattore potrebbe portare ovviamente ad un rallentamentonel processo produttivo e, soprattutto, l’introduzione di errori.Soluzione: la prima attività che verrà svolta appena dopo l’inizio dello stage saràappunto la formazione su tali tematiche. In particolare, come da Piano di Progetto,sono state stimate 40 ore di formazione per colmare le lacune da me possedute.

3. Reperibilità del Responsabile di ProgettoDescrizione: data la varietà di progetti che il Responsabile di Progetto a me assegnato

17

Page 28: Sviluppo test driven di un front-end con AngularJS

18 CAPITOLO 3. DESCRIZIONE DELLO STAGE

deve seguire, può presentarsi la possibilità che questi non sia sempre reperibile insede per un confronto diretto. Il rischio si applica anche a quelle giornate in cui ilResponsabile è impegnato ad altri progetti aziendali per l’intera durata della giornatalavorativa..Soluzione: la gestione delle attività tramite Kanban serve proprio a mitigare questotipo di rischi, in quanto uno sviluppatore può implementare più User Stories senzadover consultare direttamente il Responsabile. Questo ovviamente se il Responsabileha stilato un numero adeguato di User Stories da implementare. Inoltre, l’utilizzodegli strumenti JIRA e STASH consente a due o più collaboratori di discutere ilcodice prodotto direttamente dall’interfaccia web, quindi anche in maniera telematica,ignorando il confronto diretto in sede.

4. Cambiamento dei requisiti in corso d’operaDescrizione: data anche la natura mutevole di un ciclo di sviluppo software come lametodologia Agile, è possibile che alcuni requisiti varino in corso d’opera, causandocosì una riorganizzazione di tempo e risorse non prevista.Soluzione: la presenza di uno strumento aziendale che fornisce lo stesso servizioconsente una precisa individuazione dei requisiti ad inizio opera. Nel caso in cuivengano individuati requisiti aggiuntivi, il loro impatto sarà minimo e controllabile,aggiungendo le User Stories corrispondenti nel backlog.

3.2 Requisiti e obiettiviL’analisi dei Requisiti è stata svolta grazie alla suddivisione i storie intrinseca nellametodologia Agile. Infatti, la stesura di una singola storia porta molte volte all’indivi-duazione di uno o più requisiti, per la maggior parte funzionali.La scelta delle storie da implementare è avvenuta tramite specificazione dei vari epicnoti all’inizio della pianificazione, successivamente spezzati in major ed infine in UserStories implementabili separatamente.

3.3 Pianificazione

figura 3.1: Diagramma Gantt della pianificazione iniziale

3.3.1 Fase 1: Formazione (40 ore)Scopo: formazione sulle problematiche e tecnologie che si incontreranno durante lostage. In dettaglio:

∗ AngularJS, REST Angular, Jasmine, Istanbul;

∗ ambiente di sviluppo IKS (IDE per Javascript PhpStorm, Git);

∗ linee guida per lo sviluppo e concetti di programmazione sicura;

∗ verifica competenze acquisite.

Page 29: Sviluppo test driven di un front-end con AngularJS

3.3. PIANIFICAZIONE 19

Output (oggetto di verifica per il passaggio alla fase successiva):

∗ predisposizione ambiente di sviluppo;

∗ realizzazione di una web application di esempio che utilizzi le tecnologie e gliapprocci indicati.

3.3.2 Fase 2: Analisi e Progettazione (40 ore)

Scopo: analisi delle specifiche funzionali, definizione del piano di test e progettazionetecnica della soluzione da realizzare.In dettaglio:

∗ analisi specifiche funzionali;

∗ progettazione di dettaglio;

∗ documentazione.

Output (oggetto di verifica per il passaggio alla fase successiva):

∗ documento di Specifica Tecnica;

∗ User Stories.

3.3.3 Fase 3: Implementazione (180 ore)

Scopo: preparazione dell’ambiente di sviluppo e implementazione della soluzione.In dettaglio:

∗ implementazione tecnologica dei requisiti definiti in fase di analisi;

∗ documentazione.

Milestone settimanali:

1. realizzazione delle funzionalità di dialogo REST con il back-end;

2. creazione dell’interfaccia del profilo utente singolo;

3. visione della gerarchia aziendale e dell’organizzazione per progetti dell’organico;

4. gestione operazioni Create Read Update Delete (CRUD)[g] sui vari progettiaziendali e sui membri partecipanti.

Output (oggetto di verifica per il passaggio alla fase successiva):

∗ prodotto finale completo in tutte le sue parti;

∗ sorgenti commentati e pubblicati nel repository dei sorgenti aziendale.

Page 30: Sviluppo test driven di un front-end con AngularJS

20 CAPITOLO 3. DESCRIZIONE DELLO STAGE

3.3.4 Fase 4: Test e Verifica (40 ore)Scopo: Verifica funzionale, dei requisiti e stesura della documentazione.In dettaglio:

∗ analisi dei risultati;

∗ verifica funzionale;

∗ verifica dei requisiti di progetto;

∗ revisione e correzione di eventuali bug;

∗ documentazione;

∗ verifica finale.

Output (oggetto di verifica per la conclusione del progetto):

∗ documento finale (conclusioni sull’attività di Stage svolta, con obiettivi raggiuntie conoscenze acquisite);

∗ eliminazione di bug riscontrati e pubblicazione delle modifiche nel repository deisorgenti aziendale.

Page 31: Sviluppo test driven di un front-end con AngularJS

Capitolo 4

Analisi dei requisiti

Breve introduzione al capitoloIl presente capitolo illustra i casi d’uso più importanti e i requisiti delineati durantel’attività di Analisi dei requisiti.

4.1 Casi d’usoPer lo studio dei casi di utilizzo del prodotto sono stati creati dei diagrammi. Idiagrammi dei casi d’uso (in inglese Use Case Diagram) sono diagrammi di tipo UnifiedModeling Language (UML)[g] dedicati alla descrizione delle funzioni o servizi offertida un sistema, così come sono percepiti e utilizzati dagli attori che interagiscono colsistema stesso.

figura 4.1: Use Case - Login

UC1: Autenticazione

21

Page 32: Sviluppo test driven di un front-end con AngularJS

22 CAPITOLO 4. ANALISI DEI REQUISITI

Attori Principali: Utente non autenticato.

Precondizioni: l’utente non ha effettuato il login in SkillMatrix e deve possederecredenziali valide.

Descrizione: l’utente fornisce dei dati validi di accesso nella pagina di login e vienereindirizzato alla pagina di gestione del profilo.

Postcondizioni: le credenziali di accesso sono state verificate e l’utente è statoreindirizzato alla dashboard.

UC2: Visualizzazione feedback erroreAttori Principali: Utente non autenticato.

Precondizioni: l’utente non ha effettuato il login a SkillMatrix.

Descrizione: l’utente visualizza un messaggio d’errore nel caso in cui avvenga unadelle seguenti situazioni:

∗ le credenziali sono errate;

∗ la comunicazione con il server è fallita.

.

Postcondizioni: viene visualizzato un messaggio d’errore e il contatore che esprimela quantità di volte che l’errore si è manifestato, per poi far ritornare l’utente allaschermata di login.

figura 4.2: Use Case - Dashboard

UC3: Visualizza informazioni profilo

Page 33: Sviluppo test driven di un front-end con AngularJS

4.1. CASI D’USO 23

Attori Principali: Utente autenticato.

Precondizioni: l’utente deve aver eseguito con successo il login al sistema.

Descrizione: l’utente seleziona il menù di visualizzazione delle informazioni del proprioprofilo.

Postcondizioni: l’utente viene reindirizzato alla pagina di presentazione delle proprieinformazioni.

UC4: Visualizza esperienze registrateAttori Principali: Utente autenticato.

Precondizioni: l’utente deve aver eseguito con successo il login al sistema.

Descrizione: l’utente seleziona il menù di visualizzazione delle esperienze registratenel sistema.

Postcondizioni: l’utente viene reindirizzato alla pagina di presentazione delle proprieesperienze professionali registrate.

UC5: Visualizza skill registrateAttori Principali: Utente autenticato.

Precondizioni: l’utente deve aver eseguito con successo il login al sistema.

Descrizione: l’utente seleziona il menù di visualizzazione delle skill registrate nelsistema.

Postcondizioni: l’utente viene reindirizzato alla pagina di presentazione delle proprieskill registrate.

UC6: Visualizza qualificazioni registrateAttori Principali: Utente autenticato.

Precondizioni: l’utente deve aver eseguito con successo il login al sistema.

Descrizione: l’utente seleziona il menù di visualizzazione delle qualificazioni registratenel sistema.

Postcondizioni: l’utente viene reindirizzato alla pagina di presentazione delle propriequalificazioni registrate.

UC7: Visualizza lista dei progetti aziendaliAttori Principali: Utente autenticato.

Precondizioni: l’utente deve aver eseguito con successo il login al sistema.

Descrizione: l’utente seleziona il menù di visualizzazione dei progetti aziendali.

Postcondizioni: l’utente viene reindirizzato alla pagina di visualizzazione della listadi progetti aziendali.

UC8: Visualizza pagina 404Attori Principali: Utente autenticato.

Page 34: Sviluppo test driven di un front-end con AngularJS

24 CAPITOLO 4. ANALISI DEI REQUISITI

Precondizioni: l’utente deve aver effettuato il login presso SkillMatrix ed avere unasessione attiva.

Descrizione: se l’utente, all’interno del dominio, effettua la ricerca di una risorsa nonpresente, il sistema informa l’utente di questa mancanza e fornisce istruzioni per lasegnalazione.

Postcondizioni: l’utente visualizza la pagina di segnalazione di risorsa non presentee decide se segnalare la mancanza o tornare alla dashboard.

UC9: LogoutAttori Principali: Utente autenticato.

Precondizioni: l’utente deve aver effettuato il login presso SkillMatrix ed avere unasessione attiva.

Descrizione: l’utente seleziona il pulsante di logout presente nella dashboard.

Postcondizioni: l’utente viene reindirizzato alla pagina di login e la sua sessionaviene cancellata.

4.2 Tracciamento dei requisitiDa un’attenta analisi dei requisiti e degli use case effettuata sul progetto è stata stilatala tabella che traccia i requisiti in rapporto agli use case.Sono stati individuati diversi tipi di requisiti e si è quindi fatto utilizzo di un codiceidentificativo per distinguerli.Il codice dei requisiti è così strutturato R(F/Q/V)(N/D/O) dove:

R = requisito

F = funzionale

Q = qualitativo

V = di vincolo

N = obbligatorio (necessario)

D = desiderabile

O = opzionale

Nelle tabelle 4.1, 4.2 e 4.3 sono riassunti i requisiti e il loro tracciamento con gli usecase delineati in fase di analisi.

Page 35: Sviluppo test driven di un front-end con AngularJS

4.2. TRACCIAMENTO DEI REQUISITI 25

tabella 4.1: Tabella del tracciamento dei requisti funzionali

Requisito Descrizione Use CaseRFN-1 L’applicazione deve reagire ad un’errata autenticazione

tramite reindirizzamento all’interfaccia di loginUC2

RFN-2 L’applicazione deve reagire alla scadenza di una sessionetramite reindirizzamento all’interfaccia di login

UC2

RFN-3 L’applicazione non deve permettere l’accesso anonimo alsistema, tranne che per l’interfaccia di login

UC1

RFN-4 All’avvio, l’applicazione deve controllare se esiste unasessione attiva

-

RFN-5 In caso di sessione attiva, l’utente deve esserereindirizzato alla dashboard se la sessione è valida

-

RFN-6 In caso di sessione non attiva o non valida, l’utente deveessere riportato alla schermata di login

UC2

RFN-7 L’applicazione deve poter consentire ad un utenteregistrato di effettuare l’autenticazione

UC1

RFN-8 L’utente autenticato deve poter visionare i propri datidopo il login nel sistema

UC3

RFN-9 L’utente autenticato deve poter effettuare il logout dalsistema

UC9

RFN-10 L’utente deve poter visualizzare i propri titoli di studioe/o abilitazioni professionali una volta effettuato il login

UC6

RFN-11 L’utente deve poter inserire un nuovo titolo di studio oun’abilitazione professionale nel sistema

-

RFN-12 L’utente deve poter visualizzare le proprie skill una voltaeffettuato il login

UC5

RFN-12.1 L’utente deve poter filtrare le skill visualizzate per livellodi competenza

-

RFN-12.2 L’utente deve poter inserire una nuova skill nel sistema -RFN-13 L’utente deve poter visualizzare i progetti ad esso

associati una volta effettuato il loginUC7

RFN-13.1 L’utente deve poter visualizzare quale progetto necessitadi registrazione nel sistema

-

RFN-14 L’utente deve poter visualizzare le informazionidettagliate di un singolo progetto

-

RFN-15 L’utente deve poter visualizzare le proprie esperienzeprofessionali una volta effettuato il login al sistema

UC4

RFN-16 L’utente deve poter inserire una nuova esperienzaprofessionale nel sistema

-

RFD-1 Il sistema deve implementare una struttura gerarchica -RFD-1.1 L’interfaccia mostrata in base al tipo di ogni utente deve

essere adattata al tipo dello stesso-

RFD-1.1.1 L’amministratore di un progetto deve poter vedere lepersone assegnate a quel progetto

-

RFD-2 L’utente deve ricevere un feedback nell’interfaccia ognivolta che avvenga un errore di comunicazione col server

-

RFO-1 Per tutti i dati presentati tramite lista va implementatol’infinite scroll

-

RFO-2 L’utente deve poter visualizzare la quantità di proget-ti che richiedono registrazione tramite notifica nelladashboard

-

Page 36: Sviluppo test driven di un front-end con AngularJS

26 CAPITOLO 4. ANALISI DEI REQUISITI

tabella 4.2: Tabella del tracciamento dei requisiti qualitativi

Requisito Descrizione Use CaseRQD-1 Il codice deve seguire le linee stilistiche aziendali -RQD-2 Deve venire prodotta la documentazione tecnica di

dettaglio-

RQD-3 La grafica dell’interfaccia deve essere conforme aglistandard aziendali

-

RQD-4 L’utente deve visualizzare una pagina di supporto senaviga verso una pagina non presente

UC8

tabella 4.3: Tabella del tracciamento dei requisiti di vincolo

Requisito Descrizione Use CaseRVN-1 Il framework di sviluppo per l’applicazione front-

end dev’essere AngularJSPiano di Progetto

RVN-2 La libreria CSS da utilizzare dev’essere Bootstrap Piano di ProgettoRVN-3 Il framework di testing da utilizzare deve essere

JasminePiano di Progetto

RVN-4 L’approccio di sviluppo deve essere Test Driven Piano di ProgettoRVN-5 Devono essere realizzate una o più componenti

che simulino il back-end in assenza di un serverfunzionante

-

RVN-6 Le API definite devono rispettare il paradigmaREST/HATEOAS[g]

Piano di Progetto

RVN-6.1 L’interfaccia deve poter manipolare correttamen-te gli header HTTP[g]

-

RVN-7 L’assegnamento dei ticket deve essere eseguitotramite il sistema kanban (JIRA)

-

RVN-8 Il repository da utilizzare deve essere laconfigurazione aziendale di Atlassian STASH

-

RVN-9 Lo schema dei dati associati ad un utente deveessere preso da schema.org

-

RVO-1 I dati tabellari devono essere richiesti al server inmaniera paginata

-

Page 37: Sviluppo test driven di un front-end con AngularJS

Capitolo 5

Progettazione e codifica

Breve introduzione al capitoloIl capitolo descrive le scelte architetturali adottate dal framework utilizzato e il loroutilizzo all’interno del progetto. Inoltre viene presentata la lista delle API definite peril back-end.

5.1 Progettazione Architetturale

5.1.1 Front-end RESTLa struttura base dell’applicativo SkillMatrix è un front-end REST. Un front-end diquest tipo ha diversi vantaggi, come la modularità e portabilità che si può ottenere daclient a server.Con un tipo di architettura come questo, infatti, il client ed il server rimangono forte-mente separati, limitando le chiamate a dei singoli punti di accesso del server. Questamodularità consente una maggiore manutenibilità di entrambe le parti, garantendoallo stesso modo delle interfacce comuni per i client che vogliono comunicare con ilserver REST.Per creare un client REST, si ha bisogno di:

∗ un client HTTP;

∗ le Uniform Resource Identifier (URI)[g] delle risorse a cui vogliamo accedere;

∗ la capacità di interpretare il formato delle rappresentazione delle risorse.

In definitiva, il server mette a disposizione delle risorse e le operazioni con cui è possibilemanipolare tali risorse. Solitamente, e per quanto riguarda SkillMatrix, le operazioniche vengono "pubblicizzate" da un server con questa architettura sono le classicheCRUD.Trattandosi di un client che dialoga con il server attraverso protocollo HTTP, lerichieste da utilizzare per gestire le risorse tramite operazioni CRUD saranno i verbiHTTP standard, ovvero:

∗ GET;

∗ POST;

∗ PUT;

27

Page 38: Sviluppo test driven di un front-end con AngularJS

28 CAPITOLO 5. PROGETTAZIONE E CODIFICA

∗ DELETE.

Rispettivamente, questi verbi consentono di visualizzare i dati della risorsa, di modifi-carli, di inserire una nuova risorsa o di cancellarla. Ovviamente, a seconda della risorsae dei permessi del client, certe operazioni possono essere possibili o no (ad esempio, unutente senza privilegi di amministrazione può non avere il permesso di eliminare unarisorsa).In questo tipo di architettura, il client deve utilizzare questi verbi HTTP per comu-nicare con il server. Le risposte del server sono riassunte in uno specifico codice distato, il quale esprime se l’operazione è andata a buon fine, se ci sono stati deglierrori di trasmissione o semplicemente trasmette ulteriori informazioni al client. Talicodici di errore sono fondamentali per il client, il quale deve modificare il suo statointerno in base al codice ritornato in risposta dal server. Per fare un esempio, il tipicocomportamento di un client che ha richiesto la visualizzazione di una risorsa è, in casodi successo, l’effettivo caricamento delle informazioni della risorsa in una pagina; incaso di errore, ad esempio una risorsa non presente, il client deve sapersi adattare atale errore e mostrare visivamente quale errore si è presentato, per informare l’utente.

5.2 Architettura di AngularJSAngularJS è stato il framework maggiormente utilizzato in questo Stage e mi haconsentito di implementare l’intero progetto agilmente.Alla base del framework, è collocato il design pattern MVC, leggermente modificatoper adattarsi alle funzionalità di AngularJS. Il design pattern che ne risulta è qualcosadi più flessibile del classico MVC, consentendo agli sviluppatori una maggior libertà diutilizzo.Ovviamente ci sono delle direttive e delle best practice consigliate, soprattutto se siintende creare un front-end davvero REST-ful.

5.2.1 Model

In AngularJS, il "model" è realizzato con precise strutture dati. Innanzitutto, lalogica di business dell’applicazione si colloca nei cosiddetti servizi. I servizi sono deisingleton istanziati con tecnica lazy, ovvero alla prima invocazione. In queste struttureè collocata tutta la logica che è indipendente dalla view, puntando al suo massimoriutilizzo.Differentemente dai controller, le Factory dei servizi vengono richiamate dal sistemadi Dependendcy Injection. Questo avviene passando come argomento al construttoredi una struttura il nome del servizio da richiamare; sarà poi compito dell’injector diAngularJS richiamare la corretta factory del servizio richiesto.I servizi vegono utilizzati inoltre (e soprattutto) per gestire i dati sensibili dell’utenzae dei vari oggetti presenti nel back-end. Sono loro, infatti, gli esecutori materiali dellerichieste REST al back-end, grazie alle direttive apposite, come $http e $resource; idati risultanti verranno poi forniti alle viste, se necessario, passando per gli adeguaticontroller.

5.2.2 View

Le viste realizzate con AngularJS sono essenzialmente pagine web con delle funzionalitàdi markup aggiuntive. All’interno di una pagina scritta in codice HTML, si possono

Page 39: Sviluppo test driven di un front-end con AngularJS

5.2. ARCHITETTURA DI ANGULARJS 29

figura 5.1: Esempio di legame tra vista-controller -servizio

utilizzare delle direttive di AngularJS che verranno interpretate prima di renderizzare lapagina. Tramite queste direttive è possibile visualizzare dati del modello, modificarli inreal time grazie al Two-way data binding richiamare funzioni di uno specifico controllere molto altro.La classica dicitura di AngularJS per identificare un’espressione da interpretare siottiene racchiudendo l’espressione tra due parentesi graffe:

{{ espressione }}

All’interno di questa dicitura, ogni espressione viene valutata e il suo risultato vienerenderizzato nella pagina web. Se, ad esempio, nel template HTML si inserisce un’ope-razione matematica all’interno delle doppie graffe, una volta renderizzata la pagina ilrisultato dell’operazione (se possibile) verrà mostrato al posto dell’espressione.Oltre a questa funzionalità, AngularJS mette a disposizione una grande varietà di diret-tive per manipolare il Document Object Model (DOM)[g], come iteratori per scorrereinsiemi di dati o filtri da applicare ad una collezione per limitarne la visualizzazione.

5.2.3 ControllerI controller in AngularJS sono ciò che implementa la logica applicativa. Vengono legatial template di una pagina tramite la direttiva ng-controller posta all’interno di unelemento HTML. Così facendo, si invoca il costruttore del controller designato; lo scopedel controller appena creato è l’elemento in cui è stato dichiarato e gli eventuali nodifigli dell’elemento stesso.Il principale scopo dei controller è di esporre funzionalità alle espressioni ed alle

Page 40: Sviluppo test driven di un front-end con AngularJS

30 CAPITOLO 5. PROGETTAZIONE E CODIFICA

figura 5.2: Esempio di template di una vista e Data Binding

direttive utilizzate all’interno delle pagine web. Questo si ottiene aggiungendo metodie proprietà all’oggetto $scope che verrà condiviso con la vista. Questo oggetto inparticolare permette di realizzare il cosiddetto view-model, ovvero quella parte delmodel che verrà presentata alla view. Inoltre, tutte le proprietà associate al controllersaranno rese disponibili al template, nello scope che compete al controller.

figura 5.3: Esempio di legame tra template e Controller

5.2.4 Two-way Data Binding

Una funzionalità importante che AngularJS espone è il cosiddetto Two-Way DataBinding. Si parla di legame doppio tra dati quando una variabile del modello è legataad un elemento che può cambiare ed al contempo mostrare il contenuto della variabilestessa. In una vista di AngularJS, ogniqualvolta un elemento che applica il Two-Way

Page 41: Sviluppo test driven di un front-end con AngularJS

5.3. DEFINIZIONE DELLE API REST 31

Data Binding viene modificato, il corrispondente campo nel modello viene notificato eaggiornato correttamente.In AngularJS, si usa la direttiva ng-model per legare una variabile del modello ad unelemento HTML che può sia mostrare il suo valore, che modificarlo.

figura 5.4: Doppio legame tra vista e modello di AngularJS

5.2.5 Dependency Injection

Dependency Injection è un design pattern creato per gestire e risolvere le varie di-pendenze tra più moduli software, e viene utilizzato all’interno di questo particaleframework JavaScript.La responsabilità di fornire le varie componenti richieste dalle dipendenze è demandataal sottosistema di gestione delle iniziezioni di AngularJS. Ogni volta che si dichiarauna componente, viene registrata al modulo corrispondente; in questo modo, il sistemadi gestione delle dipendenze può riconoscere la componente ed usarla dove è richiesto.Quando è richiesta una dipendenza, l’iniettore controlla il nome con cui è stata richie-sta e la cerca nelle dipendenze registrate nel modulo, per iniettarla dove richiesto, sepresente.

5.3 Definizione delle API REST

Questa sezione presenta la lista delle API concordate per le richieste REST al back-end.Ogni definizione comprende l’URI di riferimento, il tipo di richiesta e i valori di ritornopossibili.Nelle URI delle richieste, la dicitura vx sta ad indicare il numero di versione dellarichiesta, mentre l’espressione :variabile sta ad indicare una porzione variabile dell’URI,utilizzata da AngularJS.

Page 42: Sviluppo test driven di un front-end con AngularJS

32 CAPITOLO 5. PROGETTAZIONE E CODIFICA

figura 5.5: Esempio di configurazione di una factory per l’iniettore

5.3.1 Informazioni utenteLettura

URL /api/vx/users/:username

Metodo GET

Contenuto della richiesta nessuno

Risposte

200 la risposta contiene il JavaScript Object Notation (JSON)[g] compatto con leproprietà utente;

404 se l’utente non è presente;

403 se l’utente non è autorizzato ad accedere all’informazione.

Invio di dati per l’autenticazione

URL /api/vx/login

Metodo POST

Contenuto della richiesta file JSON con la seguente formattazione:

{’username’: ’some_username’,’password’: ’some_password’

}

Page 43: Sviluppo test driven di un front-end con AngularJS

5.3. DEFINIZIONE DELLE API REST 33

Risposte

200 la risposta contiene il JSON compatto con le proprietà utente, più un tokenutilizzato per comporre l’header di autenticazione;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’autenticazione non è andata a buon fine.

Creazione di un nuovo utente

URL /api/vx/users

Metodo PUT

Contenuto della richiesta file JSON compatto contenente username ed email

Risposte

201 la risposta contiene l’id della proprietà creata;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato alla creazione di un nuovo utente.

Modifica dei dati utente

URL /api/vx/users/:username

Metodo PATCH

Contenuto della richiesta file JSON contenente le modifiche da applicare all’utentedesignato

Risposte

204 corpo vuoto;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a modificare l’entità.

5.3.2 Esperienze professionali

Lettura

URL /api/vx/users/:username/experiences

Metodo GET

Contenuto della richiesta nessuno

Page 44: Sviluppo test driven di un front-end con AngularJS

34 CAPITOLO 5. PROGETTAZIONE E CODIFICA

Risposte

200 la risposta contiene il JSON con l’array di esperienze;

404 se la risorsa non è presente;

403 se l’utente non è autorizzato ad accedere all’informazione.

Inserimento di una nuova esperienza

URL /api/vx/users/:username/experiences

Metodo PUT

Contenuto della richiesta file JSON con la seguente formattazione:

{’role’: ’ruolo_aziendale’,’company’: ’nome_azienda’,’managerName’: ’nome_responsabile’,’managerMail’: ’mail_responsabile’,’beginDate’: ’data_ISO’,’endDate’: ’data_ISO’,’description’: "breve descrizione dell’esperienza lavorativa",’area’: ’area_competenza’,’technologies’: ’stack_utilizzati’

}

Risposte

201 la risposta contiene il JSON dell’esperienza appena creata;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a creare una nuova esperienza.

Modifica dei dati di un’esperienza

URL /api/vx/users/:username/esperiences/:experience

Metodo PATCH

Contenuto della richiesta file JSON contenente le modifiche da applicare all’espe-rienza dell’utente

Risposte

204 corpo vuoto;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a modificare l’entità.

Page 45: Sviluppo test driven di un front-end con AngularJS

5.3. DEFINIZIONE DELLE API REST 35

5.3.3 Titoli di studio ed abilitazioni professionaliLettura

URL /api/vx/users/:username/qualifications

Metodo GET

Contenuto della richiesta nessuno

Risposte

200 la risposta contiene il JSON con l’array di qualificazioni;

404 se la risorsa non è presente;

403 se l’utente non è autorizzato ad accedere all’informazione.

Inserimento di una nuova qualificazione

URL /api/vx/users/:username/qualifications

Metodo PUT

Contenuto della richiesta file JSON con una tra le seguenti formattazioni:

∗ se la qualificazione in questione non è un workshop, ovvero non è un prodotto:

{’type’: ’tipo_certificazione’,’authority’: ’ente_di_rilascio’,’address’: ’recapito_ente’,’grade’: ’grado_certificazione’,’earnDate’: ’data_ISO’

}

∗ se la qualificazione in questione è un workshop:

{’type’: ’workshop’,’authority’: ’ente_di_rilascio’,’address’: ’recapito_ente’,’grade’: ’grado_certificazione’,’earnDate’: ’data_ISO’,’vendor’: ’committente’,’product’: ’nome_workshop’,’expireDate’: ’data_ISO’

}

Risposte

201 la risposta contiene il JSON della qualificazione appena creata;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a creare una nuova qualificazione.

Page 46: Sviluppo test driven di un front-end con AngularJS

36 CAPITOLO 5. PROGETTAZIONE E CODIFICA

Modifica dei dati di una qualificazione

URL /api/vx/users/:username/qualifications/:qualification

Metodo PATCH

Contenuto della richiesta file JSON contenente le modifiche da applicare allaqualificazione dell’utente

Risposte

204 corpo vuoto;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a modificare l’entità.

5.3.4 Skill

Lettura

URL /api/vx/users/:username/skills

Metodo GET

Contenuto della richiesta nessuno

Risposte

200 la risposta contiene il JSON con l’array di skill ;

404 se la risorsa non è presente;

403 se l’utente non è autorizzato ad accedere all’informazione.

Inserimento di una nuova skill

URL /api/vx/users/:username/skills

Metodo PUT

Contenuto della richiesta file JSON con la seguente formattazione:

{’area’: ’area_skill’,’scope’: ’ambito_skill’,’domain’: ’dominio_skill’,’competence’: ’array_versioni_dominio’,’level’: Junior/Intermediate/Senior

}

Page 47: Sviluppo test driven di un front-end con AngularJS

5.3. DEFINIZIONE DELLE API REST 37

Risposte

201 la risposta contiene il JSON della skill appena creata;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a creare una nuova skill.

Modifica dei dati di una skill

URL /api/vx/users/:username/skills/:skill

Metodo PATCH

Contenuto della richiesta file JSON contenente le modifiche da applicare alla skilldell’utente

Risposte

204 corpo vuoto;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a modificare l’entità.

5.3.5 Progetti associati

Lettura lista dei progetti associati all’utente

URL /api/vx/users/:username/projects

Metodo GET

Contenuto della richiesta nessuno

Risposte

200 la risposta contiene il JSON con l’array di nomi dei progetti associati;

404 se la risorsa non è presente;

403 se l’utente non è autorizzato ad accedere all’informazione.

Lettura delle informazioni di un progetto

URL /api/vx/users/:username/projects/:projectname

Metodo GET

Contenuto della richiesta nessuno

Page 48: Sviluppo test driven di un front-end con AngularJS

38 CAPITOLO 5. PROGETTAZIONE E CODIFICA

Risposte

200 la risposta contiene il JSON con le proprietà del progetto richiesto;

404 se la risorsa non è presente;

403 se l’utente non è autorizzato ad accedere all’informazione.

Inserimento di un nuovo progetto

URL /api/vx/users/:username/projects/:projectname

Metodo PUT

Contenuto della richiesta file JSON con la seguente formattazione:

{’projectTitle’: ’titolo_progetto’,’description’: ’breve descrizione del progetto’,’client’: ’committente’,’beginDate’: ’data_ISO’,’endDate’: ’data_ISO’,’area’: ’area_progetto’,’technologies’: ’array di tecnologie’,’team’: ’array di sviluppatori’

}

Risposte

201 la risposta contiene il JSON del progetto appena creato;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a creare un nuovo progetto.

Modifica dei dati di un progetto

URL /api/vx/users/:username/projects/:projectname

Metodo PATCH

Contenuto della richiesta file JSON contenente le modifiche da applicare alprogetto

Risposte

204 corpo vuoto;

400 se gli header sono invalidi oppure se il contenuto della richiesta non è corretto;

403 se l’utente non è autorizzato a modificare l’entità.

Page 49: Sviluppo test driven di un front-end con AngularJS

5.4. STUB BACK-END 39

5.4 Stub Back-endIl progetto di Stage ha avuto come oggetto la realizzazione di un front-end gestionale,senza però avere al contempo un back-end funzionante. Per le verifiche funzionali,quindi, ho avuto bisogno di realizzare un back-end fittizio, il quale mi consentisse dieffettuare chiamate alle API concordate con il Responsabile di Progetto per il back-endvero e proprio.Per realizzare questo back-end sono ricorso a delle feature fornite dalle librerie diAngularJS adibite al testing di unità. Durante il testing delle funzionalità di unacomponente, le richieste ad un server funzionante vengono sostituite con una chiamataad hoc che deve rispettare certe precondizioni e che restituisce dei dati prestabiliti.Il concetto del back-end di stub[g] che ho utilizzato è lo stesso. In particolare, grazieall’utilizzo di espressioni regolari per filtrare le chiamate REST, sono stato in gradodi intercettare tali chiamate e di farle gestire al mio back-end ad hoc, con risposteprestabilite.Tutto ciò è stato possibile gran parte grazie al servizio $httpBackend di AngularJS,il quale contiene metodi di intercettazione di chiamate REST e di gestione di richiestee risposte (e relativi header) HTTP. Il frammento sottostante è un esempio di unachiamata HTTP gestita dal back-end di stub:

$httpBackend.whenGET(/\/api\/\d.\d\/users\/\w*\/qualification/).respond(function(method, url, data, headers) {

console.log(’Received these data:’, method, url, data, headers);var getStatus,getData = {},getHeaders = headers;

if(headers.Authorization == "Bearer XXX") {getStatus = 200;getData = {

qualifications: [{

type: ’Workshop’,authority: ’W3C’,address: ’Silicon Valley, 42’,grade: ’Senior’,earnDate: new Date(2015, 4, 20).toISOString(),vendor: ’RFC’,product: ’HTML6’,expireDate: new Date(2050, 4, 20).toISOString()

},{

type: ’Certificazione’,authority: ’Mongo’,address: ’MongoDB avenue, 8080’,grade: ’Senior’,earnDate: new Date(2014, 7, 8).toISOString()

},{

type: ’Corso’,authority: ’AngularJS’,address: ’1600 Amphitheatre Parkway Mountain View, CA 94043’,

Page 50: Sviluppo test driven di un front-end con AngularJS

40 CAPITOLO 5. PROGETTAZIONE E CODIFICA

grade: ’Junior’,earnDate: new Date(2015, 5, 20).toISOString()

}]

};}else

getStatus = 401;return [getStatus, getData, getHeaders];

});

5.5 Codifica

A causa del ciclo di vita Agile adottato nello sviluppo di questo progetto, la progetta-zione e la codifica sono andate di pari passo. La suddivisione del lavoro in User Storiese l’utilizzo della kanban hanno reso molto più disciplinata l’applicazione della metodo-logia Agile, mantenendo comunque la flessibilità e gli aspetti positivi di questo ciclo divita software. Infatti, Agile aumenta molto l’interazione tra proponente e sviluppatore,stimolando l’acquisizione di feedback rapidi, cosa molto importante soprattutto in uncontesto di Stage, a mio avviso.

5.5.1 Callback e Promesse JavaScript

Una delle peculiarità di JavaScript è la gestione delle funzioni. Infatti, in questolinguaggio e nei suoi framework, le funzioni sono considerate degli oggetti veri e propri.Ciò consente ad un programmatore alcune operazioni particolari con le funzioni, comead esempio il passaggio di una funzione come argomento di un’altra funzione.Da questo principio nascono le callback, ovvero l’atto di richiamare all’interno di unafunzione, un’altra funzione passata come argomento. Ad esempio:

function calcola(func, arg1, arg2) {return func(arg1, arg2);

}

Nell’esempio soprastante, la funzione func richiamata all’interno di calcola, è statapassata come argomento ed utilizza come propri argomenti arg1 ed arg2. Questaproprietà permette anche, ad esempio, di richiamare selettivamente una callbackpiuttosto che un’altra, o cambiandone gli argomenti a seconda degli stati dell’esecuzione.Le callback sono state utilizzate estensivamente anche nel campo della programmazioneasincrona e della gestione di eventi. Infatti, una callback può essere invocata alla finedi un’acquisizione dati, per gestire i dati ritornati, a prescindere dal momento in cuiquesti saranno disponibili. Il caso tipico di esempio è una chiamata AsynchronousJavaScript and XML (AJAX)[g], dove la callback viene passata come parametro allachiamata e viene invocata al termine dell’acquisizione dei dati dalla rete.Purtroppo, però, le callback presentano alcuni aspetti negativi:

∗ scarsa leggibilità del codice e conseguente difficoltà di manutenzione;

∗ difficoltà di composizione delle callback e conseguente sincronizzazione dellechiamate;

Page 51: Sviluppo test driven di un front-end con AngularJS

5.5. CODIFICA 41

∗ difficoltà di gestione di errori all’interno delle callback, soprattutto se queste sonodelle funzioni anonime.

Da questa serie di inconvenienti propri dell’utilizzo delle callback, sono state ideate lepromesse. Questi oggetti rappresentano il risultato di una chiamata di una funzioneasincrona, talvolta chiamate con il nome di future, delay o deferred ; tutte queste dicituregarantiscono che la promessa restituisca il dato non appena questo è disponibile.Una promessa può trovarsi in uno dei seguenti stati:

∗ pending, quando il risultato della chiamata asincrona non è ancora disponibile;

∗ resolved, quando la chiamata asincrona ha prodotto un risultato valido;

∗ rejected, se la chiamata asincrona non ha prodotto un risultato, anche a causa diun errore da gestire.

Oltre a rendere il codice molto più leggibile, le promesse consentono di ottenere unamaggiore chiarezza nella programmazione e una migliore gestione degli errori che sipossono verificare. Ecco un esempio di utilizzo di una promessa in una chiamataAJAX:

var getUser = function() {var deferred = Q.defer();$.get("/users", [id: "12345"], deferred.resolve);return deferred.promise;

}

getUser().then(function(user) {console.log("Nome utente: " + user.Name);

});

Nell’esempio soprastante, viene prima creato l’oggetto che rappresenta la promessalegata alla chiamata AJAX dell’utente con id "12345", la quale promessa viene ritor-nata dalla funzione. L’invocazione successiva di getUser() presenta una concatenazionecon il costrutto then, il quale specifica che il corpo della funzione a lui associato verràeseguito solo quando la promessa precedente verrà risolta.Lo stato di una promessa, inoltre, stabilisce se questa è stata risolta senza errorioppure se qualche imprevisto è avvenuto. A questo serve lo stato rejected di unaparticolare promessa, il quale concretizza che sia avvenuto un errore. L’errore verràquindi segnalato attraverso lo stato rejected e tutti i costrutti che utilizzeranno quellapromessa saranno segnalati e dovranno gestire il caso particolare dell’errore.Inolte è possibile concatenare più promesse in modo controllato, così da creare unacatena asincrona di esecuzione di funzioni, ma senza causare una diminuzione di chia-rezza nel codice. In più, se una promessa all’interno della catena solleva un’eccezione,sistematicamente l’errore viene gestito localmente o propagato al chiamante, con unmaggior controllo nell’esecuzione.

Promesse nel progetto

Come presentato nella sezione precedente, le promesse possono venir utilizzate pergestire in modo asincrono le chiamate AJAX. Ciò è vero e largamente utilizzato anchenel framework AngularJS, dove le promesse sono parte integrante delle direttive $httpe $resource. Infatti, queste direttive utilizzano gli stessi costrutti derivanti dalla

Page 52: Sviluppo test driven di un front-end con AngularJS

42 CAPITOLO 5. PROGETTAZIONE E CODIFICA

libreria Q di Kriskowal1, sia per la risoluzione delle promesse che per la loro gestionedegli errori.In particolare, la direttiva $http mi è stata fondamentale per realizzare le richiesteREST e per la loro gestione tra servizi e controller. Qui sotto, un esempio di applicazionedella direttiva $http nel progetto di SkillMatrix.

expFactory.getExperiences = function(username) {return $http

.get(’/api/’ + APP_VERSION.version + ’/users/’ + username + ’/experiences’);};

5.5.2 Diagrammi di attivitàVado ora ad illustrare i diagrammi di attività delle funzionalità principali di SkillMatrix.Tali diagrammi fanno riferimento al linguaggio di modellazione UML.

Attività generali

figura 5.6: Diagramma di attività generale di SkillMatrix

Questo diagramma delle attività rappresenta la visione generale delle operazioniche si possono compiere all’interno dell’applicazione.

1Libreria Q di Kriskowal. url: https://github.com/kriskowal/q.

Page 53: Sviluppo test driven di un front-end con AngularJS

5.5. CODIFICA 43

Dopo aver effettuato il login con successo al sistema, si viene reindirizzati alla paginadel proprio profilo, con i propri dati aggiornati. Ora si può scegliere tra una lista dipossibili menù:

∗ esperienze professionali;

∗ titoli di studio e abilitazioni professionali (qualificazioni);

∗ skill ;

∗ progetti associati;

∗ logout.

Le prime opzioni portano alla pagina di gestione corrispondente, mentre il pulsante dilogout consente di uscire dall’applicazione eliminando i dati di sessione.

Attività di gestione delle skill

figura 5.7: Diagramma di attività di gestione delle skill di SkillMatrix

Questo diagramma delle attività è più specifico del precedente ed illustra le attivitàeseguibili nella pagina di gestione delle skill.Una volta giunti a questa pagina, si può decidere di filtrare la visualizzazione a secondadel livello di skill che si desidera visualizzare, sia questo Junior, Intermediate o Senior,oppure una combinazione dei tre. La vista è aggiornata in real time, dato che il

Page 54: Sviluppo test driven di un front-end con AngularJS

44 CAPITOLO 5. PROGETTAZIONE E CODIFICA

filtraggio dei dati avviene in locale sulla macchina dell’utente, a seconda dei parametriselezionati.Oltre alla visualizzazione, l’utente può inserire una nuova skill nel sistema. Qui, perpoter inserire una skill valida, l’utente deve specificare:

∗ Area, ad esempio Java;

∗ Ambito, ad esempio J2EE ;

∗ Dominio, ad esempio Tomcat ;

∗ Competenze, ovvero le versioni di competenza della skill ;

∗ Livello, ovvero il livello di competenza della skill, ad esempio Junior.

Dopo aver compilato i campi necessari per l’inserimento, l’utente può richiedere ilsalvataggio della skill. Se la skill non è considerata valida (perché manca qualcheparametro oppure i dati inseriti non sono validi), l’applicazione segnala tali invaliditàtramite dei messaggi popup e richiede il corretto inserimento. Se invece l’utenteseleziona il pulsante di reset, l’utente può reinserire dei nuovi dati della skill. Se infinela skill è considerata valida, l’utente viene riportato alla pagina di gestione delle skill,aggiornata con la nuova skill appena inserita.

Page 55: Sviluppo test driven di un front-end con AngularJS

Capitolo 6

Verifica e validazione

Breve introduzione al capitoloQuesto capitolo descrive i test effettuati per garantire la qualità del codice prodottodurante l’implementazione di SkillMatrix e i risultati di tali verifiche.

6.1 Test di unitàL’approccio Test Driven garantisce intrinsecamente che ogni unità software sia testataancora prima della sua implementazione. Ogni unità dovrebbe contenere il quantitativominimo di codice necessario a far rendere positivo il test ideato e scritto in precedenza.Questo approccio, sebbene all’inizio sia piuttosto insolito ed a prima vista tedioso, risultainvece essere imprescindibile nello sviluppo di applicazioni web, soprattutto utilizzandoframework JavaScript. AngularJS stesso è stato pensato per scrivere applicazionifacilmente testabili, includendo al suo interno delle librerie create appositamente per iltesting.Mi è stato quindi possibile testare ogni componente della logica dell’applicazione,controllando il comportamento delle unità e dei loro metodi. Tramite l’utilizzo disistemi di automazione, nel mio caso Karma, sono riuscito a rendere il processo ditesting quanto più automatico possibile ed a calcolare con facilità le metriche base perverificare l’utilità dei test scritti.Tramite il plugin di coverage di Karma, ho generato automaticamente tali cifre,suddividendole per:

∗ line coverage;

∗ statement coverage;

∗ branch coverage;

∗ function coverage.

Nella figura sottostante, presento i dati in forma tabellare, come vengono visualizzatidall’output del plugin karma-coverage, installabile facilmente da NPM.

6.1.1 Test di unità di AngularJSLa scrittura e l’esecuzione dei test nello sviluppo in linguaggio JavaScript è imprescin-dibile. Su questa base sono nati svariati framework di testing, ed AngularJS cerca di

45

Page 56: Sviluppo test driven di un front-end con AngularJS

46 CAPITOLO 6. VERIFICA E VALIDAZIONE

figura 6.1: Metriche di copertura generali nel progetto SkillMatrix

figura 6.2: Metriche di copertura dei controller nel progetto SkillMatrix

figura 6.3: Metriche di copertura dei servizi nel progetto SkillMatrix

semplificare al massimo queste attività. Questo framework dispone di diverse direttiveutili al fine di simulare il comportamento di componenti esterne, che possono essereanche non ancora state realizzate al tempo della scrittura del test. Infatti, AngularJScomprende anche il pacchetto angular-mocks, il quale fornisce tutta una serie di librerieper AngularJS dedicate solamente ai test del front-end.All’interno di questo pacchetto vi sono costruttori di stub che simulano il comporta-mento di ogni tipo di componente di AngularJS: dai controller, ai servizi, alle singolechiamate verso il back-end. Nei singoli test di unità, infatti, è importante testare ilcomportamento di una componente a seconda dei dati in input, automatizzando iltutto il più possibile.Fra le tante direttive presenti nel pacchetto angular-mocks, una delle più utili è disicuro stata $httpBackend, la quale simula il comportamento di un back-end fittizio,al fine di controllare la struttura ed il contenuto delle chiamate effettuate al back-end,senza per forza disporre di un back-end e per automatizzare le attività di testing inlocale.$httpBackend agisce in modo da frapporsi tra il front-end di AngularJS ed il back-

Page 57: Sviluppo test driven di un front-end con AngularJS

6.1. TEST DI UNITÀ 47

end, intercettando le chiamate per analizzarne le richieste; inoltre si può fare in modo difornire delle risposte definite al client, in modo da testare il comportamento dell’unitàche si sta verificando. L’intercettazione delle chiamate è selettiva, quindi si può sceglieredi filtrare delle richieste di una specifica risorsa REST piuttosto che un’altra.

it(’should get project list from server’, function() {$httpBackend.expectGET(’/api/’ + APP_VERSION.version + ’/users/’ + username + ’/projects’)

.respond(200, {data: {

projects: [{

projectTitle: ’Smash’,registered: true

},{

projectTitle: ’Linko’,registered: true

},{

projectTitle: ’SkillMatrix’,registered: false

}]

}});var responseData = [];ProjListFactory.getProjects(username).success(function(data) {

responseData = data.data.projects;});

$httpBackend.flush();expect(responseData.length).toBe(3);expect(responseData[0].projectTitle).toBe(’Smash’);expect(responseData[1].registered).toBeTruthy();expect(responseData[2].registered).toBeFalsy();

});

Questo frammento di codice testa che i dati di una lista di progetti siano ottenutie gestiti secondo la formattazione stabilita. Si può notare che la richiesta che vieneintercettata è una richiesta REST particolare, in quanto si vuole testare una singolafunzionalità per volta. Vengono quindi forniti dei dati fittizi in risposta in modo dacontrollare il comportamento del modulo alla gestione dei dati; il modo in cui questoviene fatto in Jasmine è di controllare che le aspettative degli output siano confrontatecon i dati attuali all’esecuzione del test, per vedere se entrambi combaciano.

Page 58: Sviluppo test driven di un front-end con AngularJS

48 CAPITOLO 6. VERIFICA E VALIDAZIONE

6.2 Test End-To-EndI test di scenario (o E2E) servono a verificare la corretta interazione di uno o piùunità software al fine di perseguire una certa azione dell’utente. AngularJS consiglia diutilizzare lo stack fornito da Protractor e da Selenium per automatizzare il processo ditesting. Ogni test di scenario automatizza gli input utente in un browser ed analizzagli output ad ogni modifica.Questi test sono molto più laboriosi di un test di unità eseguito con Karma, ma sonomolto più vicini ad essere dei test di validazione.In questo progetto ho creato un test per ogni tipo di azione utente, dalla sempliceconsultazione di informazioni del profilo all’inserimento di una nuova skill nel sistema.Ogni test avviene automatizzando l’input attraverso la selezione dei vari elementiHTML della pagina a cui fa riferimento il test e gli elementi vengono individuatitramite semplici selettori CSS o jQuery.

figura 6.4: Grafica da console dell’esecuzione di test E2E di Protractor

Ogni test è composto di passi ben precisi, ovvero le stesse azioni che compongonol’input utente. Il test quindi deve effettuare gli stessi passi, compresi i singoli click sudei link e l’input di testo quando richiesto. La prossima porzione di codice è il test E2Edel login, sia errato che corretto, con le proprie expectations, ovvero i valori previsti inoutput.

’use strict’;

describe(’SkillMatrix login’, function() {

beforeEach(function() {browser.get(’base.html’);browser.waitForAngular();

});

it(’should have a title’, function() {expect(browser.getTitle()).toEqual(’SkillMatrix’);

});

it(’should appear an error message on wrong login’, function() {element(by.model(’credentials.name’)).sendKeys(’IKS’);element(by.model(’credentials.password’)).sendKeys(2);

element(by.css(’button[type="submit"]’)).click();

expect(element(by.binding(’alert.message’)).getText()).toEqual(’I dati di autenticazione sono errati(1)’);

});

Page 59: Sviluppo test driven di un front-end con AngularJS

6.2. TEST END-TO-END 49

it(’should login correctly with right credentials’, function() {element(by.model(’credentials.name’)).sendKeys(’IKS’);element(by.model(’credentials.password’)).sendKeys(’pippo’);

element(by.css(’button[type="submit"]’)).click();

browser.getLocationAbsUrl().then(function(url) {expect(url.split(’#’)[1]).toBe(’/profile’);

});});

});

Page 60: Sviluppo test driven di un front-end con AngularJS
Page 61: Sviluppo test driven di un front-end con AngularJS

Capitolo 7

Conclusioni

Breve introduzione al capitoloCapitolo contenente le conclusioni sull’attività di Stage, dal consuntivo alle valutazionipersonali.

7.1 Bilancio finale

figura 7.1: Grafico di rapporto tra requisiti totali e soddisfatti

Gli obiettivi per la riuscita soddisfacente dello Stage sono stati fissati subito dopo lafase iniziale di formazione. Tali obiettivi si sono concretizzati tramite l’individuazionedei requisiti dell’applicazione SkillMatrix, ovvero le caratteristiche e le funzionalità chel’applicativo deve avere per soddisfare ed essere utile al Committente.I requisiti individuati e riportati nella sezione 4.2 sono serviti soprattutto per garantireche le funzionalità desiderate per SkillMatrix siano state implementate. Nel miocaso, tali requisiti sono stati suddivisi in necessari, desiderabili ed opzionali. Irequisiti necessari formalizzano le funzionalità base e imprescindibili per il corretto

51

Page 62: Sviluppo test driven di un front-end con AngularJS

52 CAPITOLO 7. CONCLUSIONI

funzionamento dell’applicazione, ovvero i requisiti che devono essere implementaticompletamente. Desiderabili sono invece i requisiti che rappresentano le funzionalitàaggiuntive che accrescono il valore del prodotto, portando un beneficio in termini diusabilità o estensione. I requisiti opzionali, invece, rappresentano feature minori,ovvero che non sono ritenuti prioritari o importanti al fine della realizzazione delprogetto.Sulla base di ciò, al termine della mia attività di Stage ho realizzato pienamente tutti irequisiti necessari, che costituivano la parte predominante dei requisiti identificati,più la quasi totalità dei requisiti desiderabili. Per ragioni di pianificazione e confrontocon il Responsabile Aziendale, abbiamo preferito dare priorità agli elementi base dellagestione utente, piuttosto che alla realizzazione delle feature aggiuntive, le quali, senecessario, saranno sviluppate in un secondo momento.La piccola quantità di requisiti opzionali non è stata implementata, in quanto si trattadi funzionalità minori, ritenute meno importanti e quindi tralasciate.

7.2 Problematiche incontrateL’applicazione di un modello di sviluppo Agile è stata relativamente difficoltosa, a primoimpatto. Questo modello, a mio avviso, si applica più efficacemente a sviluppatori consolida esperienza, data la sua versatilità e flessibilità di utilizzo. Infatti, se si applica lametodologia Agile senza delle procedure adeguate, il risultato può essere imprevedibile.Sebbene all’interno dell’azienda ci fossero delle procedure ben consolidate per l’applica-zione di questo modello, la sua attuazione da parte mia non è stata immediata. Ciò èstato anche causato dall’assenza di esperienza da parte mia delle tecnologie aziendaliper la gestione dello sviluppo software, per colmare la quale è stata impiegata la primasettimana di Stage.La settimana iniziale di formazione ha contribuito ampiamente a colmare le mie lacuneteoriche e pratiche sull’attuazione di una metodologia Agile e sulla sua implementazionea livello di strumenti aziendali.Ho riscontrato la stessa mancanza di conoscenze per quanto riguarda gli strumenti diautomazione e di testing che ho utilizzato in questo Stage. Questo problema è statofacilmente risolvibile, in quanto la documentazione presente online dei framework cheho utilizzato è ampiamente esaustiva; inoltre la facilità di interfacciamento tra le variecomponenti dello stack tecnologico che ho utilizzato, ha permesso una ancora maggioreefficienza nell’apprendimento e nell’applicazione di queste tecnologie.Per ultima, forse la realtà che è stata più distante dalla mia consuetudine di studente,la metodologia Test Driven si è rivelata tanto efficace quanto difficile da applicare.Il metodo di sviluppo che sta alla base del Test Driven Developement è stato moltolontano da quello che ho applicato nei progetti della mia carriera universitaria.

7.3 Conoscenze acquisiteL’acquisizione delle conoscenze necessarie ad applicare la metodologia Agile con criterioe organizzazione è stata per me un obiettivo fondamentale per la buona riuscitadello Stage e per la mia carriera futura. Sicuramente l’aggiunta dei framework cheimplementano questa tecnologia che ho imparato a conoscere durante lo Stage amplianomolto il mio bagaglio culturale di sviluppatore.Ritengo che la metodologia di sviluppo Agile, se applicata con criterio, sia molto efficacee durante il corso di questo Stage ho imparato a mettere in pratica i suoi principi,

Page 63: Sviluppo test driven di un front-end con AngularJS

7.4. VALUTAZIONE PERSONALE 53

grazie anche all’aiuto del mio Responsabile Aziendale Marco Albarelli.Un’altra metodologia che sono stato molto soddisfatto di aver applicato è il Test DrivenDevelopement. Sebbene il primo impatto spinga a vedere lo sviluppo Test Driven comemolto oneroso in termine di tempo e, forse, ripetitività, a lungo andare gli effetti di uninvestimento iniziale sono molto positivi. Questa metodologia permette di risparmiaremolto lavoro postumo e aumenta la manutenibilità del codice, garantendo la qualitàdel codice stesso ancora prima della sua stesura. Inoltre, quando si ha a che farecon linguaggi di programmazione molto liberi come JavaScript, l’apporto di test allascrittura di codice è pressoché obbligatorio, se davvero si vogliono scrivere applicazionistabili e manutenibili.Ultimo ma non meno importante, ho potuto esprimere al meglio il mio interesse versoil framework AngularJS. Questo framework, oltre ad avere delle funzionalità moltoutili per lo sviluppo di applicazioni front-end, garantisce una compatibilità molto altacon altri strumenti utili per lo sviluppo di applicazioni client-side, come gli strumentidi testing e automazione.La scrittura di applicazioni web con AngularJS e Bootstrap risulta molto intuitiva eveloce, soprattutto se supportatat da strumenti come Grunt e Karma, che ho imparatoad utilizzare approfonditamente durante questo Stage.

7.4 Valutazione personaleLa mia valutazione personale sull’attività di Stage che ho svolto è estremamente positiva.Il confronto con una realtà lavorativa mi ha portato all’acquisizione di esperienze piùprofonde e concrete rispetto ad un progetto didattico.Il personale di IKS è stato sempre molto disponibile a chiarire i miei dubbi, invitandomia partecipare attivamente ed a riflettere sulle soluzioni da adottare, così da farmicrescere ulteriormente sia come sviluppatore che come persona; ringrazio davvero moltol’azienda e l’università per avermi concesso questa opportunità.Infine penso che le tecnologie che ho applicato durante lo Stage mi saranno utili nelfuturo prossimo, sia che le vada ad applicare direttamente, sia che vada ad adottareun diverso stack tecnologico. In ogni caso, ho aumentato la mia sicurezza ed efficienzanell’applicazione di queste conoscenze, e penso che ciò sia molto utile.

Page 64: Sviluppo test driven di un front-end con AngularJS
Page 65: Sviluppo test driven di un front-end con AngularJS

Glossario

AJAX tecnica di sviluppo software per la realizzazione di applicazioni web interattive.Lo sviluppo di applicazioni HTML con AJAX si basa su uno scambio di dati inbackground fra web browser e server, che consente l’aggiornamento dinamico diuna pagina web senza esplicito ricaricamento da parte dell’utente. 57

API in informatica con il termine Application Programming Interface API (ing.interfaccia di programmazione di un’applicazione) si indica ogni insieme diprocedure disponibili al programmatore, di solito raggruppate a formare un setdi strumenti specifici per l’espletamento di un determinato compito all’interno diun certo programma. La finalità è ottenere un’astrazione, di solito tra l’hardwaree il programmatore o tra software a basso e quello ad alto livello semplificandocosì il lavoro di programmazione. 57

back-end un’applicazione o un programma back-end serve indirettamente come sup-porto ai servizi del front-end, solitamente essendo vicino alla risorsa richiestao avendo la capacità di comunicare con data risorsa. L’applicazione back-endpuò interagire direttamente con il front-end oppure, forse più tipicamente, èun programma chiamato da un programma intermediario che si inserisce tra leattività del front-end e del back-end. iii, 2, 3, 10, 19, 26–28, 31, 39, 46, 55

CDN sistema di computer collegati in rete attraverso Internet, che collaborano inmaniera trasparente, sotto forma di sistema distribuito, per distribuire contenuti(specialmente contenuti multimediali di grandi dimensioni in termini di banda)agli utenti finali ed erogare servizi e file di generi diversi. 57

compliance atto di essere in allineamento con linee guida, regolamentazioni e/olegislazioni. 1, 55

CRUD con la sigla CRUD si rappresenta l’insieme delle quattro operazioni basilarisu dei dati persistenti, ovvero creazione, lettura, modifica ed eliminazione. 57

CSS linguaggio usato per definire la formattazione di documenti HTML, XHTML eXML e relative pagine web. Le regole per comporre il CSS sono contenute in uninsieme di direttive (Recommendations) emanate a partire dal 1996 dal W3C.L’introduzione del CSS si è resa necessaria per separare i contenuti dalla format-tazione e permettere una programmazione più chiara e facile da utilizzare, sia pergli autori delle pagine HTML che per gli utenti, garantendo contemporaneamenteanche il riuso di codice ed una sua più facile manutenibilità. 57

DOM letteralmente modello a oggetti del documento, è una forma di rappresentazionedei documenti strutturati come modello orientato agli oggetti. 57

55

Page 66: Sviluppo test driven di un front-end con AngularJS

56 Glossary

E2E acronimo di End-To-End, rappresenta quella categoria di test che si prefiggel’obiettivo di testare il comportamento di un utente su un sistema, usualmenteautomatizzando gli input utente previsti ed esaminando che i risultati attesi sianorispettati. 57

front-end nel campo della progettazione software il front end è la parte di un sistemasoftware che gestisce l’interazione con l’utente o con sistemi esterni che produconodati di ingresso (es. interfaccia utente con un form). iii, 2, 3, 26–28, 39, 46, 53,55

governance L’IT Governance è responsabilità diretta del consiglio di amministrazionee del management esecutivo. È parte integrante della governance aziendaleed è costituita dalla direzione, dalla struttura organizzativa e dai processi ingrado di assicurare che l’IT sostenga ed estenda gli obiettivi e le strategiedell’organizzazione. 1, 2, 55

HATEOAS vincolo delle applicazioni basate su architettura REST che le distinguedalla maggior parte delle altre applicazioni web. Il principio consiste in un clientche interagisce con un’applicazione web esclusivamente attraverso gli ipermediaforniti dinamicamente dai server dell’applicazione stessa. Un client REST nonnecessita così di nessuna conoscenza a priori per interagire con una particolareapplicazione o server che vada oltre la normale comprensione degli ipermedia. 57

HTML linguaggio di markup solitamente usato per la formattazione e impaginazionedi documenti ipertestuali disponibili nel World Wide Web sotto forma di pagineweb. 57

HTTP tradotto in protocollo di trasferimento di un ipertesto, è usato come principaleprotocollo per la trasmissione d’informazioni sul web. 57

ICT acronimo di Information and Communication Technology, tradotto in Tecnolo-gie dell’informazione e della comunicazione. Sono l’insieme dei metodi e delletecnologie che realizzano i sistemi di trasmissione, ricezione ed elaborazione diinformazioni. 57

IDE si traduce in italiano come Ambiente di Sviluppo Integrato. Un IDE è un softwareche, in fase di programmazione, aiuta i programmatori nello sviluppo del codicesorgente di un programma. Spesso l’IDE aiuta lo sviluppatore segnalando erroridi sintassi del codice direttamente in fase di scrittura, oltre a tutta una serie distrumenti e funzionalità di supporto alla fase di sviluppo e debugging. 57

JSON formato adatto all’interscambio di dati fra applicazioni client-server. 57

MVC pattern architetturale software utilizzato nell’implementazione di interfacceutente. Divide l’applicazione software in tre parti interconnesse, così da separarela rappresentazione interna delle informazioni dal modo in cui tali informazionisono presentate all’utente. 57

NPM package manager di JavaScript, usato di default da Node.js. Una volta installatoNode.js, è possibile utilizzare anche NPM, dato che viene distribuito assieme asuddetto framework. Al suo interno si trovano tutti i maggiori framework edutilities che si basano sul linguaggio JavaScript. 57

Page 67: Sviluppo test driven di un front-end con AngularJS

Glossary 57

REST REST si riferisce ad un insieme di principi di architetture di rete, i qualidelineano come le risorse sono definite e indirizzate. Il termine è spesso usato nelsenso di descrivere ogni semplice interfaccia che trasmette dati su HTTP senzaun livello opzionale. 57

SOAP acronimo di Simple Object Access Protocol, è un protocollo leggero per loscambio di messaggi tra componenti software, tipicamente nella forma di compo-nentistica software. La parola object manifesta che l’uso del protocollo dovrebbeeffettuarsi secondo il paradigma della programmazione orientata agli oggetti. 57

SPA una Single Page (Web) Application è un’applicazione web o semplicementeun sito che si propone di realizzare un comportamento più espressivo rispettoad un’applicazione desktop. In una SPA, il codice necessario viene caricato alcaricamento della pagina e tutti i contenuti vengono visualizzati dinamicamente,mentre tutte le comunicazioni con il server vengono nascoste all’utente. 57

Spring framework open source per lo sviluppo di applicazioni su piattaforma Java.Spring fornisce un modello comprensivo di programmazione e configurazione perapplicazioni enterprise basate sulla piattaforma Java. 2, 55

stub porzione di codice utilizzata in sostituzione di altre funzionalità software. Unostub può simulare il comportamento di codice esistente e temporaneo sostituto dicodice ancora da sviluppare. Gli stub sono perciò molto utili durante il porting disoftware, l’elaborazione distribuita e in generale durante lo sviluppo di softwaree il software testing. 39, 46, 55

UML in ingegneria del software UML, Unified Modeling Language (ing. linguaggiodi modellazione unificato) è un linguaggio di modellazione e specifica basatosul paradigma object-oriented. L’UML svolge un’importantissima funzione di“lingua franca” nella comunità della progettazione e programmazione a oggetti.Gran parte della letteratura di settore usa tale linguaggio per descrivere soluzionianalitiche e progettuali in modo sintetico e comprensibile a un vasto pubblico. 57

URI stringa che identifica univocamente una risorsa generica che può essere unindirizzo Web, un documento, un’immagine, un file, un servizio, un indirizzo diposta elettronica, ecc. 57

Page 68: Sviluppo test driven di un front-end con AngularJS
Page 69: Sviluppo test driven di un front-end con AngularJS

Acronimi e abbreviazioni

AJAX Asynchronous JavaScript and XML. 40, 41

API Application Program Interface. iii, 2, 3, 26, 27, 31, 39

CDN Content Delivery Network. 10

CRUD Create Read Update Delete. 19, 27

CSS Cascading Style Sheet. 3, 10, 26, 48

DOM Document Object Model. 29

E2E End-To-End. ix, 3, 9, 14, 16, 48

HATEOAS Hypermedia as the Engine of Application State. 26

HTML HyperText Markup Language. 3, 10, 13, 14, 28, 29, 31, 48

HTTP HyperText Transfer Protocol. 26–28, 39

ICT Information and Communication Technology. 1

IDE Integrated Development Environment. 13, 14, 18

JSON JavaScript Object Notation. 32–38

MVC Model View Controller. 9, 10, 28

NPM Node Package Manager. 16, 45

REST Representational State Transfer. 2, 3, 10, 11, 18, 19, 26–28, 31, 39, 42, 47

SOAP Simple Object Access Protocol. 11

SPA Single Page Application. 9

UML Unified Modeling Language. 21, 42

URI Uniform Resource Identifier. 27, 31

59

Page 70: Sviluppo test driven di un front-end con AngularJS
Page 71: Sviluppo test driven di un front-end con AngularJS

Bibliografia

Riferimenti bibliograficiAbout Atlassian – customers, life, community, FedEx days. Atlassian, 2012 (cit. a

p. 11).

James P. Womack, Daniel T. Jones. Lean Thinking, Second Editon. Simon & Schuster,Inc., 2010.

Roussey, Robert S. Board Briefing on IT Governance. IT Governance Institute, 2006.

Siti Web consultatiKanban Agile. url: http://kanbanblog.com/explained/ (cit. a p. 6).

Libreria Q di Kriskowal. url: https://github.com/kriskowal/q (cit. a p. 42).

Manifesto Agile. url: http://agilemanifesto.org/iso/it/ (cit. alle pp. 4, 5).

61