|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
[Vari] TDD Ma è davvero sviluppo agile?
Come si fa a definire agile lo sviluppo TDD?
In un sistema di una certa dimensione non si può sviluppare un TDD senza Mock perchè un applicativo per funzionare spesso si basa sul fatto che dietro c'è un mondo intero di programmi che lavora ed è impensabile di riscrivere la logica di tutti gli altri applicativi solo per creare i dati corretti ad esempio su db nel SetUp e cancellazione nel TearDown. E come si fa agilmente a far si che una classe al suo interno richiami il Mock invece del vero codice? A quanto ho definitivamente sperimentato i test servono solo a dimostrare che il flusso logico interno è corretto, chiaramente tramite i Mock, ma non mi segnaleranno mai se una qualche modifica nel sistema, per sbaglio, causa il mancato funzionamento del programma, proprio perchè con i Mock mi sono isolato dal sistema: si so che il programma funziona, ma non so se ad un certo punto il programma smette di funzionare per cause esterne. A che cavolo servono i test? Alla fine perdo tempo a scrivere test che so che verranno passati e non verificherò mai delle condizioni per cui questo non avviene. Insomma una perdita di tempo? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Secondo me si... già a logica, l'idea di scrivere per ogni classe un test che simula ogni possibilie situazione, mi pare una cosa lunga, imprecisa, difficile, e che ruba un sacco di tempo che potresti dedicare a correggere con le tue manine, senza contare che incasina ulteriormente il codice e lo rende immantenibile.
Senza mezzi termini, mi pare una gran cavolata... ci sono metodi molto migliori per essere sicuri che il codice funziona, ma non sono affatto "agili" o "automatici"... per esempio capire cosa stai scrivendo. |
|
|
|
|
|
#3 | ||||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Programmare in TDD non deve rendere o rendere immantenibile il codice, anzi lo deve rendere più semplice, più snello e manutenibile. Il TDD inoltre non deve simulare qualsiasi situazione Quote:
Codice:
class QueryInterface
{
public:
QueryInterface();
virtual QueryResult doQuery() = 0;
};
class MockQuery: public QueryInterface
{
bool queryDone;
public:
MockQuery(): queryDone(false);
QueryResult doQuery()
{
queryDone = true;
return SomeWorkQueryResult();
}
bool wasQueryDone() { return queryDone; }
};
class ConcreteQuery: public QueryInterface
{
public:
ConcreteQuery();
QueryResult doQuery();
};
Nel test per testare se la mia classe ha fatto la query:
MockQuery * query = new MockQuery();
MyClass instance(query);
instance.doSomeWork();
AssertFalse(query->wasQueryDone());
Nel codice che istanzia MyClass:
MyClass *instance = new MyClass(new ConcreteQuery());
Quote:
Se il sistema smette di funzionare puoi (quasi) SICURAMENTE escludere che si tratti di un problema di codice. Ti sembra poco ? Quote:
- durante lo sviluppo le modifiche al codice fanno fallire un test - durante il bugfixing le modifiche al codice fanno fallire un test Prima di tutto se un test diventa rosso so già dove andare a guardare per correggere il problema. Queste sono situazioni fondamentali, in quanto andando a modificare il codice in modo da far ritornare al successo il test, la test base mi garantisce di non aver introdotto altri errori noti (bug fixati precedentemente), ma sopratutto mi garantisce a priori che le funzionalità fondamentali del programma (che sono oggetto di test) siano garantite. Ultima modifica di cionci : 11-11-2008 alle 17:53. |
||||
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ma, forse non e poi una perdita di tempo se consideriamo che questa metodologia di sviluppo è stata usata con successo per esempio in contesti di sviluppo complessi in codice di dimensioni delle MLOC (vedi Fek, ad esempio, non penso che uno con la sua esperienza ci venga a raccontare frescacce. Poi ci sono anche i ragazzi di Diamond Crush che potrebbero avere qualcosa di interessante da dire in merito).
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
![]() In un gioco di medie dimensioni ci saranno una quantità di rami di if contabili sulle migliaia... senza contare l'esplosione combinatoria data da un'uso efficace del polimorfismo. E se ci infilo anche Lua? IMHO è una cosa totalmente fuori dal mondo, per quanto possa essere utile a contenere le incomprensioni all'interno di un team. Senza contare: - che tutto questo apparato pazzesco riesce solo a dirti che c'è un errore, mica qual'è o dove si origina... -che il 90% degli errori in C++ sono errori di nullpointers e simili, e il crash del programma fa capire piuttosto bene che c'è un errore... -che se l'errore è nell'algoritmo, molto probabilmente sarà sbagliato anche l'algoritmo di controllo: mettiamo che io voglia avere il risultato del prodotto di matrici, ma sbaglio a scrivere perchè non so la teoria. Ebbene, mi faccio il mio bravo test che trova errori in base ad un pò di prodotti svolti da me su carta... solo che sono sbagliati anche quelli su carta! In questa maniera l'errore non lo troverai mai, se ti fidi del test... -Come fai a trovare un test buono per algoritmi inventati da te? Che ne sai che sono i migliori possibili? per questo, boh, anche se funzionasse mi pare un grosso spreco di tempo in applicazioni che non devono essere indistruttibili, in quanto più che trovare gli errori serve a "congelare" la codebase... Ultima modifica di Tommo : 11-11-2008 alle 19:08. |
|
|
|
|
|
|
#6 | ||||||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Hai appunto nominato il polimorfismo che consente di limare all'osso la complessità ciclomatica del codice. Ogni classe può essere testata per il suo funzionamento, il comportamento generale del codice con le classi polimorfiche non è detto che vada calcolato singolarmente. Ad esempio: faccio una classe che contiene una collection di figure piane. Inserisco nella classe un quadrato e due rettangoli e testo il metodo che mi calcola la somma delle superfici. Ora voglio sviluppare anche un centinaio di classi derivate, ogni classe derivata ovviamente mi ritorna l'area, basta che io testi la correttezza dell'area ritornata ed automaticamente non c'è bisogno che io testi ancora il metodo che mi ritorna la somma delle aree inserendo tutti i vari tipi di figura nella collection. Il test sulla somma resta invariato, devo solo controllare la correttezza del calcolo dell'area delle singole figure. Quote:
Quote:
Quote:
I tre passi fondamentali del TDD sono scrivere un test che fallisce, scrivere il codice che fa passare il test, eliminare le duplicazioni sia di codice che di dati. Quote:
Quote:
Però i test ti consento di prendere in mano l'algoritmo, rifattorizzarlo, modificarlo e poi vai a far girare la test base e ne verifichi la correttezza Spiega meglio... Ultima modifica di cionci : 11-11-2008 alle 20:08. |
||||||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Non sono un grande sviluppatore né ho avuto l'occasione di sperimentare molto il TDD su progetti di grossa/media dimensione, ma posso dire che è molto utile in certi casi avere una serie di test che verificano rigidamente la correttezza del software; appena fai una modifica che mette in crisi i test puoi subito porre rimedio invece di allargare l'errore in modo catastrofico.
Ad esempio, in un progetto universitario che ho sviluppato l'anno scorso, pur di modeste dimensioni, ad un certo punto ho sentito il "bisogno" di controllare che ogni funzione stesse lavorando nel modo che io mi aspettavo, e non diversamente. Purtroppo ho inserito i test solo in un secondo momento, quindi non è stato vero TDD fino a quel punto, ma poi ho dovuto perdere molto meno tempo nel debugging rispetto a quanto ne avevo speso prima. Detto questo, lascio spazio ai più esperti, io non ho molto titolo per potermi pronunciare su queste cose.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Per quanto mi riguarda no. Sono una rete di sicurezza inestimabile da usare ad ogni modifica al codice e da aggiornare continuamente ad ogni bugfix. |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Ci sono anche per C++: http://mockpp.sourceforge.net/ Ultima modifica di cionci : 11-11-2008 alle 20:08. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Mi hai fatto ricredere in parte
![]() Cmq continuo a nutrire dei dubbi sulla convenienza e l'efficacia... da quello che ho capito è migliore in situazioni dove il programma è sottoposto a moli di input variabili, e deve mantenere una stabilità comprovabile... che so, applicativi manageriali ecc. Per un gioco invece mi pare che non ci sarebbe davvero il modo di fare un test che valida il tutto, perchè l'obiettivo da raggiungere è interno all'applicativo stesso... come faresti a verificare se un algoritmo che disegna forme col mouse è giusto? Gli occhi mi sembrano ancora il debugger migliore
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Gli occhi umani possono essere ingannati e il giudizio sarà sempre soggettivo mentre ci sono algoritmi che possono dirti che l'ultima modifica al codice ha peggiorato la qualità dell'immagine di 0.2 dB |
|
|
|
|
|
|
#12 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quote:
Pensa che in Diamond questa costituiva una delle parti fondamentali Fino a quando non perdi mezza giornata dietro ad un bug che, dopo, ti accorgi che avrebbe potuto essere esercitato con un test composto da tre righe di codice Prova a pensarci non appena fai una intesa sessione di debug E anche importante non confondere la test base con il TDD, la maggior parte dei programmi commerciali e non ha complesse suite di test scritti a diversi livelli dopo ogni modulo del programma e dopo ogni bugfix. Quindi non siamo qui a discutere sull'efficacia ormai comprovata di un'ampia test base, ma sul fatto di scrivere il test prima del codice che lo rende verde...è questo il TDD Anche i giochi sviluppati attualmente hanno test base da diverse decine di migliaia di test, nonostante non siano scritti in TDD. |
||
|
|
|
|
|
#13 | |||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Questo significa però che in ogni classe devo prevedere un costruttore che accetta in ingresso tutti gli oggetti usati internamente.
Già si comincia a modificare il codice per eseguire i test. Inoltre questo comporta che non sono applicabili a codice già esistente. Quote:
L'unica è il test d'integrazione che però spesso porta a tempi di sviluppo che sono almeno tripli se non inaccettabilmente più grandi del tempo di sviluppo dell'applicativo. Alla faccia dell'agile. Quote:
Quote:
|
|||
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Il test continua ad essere verde, ma il software non funziona più. Riesco a monitorare il software che smette di funzionare? Perchè in un sistema con migliaia di programmi ci vuole qualcosa che ti dica se il tuo software continua a funzionare anche a seguito di modifiche all'ambiente. |
|
|
|
|
|
|
#15 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Stiamo parlando di TDD e non di scrivere i test per codice già scritto. C'è una differenza notevole. Quote:
Volendo anche la verifica della correttezza delle tabelle del DB è fattibile (quale problema c'è a farla ???). Si tratta solo di non mockare il DB e tenerlo accessibile durante tutte le operazioni. Il Mock si fa principalmente per tutti quei sistemi in cui la verifica è scontata o comunque non fattibile. Ad esempio: come fai a dire se un file audio ha suonato ? Oppure...come fai a dire se l'immagine viene visualizzata a video ? Il Mock del DB era solo un esempio, che comunque può servire a prescindere che si faccia o meno uso del DB durante lo sviluppo, ma volendo si può testare tranquillamente che le tabelle siano quelle prefissate, in caso cambino inaspettatamente o nel caso in cui una query ritorni attributi non attesi. |
||
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#17 | |||
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Riporto qua un post dall'oltretomba di TigerShark, che mi sembrava troppo chiaro per relegarlo ad un PM
![]() Quote:
Io, in quanto one-man-team, ho difficilmente avuto bisogno di una cosa del genere; la maggior parte degli errori sono sempre dovuti a nullpointers sparsi, quindi facilmente rintracciabili; gli altri spesso ad errori negli algoritmi, che fanno cose nell'ordine sbagliato/o sono semplicemente errati. Si vede visivamente che gli oggetti non fanno quello che devono fare, e si deduce la parte del codice fallata. Se uno si ricorda quello che ha scritto non è poi così difficile ![]() Un gioco poi è un'applicazione che è sottoposta ad una mole di input limitatissima, in quanto tutto può essere ridotto agli input filtrati della tastiera e del mouse... sicuramente prevedibilissimi, dato che se sono errati li si scarta e basta. Questo per dire che non mi è mai capitato di aver trovato un bug che un test semplice da fare avrebbe potuto evitare; o quantomeno non ci ho mai messo di più a scovarlo che a scrivere un test... Se poi contiamo che per seguire sta cosa avrei dovuto scrivere tests per parti che invece hanno funzionato alla prima, il bilancio-tempo era svantaggioso a dire poco. Cmq sono sicuro che in un team a diversi livelli di skill, e con qualche "attrito" questa roba possa essere oro... io non mi fido di quello che scrivi, e allora te lo circondo di tests ![]() solo che così più che curare si annulla il sintomo. |
|||
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
Perchè per creare i dati corretti devi implementare sul setup dei test tutto quello che viene svolto, magari da decine di software che girano precedentemente al tuo applicativo. Ovvero per fare un test di un applicativo che richiede una settimana di sviluppo ti ci può volere anche più di un mese. Credo che in ambito aziendale questa sia una condizione comune, visto che l'ho sempre riscontrato in tutte le aziende, ma non ho mai cercato di creare test automatici. |
||
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
|
|
|
|
|
|
|
#20 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Hai testato la correttezza del tuo codice in reazione al variazioni dell'ambiente esterno non desiderate. Non puoi testare l'ambiente esterno. Basta guardarlo dal giusto livello di astrazione. Quote:
Niente vieta che la correttezza delle query venga testata indirettamente sulla correttezza di funzionamento delle classi del programma. |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:03.




















