Quando sviluppiamo un'applicazione, specie di medie o grandi dimensioni, vogliamo ridurre al minimo la possibilità di avere bug nel codice. Inoltre vogliamo evitare che una modifica, intacchi le funzionalità già testate e di cui è stato verificato il corretto funzionamento.
Per ottenere questi risultati è importante prevedere una fase di test durante il processo di sviluppo del software.
Le metodologie tradizionali prevedono la fase di test alla fine del ciclo di sviluppo, quando il software è già realizzato. Le metodologie agili, in particolare eXtreme Programming, prevedono che la fase di test sia realizzata prima dello sviluppo del codice: questa tecnica è chiamata Test Driven Development e, per quanto possa sembrare bizzarra, permette di ridurre significativamente il numero di bug presenti nel nostro codice.
Al di là della metodologia utilizzata, è buona pratica testare le nostre applicazioni ed è ancora meglio se i test possono essere lanciati automaticamente. Esistono molti framework per la creazione e l'esecuzione dei test: il padre di tutti gli ambienti di test è Junit realizzato per Java. Per Flex, invece, abbiamo a disposizione FlexUnit, sviluppato da Adobe come progetto open source.
Miniglossario dello Unit Testing
Prima di iniziare a sviluppare i test per una nostra applicazione, è bene chiarire il significato di alcuni termini.
| Termine | Descrizione |
|---|---|
| Test case | è un insieme di asserzioni che verificano il corretto funzionamento di un'operazione. Consiste nel controllare il corretto output di una funzione o di un metodo, per input noti |
| Test Suite | è un insieme di test case e viene utilizzata per testare un programma o un insieme di funzionalità. Può contenere, se necessario, opzioni di configurazione del programma da testare, in modo che i test possano essere eseguiti simulando in maniera completa il funzionamento dell'applicazione |
| Code coverage | è una pratica di testing e indica il grado con cui il codice sorgente della nostra applicazione è coperto dai test |
Creare un'applicazione per eseguire i test
FlexUnit è un framework per unit testing per ActionScript 3.0 e Flex e permette di eseguire i test attraverso un test runner grafico.
Per utilizzare FlexUnit, dobbiamo creare un'applicazione dedicata all'esecuzione dei test: l'applicazione deve sfruttare un component di tipo TestRunnerBase per l'esecuzione dei test unitari.
Abbiamo bisogno della libreria FlexUnit.swc, reperibile alla sezione download del sito del progetto. Una volta scaricata la libreria, dobbiamo includerla nel nostro progetto aggiungendola al "library path".
Su Flash Builder 4 l'inserimento della libreria è automatizzato grazie al bottone "FlexUnit Test" che troviamo all'interno del menu di debug, nella barra degli strumenti.
In questo caso utilizziamo però la versione 4.0 del framework per i test, ancora in versione RC nel momento in cui scriviamo, mentre in questo articolo utilizzeremo la 0.9, che invece è stabile. I concetti sono comunque sovrapponibili.
A questo punto, possiamo costruire l'applicazione per l'esecuzione dei test. Tra i "custom components" dobbiamo individuare il component TestRunnerBase e trascinarlo in modo visuale sullo stage, che conterrà dell'applicazione per i test. Bisogna dare un nome all'applicazione di test e lo facciamo scrivendolo nella proprietà id del componente (nel nostro esempio "test_app").
Lanciamo l'applicazione. Apparirà un'interfaccia simile a quella mostrata nella seguente figura:
Il component TestRunnerBase deve essere inizializzato per eseguire un insieme di test. Di seguito è riportato il codice che inizializza l'applicazione per i test.
Allo scatenarsi dell'evento creationComplete
onCreationComplete
TestSuite
TestRunnerBase
Creare un TestCase
Supponiamo di aver creato, nel nostro progetto, una classe semplicissima MathOperation che implementa le quattro operazioni fondamentali della matematica (somma, differenza, moltiplicazione, divisione) e che vogliamo testarne il funzionamento.
Di seguito è riportato il codice della classe MathOperation
Per scrivere lo unit test della classe MathOperation
TestCase
MathOperationTest
i metodi per il test
MathOperationTest
test
TestSuite
Per il momento, decidiamo di scrivere il test solo per il metodo add()
MathOperationTest
package
{
import flexunit.framework.TestCase;
public class MathOperationTest extends TestCase
{
public function testAdd():void {
var math:MathOperation = new MathOperation();
assertEquals(4, math.add(1, 3));
assertEquals(10, math.add(7, 3));
}
}
}
Il test vero e proprio del metodo add()
assertEquals()
Le asserzioni più importanti
| Asserzione | Descrizione |
|---|---|
| assertEquals | controlla che il valore resistuito dal metodo sia uguale al valore atteso (simile all'operatore ==
|
| assertStrictlyEquals | controlla che il valore resistuito dal metodo sia uguale al valore atteso e dello stesso tipo (simile all'operatore ===
|
| assertTrue | controlla che la condizione sia true
|
| assertFalse | controlla che la condizione sia false
|
| assertNull | controlla che il risultato del metodo sia null
|