Posts
83
Comments
165
Trackbacks
11
[MbUnit] CombinatorialTest & TupleValidatorMethod

Da un po', su suggerimento di Claudio, ho migrato dal pur utile NUnit al sempre più indispensabile MbUnit.
Non che NUnit non soddisfasse le mie necessità, ma solamente utilizzando MbUnit mi sono accorto quante feature utili mette a disposizione questo framework di test, permettendomi di scrivere molte meno righe di codice.

Per fare un esempio, quando sto testando che il setting di una proprietà di una mia classe, che accetta come "parametro di input" un enumerativo  faccia quello che deve, a rigor di logica e soprattutto per completezza dovrei testare che per ogni valore possibile dell'enumerativo, il test sia 'Passed'.
Perfetto!!! MbUnit fornisce un attributo, CombinatorialTest appunto, che, a fronte di un unico metodo, esegue ricorsivamente il test per tutti i valori dell'enumerativo (o di una factory costruita ad-hoc) in questione.

Nell' esempio precedente, il metodo di test 'TestMyEnumProperty' viene eseguito quattro volte, una per ogni valore dell'enumerativo.
Questo approccio, oltre a permettermi di scrivere in un unico metodo il test di tutti i valori, mi solleva dalla preoccupazione di mantenere allineata la mia batteria di test qualora aggiungessi o togliessi possibili valori all'enumerativo.

Utilizzando l'esempio precedente, immaginiamo di voler eseguire il test per tutti i valori dell'enumerativo, tranne che per il valore 'None'...nessun problema, MbUnit fornisce un attributo, TupleValidatorMethod, che permette di filtrare i valori secondo una logica personalizzata.
Ecco come si utilizza:

Basta "istruire" l'attributo CombinatoriaTest del fatto che prima di eseguire i test con ogni valore dell'enumerativo deve eseguire un metodo che estrae/filtra quali valori soddisfano le mie aspettative e quali, invece, no.
Il metodo "FilterNonValue" ha una firma specifica:

  • il parametro di input deve essere dello stesso tipo del parametro che viene passato al metodo di test (nel nostro caso MyEnum)
  • il tipo di ritorno deve essere un Boolean

Prima di eseguire i test, ognuno con il valore specifico dell'enumerativo, la lista di possibili valori viene filtrata attraverso il metodo FilterNoneValue, che contiene la nostra logica di "acceptance value". Solo i valori che soddisfano tale logica (il metodo FilterNoneValue ritorna, quindi, true) vengono effettivamente passati al test.

Nel nostro caso, il test (TestMyEnumProperty), che prima veniva eseguito quattro volte, ora verrà eseguito solamente tre volte con i valori 'Value1', 'Value2' e 'Value3'.

 

Insomma +1 per MbUnit!

posted on mercoledì 5 dicembre 2007 00:18 Print