UgAggregatorJournal



 

Please aggiungi le tue note in cima alla pagina, non in fondo! Così abbiamo le note più recenti in evidenza

 

 

Estrazione file news da directory

07/06/2006 Fabio, Luca

1 pomodoro

Il pomodoro più easy della mia breve carriera. Il mese scorso Tommaso partiva a bomba per implementare il filtro sui nomi dei file. Io, ingenuo, lo fermavo perchè il pomodoro era finito, e gli facevo commentare test e codice.

Ieri sera, scommentando il tutto, finivamo il pomodoro.

10/05/2006 Fabio, Tommaso

3 pomodori

Il TearDown della classe di test è finalmente ok, e permette di testare felici. :)

La classe FileFinder ora può essere interrogata e restituisce un array con i contenuti di tutti i file della directory che le si passa come parametro.

A voler fare i bravi, rimane da implementare un filtro che riconosca i file di news da altra monnezza presente nella directory.

26/04/2006 Fabio, Marco

2 pomodori

Abbiamo completato il metodo che lista i file in una directory, ed esteso e reso funzionante il sistema per effettuare i test.

Rimangono in TODO:

  1. passare in stringa con "\n" il contenuto dei file, parametrizzando il metodo getFileContent
  2. aggiunge un metodo di TearDown che cancelli file e directory create nel setup, per impedire sovrapposizioni tra i test.
  3. filtrare i file per nome ("*.news")

12/04/2006 Fabio, Antonio, Marco

1 pomodoro

Abbiamo definito la classe FileFinder, che data la direcotry dovrà restituirci il contenuto dei file al suo interno.

Dopo qualche minuto si è presentata la necessità di scrivere un test che ci confermasse che riuscivamo a trovare e leggere un file. L'idea è stata andare a creare il file nella directory tmp (System.getProperty("java.io.tmpdir");) del pc, così da rendere ripetibile sempre e comunque il test.

Uno scontro con permessi di accesso alle directory ha rallentato la nostra corsa.

 

Parsing del contenuto dei file delle news

26/04/2006 Gabriele, Alessandro

1 pomodoro

Abbiamo proseguito la lavorazione del task facendo in modo che il costruttore delle News sollevi un'eccezione in caso di malformazione della stringa di rappresentazione della news. Abbiamo terminato con un po' di refactoring.

12/04/2006 Gabriele, Giannandrea

2 pomodori

Abbiamo iniziato la carta introducendo l'oggetto NewsParser che avrebbe avuto la responsabilita' di convertire il contenuto di un file con una news in un oggetto News. Visto che l'oggetto News non avrebbe avuto nessuna responsabilita' particolare abbiamo rinominato NewsParser in News. Abbiamo terminato con la la classe News che riceve una stringa nel costruttore (la rappresentazione in formato stringa della news) fornendo dei metodi di accesso per i dati della news.

 

Filtro news scadute

10/05/2006 Roberto, Giorgio

Abbiamo fatto una breve review di quanto fatto sin'ora, dichiarando chiusa la realizzazione della storia.

26/04/2006 Roberto, Enrico

1 pomodoro

Abbiamo effettuato un refactoring del codice di test, eliminando la classe derivata "stub" delle News ed utilizzato la classe News effettiva e la classe NewsCollection che ha procurato qualche problema durante l' utilizzo a causa dell' impossibilità di accedere direttamente agli elementi della collezione.

Abbiamo creato un nuovo test per la verifica delle news scadute ed implementato il metodo filter che restituisce una nuova NewsCollection con solo le news non scadute.

Infine abbiamo eliminato le ridondanze nei test.

12/04/2006 Roberto, Giorgio

1 pomodoro

Abbiamo iniziato introducendo la classe NewsFilter che, avendo in ingresso una lista di news e la data di riferimento in base alla quale filtrare, dovrebbe fornire in uscita una lista scremata dalle news scadute. Il cliente ha chiarito che per scadute si intende tutte quelle che hanno la data scadenza antecedente alla data di riferimento.

Abbiamo avuto una lieve difficoltà dovuta al fatto che la classe News non era stata ancora dotata del metodo che ritornava la data scadenza. Abbiamo momentaneamente ovviato con una inner private derivante da News dotata del suddetto metodo.

Il primo test minimale che abbiamo committato riguarda il NewsFilter che restituisce la lista intonsa, così come era entrata.

 

Ordinamento delle news

12/04/2006 Giannandrea, Franco

Entrambi non avevamo lavorato sulla carta e quindi abbiamo iniziato dando un'occhiata a NewsCollection e NewsFilter.

Purtroppo non siamo andati avanti molto. Avevamo deciso di aggiungere nel contenuto dei file delle news il contatore delle news in una certa data per un certo xpug (e' gia' presente nel nome del file, doveva solo essere ripetuto nel contenuto). Poi abbiamo visto che sarebbe molto piu' semplice sostituire il contatore con l'orario di inserimento e quindi abbiamo inviato la proposta a Francesco.

Nel costruttore di NewsFilter abbiamo rimosso il controllo che la NewsCollection passata come argomento sia diversa da null visto che non abbiamo intenzione di passargli null ;-) (Sono i classici controlli che si fanno quando si sviluppa senza test e si vuole rendere ogni classe 'resistente' ad un uso improprio, il problema e' che in XP aumenta la complessita' della classe senza motivo visto che ci sono gia i test che supportano sia lei e sia le classi che la utilizzano).

 

Abbiamo constatato che per ora non e' possibile inserire nella pagina html titolo e descrizione con new-line.

 

12/04/2006 Uberto, Franco

2 pomodori previsti - 1 pomodoro "consuntivato"

Abbiamo creato la classe NewsCollection. In essa si dovrebbero aggiungere le news con il metodo addNews. Tale classe dovrebbe fornire quindi un iteratore per elencare le news in ordine di data di inserimento. Per il momento l'implementazione da noi scelta ha il problema di sovrapporre news con medesima data. Il tutto è stato segnalato con un TODO nel test ChronologicalTest (eventualmente da rinominare?), nel quale è già prevista un'asserzione da decommentare per fare emergere il problema con una barra rossa.

Mi sembra che in una possibile evoluzione la classe NewsCollection potrebbe fondersi con la NewsFilter.

 

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:

 

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:

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.