Introduzione al TDD. Test Driven Development: Quando, Come, Perchè Facoltà di Ingegneria Pavia 27 Novembre 2015. Marco Fracassi Roberto Grandi



Documenti analoghi
Test Driven Development e Pair Programming

Poca documentazione: uso di Story Card e CRC (Class Responsibility Collabor) Collaborazione con il cliente rispetto alla negoziazione dei contratti

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

IL MIO PRIMO SITO: NEWS

Realizzazione di una classe con un associazione

Esercizi su. Funzioni

Ingegneria del Software

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0)

Obiettivi dell esercitazione. Requisiti (cont.) Requisiti. Università di Roma La Sapienza A.A Facoltà di Ingegneria Sede di Latina

Gestione dello sviluppo software Modelli Agili

PROMUOVERSI MEDIANTE INTERNET di Riccardo Polesel. 1. Promuovere il vostro business: scrivere e gestire i contenuti online» 15

AOP Static Code Programming

AURORA LUCA MARTINA GIANLUCA

La progettazione dell interfaccia HCI. Fabio Vitali

PROVA FINALE V. AULETTA G. PERSIANO ALGORITMI II - -MAGIS INFO

Supermarket Progetto di Programmazione Febbraio 2010

Piano di gestione della qualità

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

ELABORATI FLORIO elenco correzioni con note e commento

OPERATORE SPORTIVO CON DISABILI: COSA FAI? CHI SEI?

15 volte più veloce. per ridurre TCO e time-to-market

Esercitazione n.2 Inferenza su medie

Eclipse e Subversion

LANCIAMO UN DADO PER DECIDERE CHI DEVE INIZIARE IL GIOCO. PARTIRA IL NUMERO PIU ALTO

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

IDENTIFICAZIONE DEI BISOGNI DEL CLIENTE

Esame dell 8 settembre 2012

PROGETTARE UNA GITA. A tale scopo i bambini dovranno ricercare la documentazione che permetta di scegliere la META della gita.

Interesse, sconto, ratei e risconti

La somma. Esempio: Il prodotto. Esempio:

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Ottimizzazione Multi Obiettivo

Notiziario n. 129/2009 Prot. 209/2009 del 10/04/2009

La qualità della comunicazione web

Prestazioni CPU Corso di Calcolatori Elettronici A 2007/2008 Sito Web: Prof. G. Quarella prof@quarella.

introduzione al corso di ingegneria del software

Metodologie Agili per lo sviluppo di applicazioni Internet Distribuite. Agile Group DIEE, Università di Cagliari

Esercitazione 23 maggio 2016

Ricorsione. (da lucidi di Marco Benedetti)

Mantenere il piano. Il piano guida il lavoro permettendo di misurare il progresso

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Appunti sulla Macchina di Turing. Macchina di Turing

Modulo 4: Ereditarietà, interfacce e clonazione

Corso di formazione CerTICTablet

Interesse, sconto, ratei e risconti

Ciao, intanto grazie per essere arrivato/a fin qui.

Progettazione : Design Pattern Creazionali

Gestione del conflitto o della negoziazione

Appunti di Interazione Uomo Macchina Principi di progettazione per il web I wireframe

Gestione ed analisi di base dati nell epidemiologia. delle malattie infettive

Misure finanziarie del rendimento: il Van

Riscaldamento (10 minuti) Vocabolario (25 minuti circa) Web e siti internet vocabolario di base moryama

Design patterns in Java

Svigruppo. Monga. Svigruppo. Monga

Sviluppo software in gruppi di lavoro complessi 1

Misure finanziarie del rendimento: il Van

2. Simulazione discreta: approcci alla simulazione

Report statistico 2015sulla sezione Amministrazione Trasparente della Provincia di Padova. dr. Cosma Sonego Ufficio Provinciale di Statistica

Test di unità con JUnit4

CHE COS È L INFORMATICA

gl i n A pp u mini-manuale operativo Compilazione dei Menù & Gestione Articoli

