In ingegneria del software, per unit testing (testing d'unità o testing unitario[1]) si intende l'attività di testing[2] (prova, collaudo) di singole unità software. Per unità si intende normalmente il minimo componente di un programma dotato di funzionamento autonomo; a seconda del paradigma di programmazione o linguaggio di programmazione, questo può corrispondere per esempio a una singola funzione nella programmazione procedurale, o una singola classe o un singolo metodo nella programmazione a oggetti.Lo UT è utile nello sviluppo permette di controllare classi, function module e programmi
Lo unit testing viene normalmente eseguito dagli sviluppatori.... [fonte wikipedia]
Qual'è la logica che è alla base? Scrivi un metodo in una classe che riceve in input un parametro e restituisce un output.
A seconda del metodo l'output deve può contenere determinati valori. Se fai a mano questo controllo devi andare sempre in debug e controllare pezzo a pezzo. Mamma mia che lungo
Invece lo UT fa il controllo per te: passa in input il parametro e controlla che l'output sia corretto. E ad ogni modifica, rilanciando gli unit tests ti accorgi subito se ci sono errori.
Ora un esempio di come implementare una classe di test in una classe standard.
L'implementazione dello unit test è semplificata da un generatore di uni test
Le fasi sono semplici: selezione classe globale; creazione della classe locale di test e selezione dei metodi da testare; generazione. Ecco le immagini in sequenza
Completata la generazione della classe di test, ritrovi la classe di test come classe locale della standard
Dopo averla generata che si fà? Il generatore crea già del codice.
All'interno della classe di test, la classe di test genera un oggetto della classe standard e ne richiama i singoli metodi.
Per determinare l'ouput di un metodo è corretto o meno è necessario modificare la classe di test inserendo il codice di controllo dell'output.
Ecco un semplice esempio.
Ho costruito una classe che formatta un record con una serie di valori. In quanto il record ha una lunghezza fissa, indipendentemente dai valori, ho creato una classe di test che non solo controlla l'inserimento dei valori, alcuni sono obbligatori e altri no, ma ne controlla anche la lunghezza. Nel metodo di test del controllo lunghezza ho inserito questo codice:
DATA: _record TYPE string,
_len TYPE i.
_record = f_cut->get_record( ).
_len = strlen( _record ).
DATA _bool TYPE abap_bool.
CALL METHOD cl_abap_unit_assert=>assert_equals
EXPORTING
act = _len
exp = 165
* ignore_hash_sequence = ABAP_FALSE
* tol =
msg = 'lunghezza record non rispettata'
* level = IF_AUNIT_CONSTANTS=>CRITICAL
* quit = IF_AUNIT_CONSTANTS=>METHOD
.
ENDMETHOD.
in questo codice di esempio recupero il record formattato "f_cut-_>get_record()"; calcolo la lunghezza; controllo la lunghezza fissa 165 tramite il metodo "cl_abap_unit_assert=>assert_equals"
La classe helper "cl_abap_unit_assert" contiene una serie di metodi per effettuare degli assert sui valori di output
Eseguendo i test ecco il controllo della classe:
ecco il risultato dei tests:
Naturalmente se ci sono semafori rossi c'è qualcosa che non va. I tests devono dare sempre semafori verdi.
Il caso del semaforo rosso è dato da: o codice errato della classe standard o il codice del test non corretto. Se il codice del test deve testare che il metodo dia errore in presenza di valori, allora il è necessario implementare un try.. catch e nel catch restituire true.
La documentazione ufficiale contiene tutte le informazioni
L'esecuzione dei test avviene con questa sequenza:
Commenti
Posta un commento