Am I doing it is right? If not what exactly I have to change
È difficile dire solo da questa breve descrizione, ma sospetto che, no, tu sia non che lo fa bene. Nota: non sto dicendo che quello che stai facendo non funziona o è in qualche modo cattivo, ma non stai facendo TDD. La "D" centrale significa "Driven", i test guidano tutto, il processo di sviluppo, il codice, il design, l'architettura, tutto .
I test ti dicono cosa scrivere, quando scriverlo, cosa scrivere dopo, quando smettere di scrivere. Ti dicono il design e l'architettura. (Il design e l'architettura emergono dal codice attraverso il refactoring.) TDD non tratta di test. Non si tratta nemmeno di scrivere i test: TDD significa lasciare che i test ti guidino, scriverli prima è solo un prerequisito necessario per questo.
Non importa se in realtà scrivi il codice in basso, o se è completamente aggiornato: stai scrivendo (scheletri di) codice nella tua testa, quindi scrivendo i test per quel codice. Questo non è TDD.
L'abbandono di quell'abitudine è difficile . Davvero, davvero difficile. Sembra essere particolarmente difficile per i programmatori esperti.
Keith Braithwaite ha creato un esercizio che chiama TDD As If You Significa . Consiste in un insieme di regole (basate su Tre regole del TDD dello zio Bob Martin , ma molto più severe) che devi rigorosamente seguire e che sono progettati per orientarti verso l'applicazione di TDD in modo più rigoroso. Funziona al meglio con la programmazione di coppie (in modo che la tua coppia possa essere sicura che non infrangi le regole) e un istruttore.
Le regole sono:
- Write exactly one new test, the smallest test you can that seems to point in the direction of a solution
- See it fail; compilation failures count as failures
- Make the test from (1) pass by writing the least implementation code you can in the test method.
- Refactor to remove duplication, and otherwise as required to improve the design. Be strict about using these moves:
-
you want a new method—wait until refactoring time, then … create new (non-test) methods by doing one of these, and in no other way:
- preferred: do Extract Method on implementation code created as per (3) to create a new method in the test class, or
- if you must: move implementation code as per (3) into an existing implementation method
-
you want a new class—wait until refactoring time, then … create non-test classes to provide a destination for a Move Method and for no other reason
- populate implementation classes with methods by doing Move Method, and no other way
Tipicamente, questo porterà a disegni molto diversi rispetto al "metodo pseudo-TDD" spesso praticato di "immaginare nella tua testa quale dovrebbe essere il design, quindi scrivere test per forzare quel progetto, implementare il design che avevi già immaginato prima di scrivere i tuoi test ".
Quando un gruppo di persone implementa qualcosa come un tic tac toe game usando pseudo-TDD, in genere finiscono con disegni molto simili che coinvolgono una sorta di classe Board
con un array 3 × 3 di Integer
s. E almeno una parte dei programmatori avrà effettivamente scritto questa lezione senza test perché "sanno che ne avranno bisogno" o "hanno bisogno di qualcosa per scrivere i loro test contro". Tuttavia, quando costringi lo stesso gruppo a applicare TDD come se lo intendessi, spesso finiscono con un'ampia varietà di design molto diversi, spesso non utilizzando nulla di simile a un Board
.
Is there any way you can identify whether test you have written are enough?
Quando coprono tutti i requisiti aziendali. I test sono una codifica dei requisiti di sistema.
Is it good practice to writing test for very simple functionality which might be equivalent to 1+1 = 2 or is it just an overplay?
Di nuovo, lo hai indietro: non scrivi test per la funzionalità. Scrivi funzionalità per i test. Se la funzionalità per far passare il test risulta essere banale, è grandioso! Hai appena soddisfatto un requisito di sistema e non hai nemmeno dovuto lavorare duro per questo!
Is it good to change functionality and accordingly test if requirement changes?
No. Viceversa. Se un requisito cambia, cambi il test che corrisponde a quel requisito, guardalo fallire, quindi cambia codice per farlo passare. I test always vengono prima.
È difficile farlo. Hai bisogno di dozzine, forse centinaia di ore di pratica deliberata per costruire una sorta di "memoria muscolare" per arrivare a un punto, dove quando la scadenza incombe e sei sotto pressione, non lo fai Devo anche pensarci, e farlo diventa il più veloce e il modo più naturale per lavorare.