REGOLE PER L ESAME (agg.te settembre 2015)

Manuale per i redattori del sito web OttoInforma

Metodi Computazionali

LA TRASMISSIONE DELLE INFORMAZIONI QUARTA PARTE 1

Osservatorio SosTariffe.it Telefonia Mobile

Introduzione alla programmazione Java. Dott. Ing. M. Banci, PhD

FH-SY capitolo Versione 3 - FH-SY.NET - FAQ -

regola(1,[e,f],b) regola(2,[m,f],e) regola(3,[m],f) regola(4,[b,f],g) regola(5,[b,g],c) regola(6,[g,q],a)

Dispositivi di Interfaccia Problemi e Soluzioni

Un metodo per il rilevamento degli errori: la tecnica del Bit di Parità

Introduzione al MATLAB c Parte 2

Password sicura. Guida per gli operatori delle associazioni di categoria

INSERIMENTO DATI BASILARI

Le basi della Partita Doppia in parole Facile e comprensibile. Ovviamente gratis.

Introduzione a Dev-C++

e-dva - eni-depth Velocity Analysis

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

Seconda Università di Napoli AA. 2012/2013 Facoltà di Economia. ECONOMIA INDUSTRIALE Prof. Roberto Basile

Discrepancy between objective and subjective measures of job stress and sickness absence

SCHEDA DI RECUPERO SUI NUMERI RELATIVI

Installazione e Configurazione della strumentazione necessaria. Antonio Gallo info@laboratoriolibero.com

Alessandro Ricci Psicologo Psicoterapeuta Università Salesiana di Roma

Laboratorio di Progettazione di Sistemi Software Introduzione

Come realizzare i disegni in Autocad partendo da un immagine

AUTOREGOLAZIONE PER IL COMPITO

da 2 a 5 giocatori, dai 10 anni in su, durata 30 minuti

Database. Si ringrazia Marco Bertini per le slides

MagnacartaNord Consigli per far rendere al meglio la Magna Carta nel Tuo negozio

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

IT Questionario per formatori di insegnanti di lingue Analisi dei dati

SISTEMA di GESTIONE QUALITÀ Non Conformità ed Efficacia delle Azioni Correttive Preventive

Forma giuridica dell impresa

La lezione frontale. Tortona 04/04/2012. Organizzare un corso di formazione nell ASL AL - M. Crotti. La lezione frontale

Linux nella scuola...proviamo!

Tecnologia e Applicazioni Internet 2009/10

Introduzione alla programmazione in C

Università di Roma La Sapienza, Facoltà di Ingegneria

Transcript:

Introduzione al TDD Test Driven Development: Quando, Come, Perchè Facoltà di Ingegneria Pavia 27 Novembre 2015 Marco Fracassi Roberto Grandi

Chi siamo? 8 team sviluppo in 7Pixel: Nautilus Nimbus -> Marco Antani Iguana Analytics & BI -> Roberto Ninja Antani ios

Cosa facciamo Marketplace Motore di comparazione prezzi Italia Motore di comparazione prezzi Spagna

Agenda Parte I SW Engineering TDD: perché lo facciamo e cos'è Refactoring Simple Design Strumenti Esempio Parte II Pair Progamming Esercitazione

Domande? Sono ben accette! Sentitevi liberi di interrompere :) Non siate timidi

SW Engineering - Whaterfall

SW Engineering - Whaterfall

SW Engineering - Incrementale/Iterativo

Perché fare TDD Perché permette: Design evolutivo del codice Focus su un unico aspetto utile Sicurezza sul codice di produzione Documentazione sempre aggiornata Esprimere creatività Dare un ritmo allo sviluppo

Cos'è il TDD

Le 3 regole del TDD Se voglio fare TDD devo rispettare le seguenti regole Non scrivere codice di produzione prima di aver scritto un test rosso Non scrivere più di un test che fallisce, un errore di compilazione è come un fallimento Non scrivere più codice di produzione di quello necessario per far passare il test correntemente rosso

