Lo sto facendo è giusto? Altrimenti cosa devo cambiare esattamente
E 'difficile dire proprio da quel breve descrizione, ma ho il sospetto che, no, si sta non facendo bene. Nota: non sto dicendo che quello che stai facendo non funzioni o sia in qualche modo negativo, 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 riguarda i test. Non si tratta nemmeno di scrivere prima 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 o se lo hai completamente chiarito: stai scrivendo (scheletri di) codice nella tua testa, quindi scrivendo test per quel codice. Questo non è TDD.
Lasciar andare quell'abitudine è difficile . Davvero molto difficile. Sembra essere particolarmente difficile per i programmatori esperti.
Keith Braithwaite ha creato un esercizio che chiama TDD come se lo intendessi . Consiste in un insieme di regole (basate sulle Tre regole del TDD di zio Bob Martin , ma molto più rigorose) che devi seguire rigorosamente e che sono progettate per orientarti verso l'applicazione del TDD in modo più rigoroso. Funziona meglio con la programmazione di coppia (in modo che la tua coppia possa assicurarsi di non infrangere le regole) e un istruttore.
Le regole sono:
- Scrivi esattamente un nuovo test, il test più piccolo possibile che sembra puntare nella direzione di una soluzione
- Vederlo fallire; gli errori di compilazione vengono considerati errori
- Fai passare il test da (1) scrivendo il codice di implementazione minimo che puoi nel metodo di test .
- Rifattore per rimuovere la duplicazione, e altrimenti come richiesto per migliorare il design. Sii severo nell'usare queste mosse:
- vuoi un nuovo metodo — attendi il tempo di refactoring, quindi ... crea nuovi metodi (non di prova) eseguendo uno di questi e in nessun altro modo:
- preferito: eseguire il metodo di estrazione sul codice di implementazione creato come da (3) per creare un nuovo metodo nella classe di test, oppure
- se è necessario: spostare il codice di implementazione come da (3) in un metodo di implementazione esistente
- vuoi una nuova classe: attendi il tempo di refactoring, quindi ... crea classi non di prova per fornire una destinazione per un metodo di spostamento e per nessun altro motivo
- popolare le classi di implementazione con i metodi facendo Move Method e nessun altro modo
In genere, questo porterà a progetti 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 design, implementare il design che avevi già immaginato prima di scrivere il tuo test".
Quando un gruppo di persone implementa qualcosa di simile a un gioco di tic tac toe usando pseudo-TDD, in genere finiscono con progetti molto simili che coinvolgono un qualche tipo di Board
classe con un array 3 × 3 di Integer
s. E almeno una parte dei programmatori avrà effettivamente scritto questa classe senza prove perché "sanno che ne avranno bisogno" o "hanno bisogno di qualcosa per scrivere i loro test". Tuttavia, quando costringi lo stesso gruppo ad applicare il TDD come se lo intendessi, spesso finiranno con una grande varietà di progetti molto diversi, spesso non impiegando nulla di simile a un remoto Board
.
C'è un modo per identificare se il test che hai scritto è sufficiente?
Quando coprono tutti i requisiti aziendali. I test sono una codifica dei requisiti di sistema.
È buona norma scrivere test per funzionalità molto semplici che potrebbero essere equivalenti a 1 + 1 = 2 o è solo un overplay?
Ancora una volta, ce l'hai al contrario: non scrivi test per funzionalità. Scrivi funzionalità per i test. Se la funzionalità per superare il test risulta essere banale, va benissimo! Hai appena soddisfatto un requisito di sistema e non hai nemmeno dovuto lavorare sodo per questo!
È utile modificare la funzionalità e testare di conseguenza se i requisiti cambiano?
No. Al contrario. Se un requisito cambia, si modifica il test che corrisponde a quel requisito, lo si osserva fallire, quindi si cambia il codice per farlo passare. I test vengono sempre per primi.
È 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, in cui quando la scadenza incombe e sei sotto pressione, non devi nemmeno pensarci e farlo diventa il modo più veloce e naturale per lavorare.