# FitNesse

FitNesse è un server web su interfaccia wiki per facilitare la fase di test e verifica nello sviluppo del software in vari linguaggi di programmazione.
Esso è basato sul Framework for Integrated Test, strumento a sorgente aperto per eseguire in proprio e automatizzare test del codice, sviluppato da Ward Cunningham, ed è progettato sia per eseguire acceptance test (in cui il buon fine del collaudo e l'accettazione del prodotto da parte del cliente finale, è condizione di un pagamento contrattuale e di un passaggio di proprietà), così come per l’unit testing di singole unità software, in cui facilita una descrizione dettagliata e leggibile del funzionamento del sistema.
FitNesse permette agli utenti anche non esperti di un sistema di inserire un input in un formato speciale, accessibile anche ai non-programmatori. Questo input viene interpretato da FitNesse e i test sono creati automaticamente, eseguiti e il risultato viene mostrato all'utente, in tempi estremamente rapidi. Lo sviluppatore del sistema da testare necessita di un certo supporto, per le cosiddette fixtures.
FitNesse è scritto in Java (da Robert Cecil Martin e altri). Il programma inizialmente supportava solamente Java, ma nel tempo sono state aggiunte diverse altre versioni per altri linguaggi di programmazione (C++, Ruby, Delphi, C#, ecc.).

## Principi di FitNesse
### FitNesse come metodo di test

FitNesse era stato inizialmente progettato come un'interfaccia altamente usabile nell'ambito della famiglia di FitNesse. La sua intenzione era quella di supportare una metodologia agile di black-box testing, vale a dire un collaudo finale del software, senza conoscere ed entrare nel dettaglio della sua composizione, che si conclude con una accettazione o un rifiuto. In questo tipo di approccio, i collaudatori funzionali collaborano con i programmatori software per sviluppare uno strumento di testing dedicato.
Il collaudatore funzionale è responsabile di progettare i test dal punto di vista funzionale (output che si ottiene in risposta a un certo input) e di implementarli in FitNesse, mentre lo sviluppatore software ha il compito di connettere lo strumento di testing di FitNesse col sistema sotto esame, in modo tale che FitNesse possa eseguire il test e comparare il risultato ottenuto con quello atteso.
L'idea sottostante descritta nel libro Fit for Developing Software è la seguente: una collaborazione forzata fra sviluppatori e tester migliorerà la comprensione reciproca del funzionamento del sistema e la definizione dei requisiti, costringendo due gruppi a organizzarsi in un linguaggio comune, mentre imparano a comunicare insieme.

### FitNesse come uno strumento di testing

I test funzionali in FitNesse sono descritti come una sorta di coppia di input e output. Queste coppie sono espresse graficamente mediante una tabella di decisione (n campi con i valori per ogni variabile di input, e una colonna per l'azione decisa risultante). FitNesse supporta numerose di queste tabelle, spaziando da tabelle in cui la decisione è un campo testuale, a tabelle che eseguono query verso altre tabelle che eseguono degli script di verifica. La forma più generale è una tabella completamente vuota che può essere interpretata a piacere dal progettista. Tutti i test comunque sono espressi in un qualche tipo di tabella.
FitNesse focalizza tester e sviluppatori nella creazione di test di qualità, senza perdersi nel meccanismo di questi test, perché: creazione agevole di tabelle, traduzione delle tabelle in chiamate al sistema sotto test, documentazione facile e flessibile dei test. A tale scopo, FitNesse si avvale di wiki che notoriamente consente una rapida creazione di pagine HTML e l'espressione di tabelle di qualsiasi genere, evitando che il loro contenuto resti meramente testuale, e nello stesso tempo viene limitato a contenuto di tipo alfanumerico che facilmente può essere mappato all'interno della chiamata a un blocco di software. La tabella di testing viene scritta in una pagina wiki, permettendo al tester funzionale di includere facilmente testo descrittivo (non codice di programmazione).

### FitNesse come uno strumento software

FitNesse è scritto in Java e viene scaricato come un singolo file eseguibile in formato .jar. L'eseguibile comprende un motore wiki, un server web non visibile all'utente, lo strumento di testing e tutte le risorse (immagini, linguaggio di markup come HTML o XHTML che contiene la semantica della pagina web, separato dal linguaggio -non presente - che definisce come si visualizza il report finale, quale CSS o XLST; ecc.) richiesti per creare un sito web nello stile proprio di FitNesse.
Durante l'esecuzione, FitNesse lancia un server web interno, che mostra le pagine testate sia in locale sul computer, sia su Internet, e può girare ugualmente su un laptop oppure su una macchina server vera e propria.
Dopo aver lanciato il web server, FitNesse apre il proprio motore wiki su tale server. Questo motore wiki è di nuovo caratterizzato dalla semplicità, nel senso che non richiede un database sottostante per funzionare, semplicemente crea una collezione di pagine wiki (navigabili offline) che sono interpretate dal motore wiki e mostrate dal server interno. Il Wiki creato automaticamente da FitNesse include il manuale utente e vari esempi. La cartella in cui sono salvati i documenti, è creata con tutto ciò che è necessario per poter pubblicare una pagina Wiki secondo lo stile di FitNesse. Ciò significa che tutte le immagini, fogli di stile, file JavaScript, ecc., sono creati tutti insieme nella cartella dove si trova la pagina wiki iniziale.
Il motore Wiki è minimale, ma offre tutte le funzionalità di base dei motori wiki: motore di ricerca interni e per il Web, cronologia delle modifiche di ogni pagina, e un indice del file, oltre ad alcune funzionalità che permettono di cancellare, spostare o rinominare singoli file. Il motore di ricerca presenta strumenti dedicati all'esecuzione dei test, come un bottone per lanciare l'esecuzione, modalità per creare pagine di test personalizzate per l'utente, e confronto dei risultati per analisi delle serie storiche e identificazione di eventuali trend. Infine, presenta alcune secondarie funzionalità per bloccare singole pagine, o rendere sicuro l'accesso al Wiki.

### Esecuzione del test

L'esecuzione dei test coinvolge quattro componenti di FitNesse:
* la pagina Wiki che esprime il test come una tabella di decisione;
* un motore per i test, che interpreta la pagina Wiki;
* una text fixture, che è chiamata dal motore che esegue il test, e che a sua volta chiama il sistema oggetto del test;
* il sistema che deve essere testato.
Il team di sviluppatori realizza due di questi componenti: la pagina wiki e il fixture (più precisamente, produce anche il sistema sotto test, ma dal punto di vista del black-box testing produce solo due componenti). La pagina Wiki comprende alcuni tipi di tabelle di decisione che permettono di esprimere il test. Per esempio, la pagina Wiki può descrivere il test per un componente (software o elettronico) che esegue delle divisioni:
| Division component test |
| !numerator value | denominator value | result? |
| 10 | 2 | 5.0 |
| 10 | 5 | 2.0 |
| 5 | 2 | 2.5 |
Il collegamento fra il motore di testing generico e il sistema oggetto di test, è realizzato da un blocco di codice Java, chiamato fixture. In questo esempio, lo pseudo-codice relativo alla tabella di decisione soprastante, è il seguente:
L'associazione fra la pagina Wiki e il codice detto fixture avviene tramite una mappatura con semplice notazione a cammello. Questa mappatura si applica per tutte le intestazioni di tabella (e colonna), e serve a identificare il nome della classe di fixture (es. Division component test) e dei suoi metodi (num e denom).
Il codice in esame:
* dichiara il tipo double delle variabili "numerator", "denominator", "result";
* chiama le prime due (copia) dalla tabella di decisione;
* li assegna a due variabili (locali) dello stesso tipo double, di nome "num" e "denom";
* li passa come input al sistema sotto test visto come una generica funzione *.divide, senza guardare come viene svolto il calcolo;
* il sistema calcola la divisione, e restituisce un valore reale;
* il codice fixture lo assegna (copia) alla variabile "result".
Una intestazione di colonna che termina con un punto interrogativo (es. Result? ) viene interpretato come un valore che deve essere letto (restituito) dalla fixture, mentre le altre intestazioni sono interpretate come input per il codice fixture. Le intestazioni di colonna della tabella di decisione sono altrettanti metodi della fixture, letti in ordine da sinistra a destra.

### Motori di testing

La mappatura attuale sopra descritta (così come la chiamata dei metodi della fixture), è svolta da un motore di testing. FitNesse supporta due tipi di questi motori di testing: il motore FIT e il motore SLIM.

#### FIT

FIT è il motore di testing intorno al quale FitNesse si è sviluppato inizialmente. Col tempo è divenuto molto di più di un motore di testing, è un framework metodologico per il testing, completo di funzionalità per l'invocazione dei test, interpretare le pagine wiki, e generare le pagine di output.

#### SLIM

SLIM (Simply List Invocatiin Method) è un'alternativa a FIT, cui negli ultimi anni è migrato lo stesso team di sviluppatori di FitNesse. Il motore SLIM è una implementazione del protocollo Slim. Invece di combinare tutti gli elementi di una pagina wiki per il testing, il motore SLIM si concentra invece sulla chiamata del codice fixture; esso si comporta come un server separato che viene chiamato da remoto dal motore Wiki di FitNesse. L'interpretazione della pagina wiki e la generazione della pagina di risultato ora sono attività demandate al motore Wiki.
In questo modo, il codice Java della fixture viene semplificato al livello di un Plain Old Java Object. Questo tipo di fixture non richiede nessun tipo di utilizzo o di estensioni delle classi, cosa che semplifica e permette di focalizzare la progettazione del codice sulle chiamate del sistema sotto test nel modo più appropriato e semplice possibile. Esso inoltre consente l'ereditarietà, permettendo agli sviluppatori la creazione di gerarchie di fixture, dove necessario.