Come scrivo i test Le 3A dei test Arrange Act Assert

Come scrivo i test - Esempio BankAccount account = new BankAccount().WithBalance(10); account.addmoney(10); assertequals(20, account.getbalance());

Come scrivo i test - Esempio Con quale test partire? Happy Path: il caso più semplice/favorevole che porta maggior valore Boundaries Condition: i casi limite

Come scrivo i test - Esempio Boundaries BankAccount account = new BankAccount().WithBalance(10); account.addmoney(0); assertthat("balance must be 0", account.getbalance(), is(0));.... account.addmoney(null); assertthrown(account.getbalance());

Cos'è il Refactoring " is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior" l'esecuzione di azioni di ristrutturazione del codice volte a migliorarne la struttura interna, abbassandone la complessità senza modificarne le funzionalità Si basa su una serie di piccole trasformazioni che presevano il comportamento; ogni trasformazione (refactoring) è limitata, ma una sequenza di queste può portare ad una significativa ristrutturazione. Poichè ogni trasformazione è limitata è poco verosimile abbia un impatto negativo ed elevato: è controllabile Dopo ogni refactoring, grazie ai test soprattutto, il software mantiene inalterate le funzionalità per definizione (se avviamo fatto un refactoring) Si ridice la possibilità di introdurre errori nel software durante le ristrutturazioni del codice

Benefici del Refactoring Non far degradare il design del SW Eliminare codice duplicato (!!!) Rendere il codice più facile da comprendere (a me e ai miei colleghi) Trovare Bug Velocizzare lo sviluppo

Smell Da dove parto a fare refactoring? Dai Code Smell! insieme di caratteristiche che il codice sorgente può avere e che sono generalmente riconosciute come probabili indicazioni di un difetto di programmazione Non sono bug! (il software funziona correttamente) Sono "debolezze" del codice che ne riducono la qualità

Smell Elenco dei principali smells: Codice duplicato ("Don't Repeat Yourself" - DRY) Metodo troppo lungo Commenti Classe troppo grande Lista di parametri troppo lunga Feature envy Switch Dead code Generalità speculativa ("You Aren't Gonna Need It" o YAGNI) Ecc...

Mosse Extract method Extract class Rename Replace temp with query Move method Decompose conditionals Introduce Parameter Object Preserve Whole Object Substitute Algorithm

Replace Conditional with Polymorphism double getspeed() { switch (_type) { case EUROPEAN: return getbasespeed(); case AFRICAN: return getbasespeed() - getloadfactor() * _numberofcoconuts; case NORWEGIAN_BLUE: return (_isnailed)? 0 : getbasespeed(_voltage); } throw new RuntimeException ("Should be unreachable"); }

Replace Conditional with Polymorphism

Simple design Tutti i test sono verdi Non c'è duplicazione L'intento del programmatore è espresso chiaramente Il numero di classi e metodi è minimo

Cos'è la duplicazione Codice duplicato Logica duplicata Algoritmi interscambiabili

Test Test... sono tutti uguali? Unit Test Integration Test Acceptance Test.. Regression Test Smoke Test

Come dovrebbe essere un test? Veloce Ripetibile Isolato (dagli altri test) Isolato (dal codice di produzione) Rifattorizzato...non è codice di serie B Non distruttivo Self verified Timely

Test Gli strumenti del mestiere Un sistema di versionamento: Git o Svn Un ambiente di sviluppo: NetBeans o Eclipse Un Test Framework: JUnit

Esempio Obiettivo Vogliamo costruire una calcolatrice in grado di sommare i numeri presenti una stringa di testo La stringa può avere più numeri separati dalla virgola Se non ho numeri voglio ottenere 0.ho dimenticato qualcosa?

