.
Spike: Acceptance Test
21/06/2006 Matteo, ?mi spiace non mi ricordo come ti chiami?
3 pomodori
L'acceptance test per la prima storia ora sono completi. Abbiamo modificato dietro le quinte il comportamento del test, che finora era verde perché non testava veramente il comportamento dell'applicazione. Ora va a chiamare API che ancora non esistono, e interroga direttamente la servlet. Il risultato è che ora il test è rosso (3 su 3). Per evitare di dare fastidio negli unit test, che devono sempre essere verdi, abbiamo creato una nuova source directory e spostato lì i test. Cosa resta da fare:
- integrare gli acceptance test in ant
- fare i test per l'altra storia, inserimento news
11/05/2006 Matteo, Giannandrea
3 pomodori
Siamo andati avanti ad estendere la classe HtmlChecker scrivendo degli ipotetici AT in NewsPageAcceptanceTest che la utilizzando. Per ora abbiamo implementato i seguenti metodi:
- boolean existsElementWithClass(String elementClass)
- boolean existsElementWithClassAndContent(String elementClass, String value)
- boolean existsElementWithClassAndContent(String ancestorClass, String elementClass, String value)
- List getElementContents(String elementClass)
- NodeList getElementsWithClass(String elementClass)
- int getNumberOfElementsWithClass(String elementClass)
Mentre scrivo ho la sensazione che si possano rendera ancora piu' speaking ;-).
25/04/2006 Matteo, Gabriele
2 pomodori
Abbiamo sperimentato un ping-pong. Abbiamo affinato la classe HtmlChecker che permette di verificare se un certo doc XML contiene elementi con le caratteristiche desiderate.
<div class='news' id='milanoxpug-20060327-2'>
<p class='title'>Abbiamo le news!</p>
<p class='insertion-date'>27 marzo 2006</p>
<div class='text'>
Era ora. Quanto cavolo di tempo ci avete messo?!?
</div>
</div>
Il ping-pong è stato molto divertente, anche perché all'inizio io (Matteo) stavo per partire per la tangente con passi troppo grossi; ma poi mi sono ricordato che si deve fare il minimo per passare il test, e così facendo abbiamo ottenuto del codice che secondo me è abbastanza ben fatto. E ci siamo pure divertiti! L'obiettivo è poter prendere un test scritto in italiano, tipo IF una news è presente nel sistema THEN appare nella pagina elenco e tradurlo in
public class InserimentoNewsAcceptance extends AcceptanceTest {
public void testIfInseritaThenAppare() {
insertNews("Titolo", "Testo testo testo", insertedToday(), expiresTomorrow());
assertEquals(1, numberOfNewsInPublicPage());
assertNewsPresent("Titolo", "Testo testo testo", insertedToday());
}
}
Ci siamo un po' bloccati per questo: il titolo e il testo della news possiamo andarli a cercare così come sono nell'html generato dall'applicazione. Ma la data di inserimento? Anche se internamente la rappresentiamo come "2006/04/18", all'utente probabilmente la mostreremo come 18 aprile 2006, o magari 18/04/06. E qui il nostro test rischia di diventare fragile.
Questo approccio al testing è ben descritto nel libro di Lisa Crispin e Tip House, TestingExtremeProgramming. In pratica definiamo nella superclasse AcceptanceTest tutti i metodi come numberOfNewsInPublicPage() che fanno il lavoro dietro le quinte di interrogare l'applicazione.
12/04/2006 Matteo, Tommaso
4 pomodori previsti - 1 pomodoro consumato
Io e Tommaso stiamo cercando una buona maniera di esprimere gli AT per il ns progetto. Abbiamo creato una classe ...acceptance.NewsPageAcceptanceTest che cerca di replicare i test descritti nel ReportMeet5 con il minimo di rumore sintattico (inteso come elementi Java che non hanno significato di business). Poi abbiamo pensato a come implementare il codice che interagisce con l'applicazione per far passare i test, quando la storia sarà completata. Abbiamo pensato di seguire le indicazioni di Gabriele del ReportMeet5 sul markup semantico. Abbiamo iniziato (in test-driven) una classe di utilità ...acceptance.util.HtmlChecker che usa un parser XML per cercare i tag semantici all'interno di un codice xhtml. Siamo contenti di come sta uscendo!
Creazione file news secondo formato dato
21/06/2006 Chicco, Giorgio
3 pomodori lavorati, 1 di ristima
07/06/2006 Tommaso, Giorgio
2 pomodori
Sia Tommaso che Giorgio sono piombati a gamba tesa su questo task provenendo da coppie e task differenti. Nei pomodori lavorati non è stato conteggiato il tempo necessario ad installare l'ambiente di sviluppo su una nuova macchina. Chiedo consiglio al gruppo se sia stato un errore.
Abbiamo colto l'occasione per estrarre una nuova classe di utility per i test NewsBuilder, dotata di metodi creazionali che ritornano una News. Si è proceduto quindi al refactoring, utilizzandola in tutte le classi di test che creavano autonomamente News. Giorgio ha obiettato che in questo modo però non si stava avanzando con la storia. Tommaso ha ribattuto che il refactoring era fuzionale proprio alla storia. Ding! Primo pomodoro.
Siamo passati ad impostare il primo test sul nome del file prodotto: si crea la News con NewsBuilder, si crea il file con il nome convenuto, si asserisce il filename. Ops! E' stato creato solo l'oggetto File, l'handler, non è stato scritto ancora nulla su file system. Ding! Secondo pomodoro. Porremo rimedio al prossimo meeting, durante il quale abbiamo stimato la fine della storia, per ancora 2 pomodori.
Per quanto riguarda la directory in cui scrivere i file delle News, la proposta di Giannandrea è stata quella di una system property, ancora da realizzare.
10/05/2006 Marcello R., Uberto
2 pomodori
Nessuno di noi aveva lavorato su questo task quindi codice alla mano abbiamo cercato di capire dai test come proseguire. Abbiamo trovato un test che controllava che fosse lanciata una exception nel caso di news vuote, i passi successivi sono stati controllare news valide... scrivendo il codice per comporre queste news e litigando con le date è terminato il tempo a nostra disposizione. Alla fine, rileggendo la carta, ci siamo accorti di aver sviluppato codice per validare la news pittosto che salvarla. Ci siamo fatti prendere la mano dalla voglia di scrivere il test successivo e abbiamo perso di vista quale era il nostro obiettivo.
12/04/2006 Marcello, Luca
2 pomodori previsti - 1 pomodoro consumato
Abbiamo sprecato un po' di tempo all'inizio con il problema causato dall'Ant Builder di Eclipse, quindi abbiamo realizzato il test NewsFormatTest per la nuova classe corrispondente NewsFormat che, tipo i vari XXXFormat del JDK, ha un metodo format che prende un oggetto News e lo stampa in una string nel formato richiesto. Volendo proseguire l'analogia il parsing della news potrebbe finire in un metodo parse.
Ci siamo però fermati ad un TODO commentato per non lasciare sul repository codice non compilabile.
Validazione delle news
21/06/2006 Antonio, Roberto
3 pomodori
Al termine della sessione precedente, eravamo rimasti con dei problemi relativi alla combinazione di più step di validazione.
Abbiamo deciso di validare i dati in modo sequenziale ed alla prima segnalazione di errore viene arrestato il flusso di controllo.
Dopo aver completato i controlli su : formato data registrazione, formato data scadenza, titolo obbligatorio e data scadenza < data registrazione, abbiamo effettuato vari step di refactoring fino alla fine dell' ultimo pomodoro.
07/06/2006 Antonio, Roberto
2 pomodori
Durante la rivisitazione di quanto era stato fatto la volta scorsa, ci siamo resi conto che non aveva molto senso testare una News già instanziata, ma analizzare la stringa che rappresenta la news.
Oltre a voler modificare il contratto di NewsValidator , abbiamo verificato con il proxy le responsabilità del validatore.
Dopo queste chiarificazioni abbiamo iniziato a fare il refactoring del codice fatto in precedenza, in modo che trattase la stringa news e non l' oggetto news.
Abbiamo stimato che per finire il task saranno necessari altri 3 pomodori.
10/05/2006 Giorgio, Roberto
3 pomodori
La sessione di Ping Pong è stata iniziata da Roberto. In questo giro abbiamo piacevolmente usufruito della qualificata presenza di Gabriele, che come un gentile avvoltoio aleggiava dietro di noi.
D'istinto Roberto aveva dotato la nuova classe NewsValidator
di un costruttore con una News
in ingresso e di un metodo validate()
. Giorgio avrebbe preferito invece un metodo statico, nessun costruttore e stava per cambiare così la classe, quando Gabriele ha fatto osservare che non era la maniera corretta di agire. Nel senso che la validità di una scelta tecnica deve essere supportata da un test che la dimostri. Una volta reso verde il primo test, Giorgio ha applicato un refactoring dotando la NewsValidator
di un metodo statico che richiamava il dinamico, quindi eliminando il dinamico, quindi eliminando il costruttore. Ad ogni passo è stato fatto girare il test a disposizione.
Sono seguiti test sulla sequenza delle date della news e test su news con titolo blank.
Su segnalazione del gioviale rapace gellato alle nostre spalle, abbiamo iniziato un test che ammettesse una News con esattamente 4 carriage return. Il buon Roberto, forte della sua esperienza con le Regular Expression si è subito cimentato con essi. Una dubbiosa configurazione di pattern ha chiuso il Ping Pong, generando un TODO per la prossima sessione.
Abbiamo consumato 2 pomodori.
GUI Inserimento news
22/06/2006 Renzo, Uberto
3 pomodori
Abbiamo impiegato il primo pomodoro per uno spike sul funzionamento di httpunit per testare le jsp con un container "interno".
Alla fine siamo riusciti a creare una jsp, testare il suo corretto caricamento (response 200) e la presenza al suo interno di una form HTML.
Comments (0)
You don't have permission to comment on this page.