Slide e tutorial disponibili su https://e-l.unifi.it/course/view.php?id=2215
Obiettivi Formativi
Conoscenza e comprensione: Il corso ha lo scopo di insegnare tecniche basate sul test automatico dei programmi (Test-Driven Development) sotto vari aspetti: Unit Testing (testare un singolo componente), Integration Testing (testare più componenti insieme) e Functional Testing (testare l'interfaccia utente, sia essa un programma in esecuzione sul PC o un’interfaccia Web). I test rappresenteranno un meccanismo per sviluppare molto più velocemente anche i programmi più complessi, usando fin dall'inizio una metodologia che renderà i programmi modulari. I test daranno una misura della qualità del software prodotto e permetteranno di testarlo in modo automatico. Infine, i test possono essere visti come strumenti di specifica del comportamento del software.
Inoltre, saranno mostrati strumenti di versionamento del codice (git, sia in locale che distribuito su Internet, Github) e per la Build Automation dei programmi, cioè la compilazione automatica di tutta l'applicazione e l'esecuzione di tutti i test dell'applicazione. Questi saranno usati nel contesto della Continuous Integration, affidandosi a server dedicati (ad es., Jenkins) e disponibili anche nel cloud, in modo gratuito (ad es., Travis-CI). Tutti questi strumenti saranno "collegati" insieme, per avere un processo automatizzato di sviluppo che consente il continuo monitoraggio del codice sviluppato e facilita la release dei programmi (Continuous Delivery). In questo processo saranno utilizzati anche strumenti che analizzano il codice e rilevano eventuali problemi di qualità che riguardano la "pulizia" del codice. Tutto il processo è pensato per lo sviluppo “collaborativo”, cioè all’interno di un team di sviluppo.
Oltre agli strumenti gratuiti e open source e quelli disponibili sul cloud, useremo anche strumenti che virtualizzano l'ambiente e permettono una facile riproducibilità del contesto in cui eseguire i test dell'applicazione (ad es., Docker). Questi permetteranno anche di testare facilmente l'applicazione in più contesti (ad es., usando differenti versioni delle librerie e server di terze parti che sono utilizzati dalla nostra applicazione).
Durante tutto il corso ci affideremo a strumenti che incrementano la produttività, in primis useremo un IDE (Eclipse).
Capacità di applicare conoscenza e comprensione: Alla fine del corso gli studenti saranno in grado di sviluppare applicazioni guidate dai test e di scrivere test sotto i vari aspetti (unit test, integration test, functional test) e di metter su un meccanismo di Continuous Integration e Build Automation che tiene traccia dei vari test eseguiti e che analizza la qualità del codice.
Prerequisiti
Buona conoscenza di Java e programmazione a oggetti.
Metodi Didattici
lezioni in classe e qualche laboratorio
Altre Informazioni
Frequenza delle lezioni ed esercitazioni: raccomandata
Modalità di verifica apprendimento
La verifica finale consta di un progetto da svolgere a casa e da un esame orale.
Il progetto viene proposto dallo studente (o dal gruppo di studenti) e concordato col docente, utilizzando le tecniche mostrate durante il corso.
Il progetto è mirato a dimostrare le capacità di sviluppo guidato dai test, di testare ogni componente dell'applicazione, l'integrazione di vari componenti e l'applicazione finale.
L'orale consisterà nella discussione del progetto svolto e in varie domande su tutti i contenuti del corso.
Il voto finale terrà conto della qualità del progetto e delle risposte all'esame orale.
Programma del corso
Strumenti e tool: IDE, versionamento di codice con Git, Code review, Programmazione in Team, utilizzo di strumenti Cloud (Github), Continuous Integration (Jenkins e Travis), riproducibilità (macchine virtuali, Vagrant e Docker)
TDD: Unit Test, Integration e Function Test, BDD (Behavioral Driven Development) dalle specifiche all'implementazione, Code Coverage
Principi di Clean Code e buona programmazione, strumenti di analisi del codice e metriche (Sonarqube)