Esempio - String Calculator 1 @Test public void ParseOneNumber() { Calculator calculator = new Calculator(); } int result = calculator.parse("1"); assertthat(result, is(1)); @Test public void ParseTwoNumbers() { Calculator calculator = new Calculator(); } int result = calculator.parse("1,2"); assertthat(result, is(3));

Esempio - String Calculator 2 @Test public void ParseManyNumbers() { Calculator calculator = new Calculator(); } int result = calculator.parse("1,2,3,4"); assertthat(result, is(10)); @Test public void ParseEmptyString() { Calculator calculator = new Calculator(); } int result = calculator.parse(""); assertthat(result, is(0));

Esempio - String Calculator 3 @Test public void ParseNotANumberWithNumber() { Calculator calculator = new Calculator(); } int result = calculator.parse("1,abc"); assertthat(result, is(1)); @Test public void ParseNotANumber() { Calculator calculator = new Calculator(); } int result = calculator.parse("a,abc"); assertthat(result, is(0));

Pair Programming

Pair Programming Regole per un buon rapporto... di coppia Non interrompere Suggerire Appuntarsi i problemi emersi - checklist

I ruoli Pilota Ha mouse e tastiera Scrive il codice e i test Ha una visione di breve periodo Navigatore Ha una todo-list Appunta i test mancanti Appunta refactoring possibili Ha una visione di lungo periodo Anche il miglior pilota ha bisogno di riposo Anche il miglior navigatore vuole adrenalina

Riferimenti Martin Fowler et al. (1999), Refactoring: Improving the Design of Existing Code, Addison-Wesley Robert C. Martin (2008), Clean Code: A Handbook of Agile Software Craftsmanship, Prentice Hall Kent Beck (2000), Extreme Programming Explained: Embrace Change, 2nd Edition, Addison-Wesley

Riferimenti marco.fracassi@trovaprezzi.it roberto.grandi@trovaprezzi.it cv@trovaprezzi.it

Esercitazione Vogliamo costruire un carrello della spesa, in cui a partire da un insieme di prodotti di cui conosciamo (almeno) categoria prezzo vogliamo calcolarne il totale e stamparne una ricevuta/scontrino

Use Case 1: calcolo del totale Dato un carrello cosi fatto: alimentari, 10 euro alimentari, 20 euro DVD, 8 euro Il totale del carrello deve essere 38

Use Case 2: DVD scontati Tutti i prodotti nella categoria DVD hanno uno sconto del 10 % Dato un carrello cosi fatto: alimentari, 10 euro DVD, 10 euro Il totale del carrello deve essere 19

Use case 3: Più categorie scontate Tutti i prodotti nella categoria DVD hanno uno sconto del 10 % Tutti i prodotti nella categoria alimentari hanno uno sconto del 20 % Dato un carrello cosi fatto alimentari, 10 euro DVD, 10 euro farmacia, 10 euro Il totale del carrello deve essere 27

Use case 4: Stampa scontrino Tutti i DVD hanno uno sconto del 10 % Tutti gli alimentari hanno uno sconto del 20 % Dato un carrello cosi fatto: alimentari, 10 euro DVD, 10 euro farmacia, 10euro (il totale dello scontrino deve essere 27) La stampa dello scontrino deve contenere le seguenti stringhe assertthat(., containsstring("alimentari:10")) assertthat(.., containsstring("dvd:9")) assertthat(., containsstring("farmacia:8")) assertthat(.., containsstring("totale:27"))

Use case 5: stampa scontrino raggruppato Tutti i DVD hanno uno sconto del 10 % Tutti gli alimentari hanno uno sconto del 20 % Dato un carrello cosi fatto alimentari, 10 euro alimentari, 30 euro DVD, 10 euro DVD, 20 euro farmacia, 10 euro (il totale dello scontrino deve essere 69) La stampa dello scontrino deve contenere le seguenti stringhe assertthat(., containsstring("alimentari:32")) assertthat(., containsstring("dvd:27")) assertthat(., containsstring("farmacia:10")) assertthat(., containsstring("totale:69"))