Posts
83
Comments
165
Trackbacks
11
December 2007 Blog Posts
[C#] Debuggare funzionalità a design-time

Creare Component e ExtenderProvider custom significa implementare funzionalità che forniscono comportamenti "ad-hoc" sia a design-time sia a run-time.
E' quindi necessario verificare che i comportamenti degli oggetti creati soddisfino le specifiche richieste in entrambe le modalità.

Per testare le funzionalità a run-time...nulla di nuovo: breakpoint nel codice e "press F5".
Per debuggare le funzionalità a design-time, invece, è necessario utilizzare una seconda istanza di Visual Studio per "hostare" l'istanza di Visual Studio che contiene il codice sorgente dei nostri "custom component" in modo tale da poter usufruire delle funzionalità del debugger anche a design-time.
Per fare questo bisogna seguire poche, semplici operazioni:

  • tasto destro del mouse sul progetto che contiene i nosti componenti custom e quindi 'Properties' e poi 'Debug'
  • impostare la 'Start Action' su 'Start External Program' e impostare le opzioni di avvio (Start Option) in modo tale che il parametro passato non sia altro che il path completo della nostra solution, come mostrato nell'immagine seguente:

 

Premendo F5, e quindi avviando l'applicazione in modalità debug, viene avviata una nuova istanza di Visual Studio, che altro non fa che caricare la nostra solution, contenente il codice da debuggare. Impostando breakpoint a destra e a manca ;-) abbiamo la possibilità di debuggare le funzionalità dei nostri componenti anche a design time.

Alla prossima...
-melkio-

posted @ Monday, December 17, 2007 5:10 AM | Feedback (0)
[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 @ Tuesday, December 4, 2007 10:18 PM | Feedback (0)