Se il TDD riguarda il design, perché ne ho bisogno? [chiuso]


10

I guru del TDD ci dicono sempre di più che il TDD non riguarda i test, ma il design . Quindi conosco alcuni sviluppatori che creano un design davvero eccezionale senza TDD. Dovrebbero praticare TDD allora?


14
Se stanno andando bene senza di essa, allora non ne hanno bisogno. Non tutte le "migliori pratiche" funzionano per tutti.
Rook,

1
La mia risposta a una domanda simile: programmers.stackexchange.com/questions/98485/…
Rei Miyasaka,

Risposte:


18

TDD non solo mi aiuta a raggiungere il miglior progetto finale, mi aiuta ad arrivarci in meno tentativi.

Avevo due o tre pugnalate a un problema prima di decidere quale disegno pensavo fosse il migliore. Ora, quello stesso identico tempo viene impiegato per scrivere test e focalizzare la mia mente sul design corretto. E, come bonus, mi lascia con una serie di test ripetibili. Vincere!

Detto questo, ci saranno inevitabilmente persone per le quali TDD non offre nulla. Finché hanno ancora test automatici e ripetibili alla fine, va bene.


4
in meno tentativi, davvero?
Siberian

3
Sì davvero. TDD mi costringe a pensare a una classe in termini di codice chiamante, nonché della sua funzionalità, perché inizi scrivendo il codice che ti aspetti di poter scrivere per consumare la classe. Quando scrivo una classe "cieca" tendo a concentrarmi su ciò che fa più di ciò che la classe chiamante si aspetta, il che è quasi sempre un errore.
pdr,

4
Vedi, c'è ancora quella parola, forced. Non so perché le persone non siano più spesso disturbate dalla frequenza della parola "forzata" come accade nelle discussioni sul TDD. Non dovrebbe essere necessario essere costretti a progettare qualcosa in modo corretto; essi dovrebbero imparare come progettare le cose in modo corretto, e poi continuare a farlo senza essere costretti in esso, specialmente quando questo atto di forzatura è così incredibilmente in termini di tempo.
Rei Miyasaka,

3
@Rei: Le persone non sono più spesso disturbate perché sanno che l'altra persona significa veramente "spinto" o "guidato" o ... ed ecco una rivelazione quando parli di Test Driven Development ... forse "guidato" . E sì, alcuni potrebbero scoprire che pensano in quel modo naturalmente, senza essere spinti, l'ho detto nel post. Ma devi ancora testare il tuo software, quindi non stai molto meglio.
pdr,

3
Quando qualcuno dice "forza il design modulare", sono davvero costretti. È molto difficile (se non impossibile) realizzare un progetto non componibile con TDD, e questa è una buona cosa. Il problema non è questo risultato finale di essere forte; è la quantità di sforzo umile e meccanico che serve. Una corretta progettazione è un'abilità insegnabile e apprendibile, e il tempo dovrebbe essere dedicato all'apprendimento. Inoltre, i test scritti per TDD non assomigliano molto ai test scritti per la cattura di bug. Se lo fanno, qualcosa non va .
Rei Miyasaka,

12

Ciò che questo particolare guru di TDD sta davvero cercando di dire non è che TDD è un processo di progettazione (anche se un certo numero di persone lo hanno purtroppo interpretato in quel modo). Il messaggio qui è che l'uso di un processo come TDD, se lo fai nel modo giusto , tenderà a migliorare il tuo design complessivo.

Il concetto fondamentale è molto più antico di TDD; progettando per testabilità . Se aderisci rigorosamente ai principi SOLID , in particolare il principio di responsabilità singola , troverai il codice molto facile da testare. D'altra parte, se tendi ad essere un po 'più sciatto nel tuo design, probabilmente troverai il processo di scrittura di unit test per costringerti a farlo più spesso, per evitare la frustrazione di (a) capire cosa deve essere testato e (b) passare più tempo a impostare dipendenze che a scrivere i test effettivi.

Non dovete seguire TDD per ottenere i benefici di questo, ma non aiutano a scrivere i test precoce - preferibilmente molto presto dopo aver implementato una classe, se non prima o durante. Se aspetti troppo a lungo, corri il rischio dei test di "sporco ibrido" di cui parla l'autore, che non hanno molto valore perché sono fragili e tendono a rompersi durante un refactoring innocuo - per non parlare del fatto di ingrandirlo -scale ridisegna un processo estremamente difficile.

Non puoi sapere se stai progettando veramente per la testabilità se non scrivi test e i "test di funzionalità" casuali con solo il 15% di copertura del codice non contano.

Ovviamente puoi creare buoni progetti senza mai scrivere un singolo test, ma sei sicuro che siano fantastici progetti? Come fai a sapere se non sono chiaramente indicati dai test? I test scoprono molti problemi e, sebbene un processo di QA possa trovare bug visibili, non scopriranno decisioni di progettazione sbagliate.


1
Il punto di un buon design non è solo quello di essere testato. Sì, TDD è un ottimo strumento per individuare i progetti difettosi.
deadalnix,

4

Risposta semplicistica proveniente da qualcuno che cerca di imparare il TDD: non ne hai bisogno , ma il vantaggio principale che ti dà è, in parole povere, la fiducia : la sicurezza che la tua applicazione funzioni. Fiducia che i casi d'uso siano soddisfatti. Fiducia che la tua logica è valida per il modulo "Foobar". Fiducia nel fatto che il tuo codice sia strutturato correttamente per essere mantenibile ed estendibile per sei mesi lungo la strada quando il CEO vuole aggiungere alcune nuove funzionalità pazze di cui ha letto. Fiducia nel fatto che, quando la tua applicazione cresce, sono state gettate le basi affinché l'architettura non si disgreghi o richieda gobber di hack disordinati per creare nuove funzionalità della giuria.

Mi rendo conto che quanto sopra sembrava un po 'evangelico ma è così che vedo i benefici del TDD. Anche se è possibile creare progetti validi, solidi e ben progettati utilizzando TDD, si forza la mano nel fare le cose nel modo giusto, e quindi si dimostra che le cose sono fatte nel modo giusto e, soprattutto, fornisce una base per mantenere le cose nel modo giusto. Dal poco che mi sono dilettato in TDD, usarlo mi ha costretto a rendere il codice pulito e seguire i concetti di ingegneria del software corretti, dove altrimenti avrei fatto la "cosa più veloce possibile" che spesso si traduceva in un disordinato codice "hack".


+1 TDD è feedback. Poiché la maggior parte delle misure di feedback vanno, è abbastanza obiettivo e completamente automatizzato, quindi può essere condiviso dai membri del team di tutti i livelli di abilità. Prima di TDD, un buon codice era qualcosa che "sentivi", o è stato confermato qualche volta dopo che gli utenti hanno ottenuto il software. Più corto è il loop, più ti senti sicuro. Sfortunatamente TDD è incline all'eccesso di fiducia in quanto "sente" un buon design, ma è molto più facile da correggere.
Steve Jackson,

2

Posso parlare solo per esperienza. Per me TDD ha portato molte cose che non avevo prima nella mia cassetta degli attrezzi delle mie abitudini di sviluppo. Tuttavia, vale la pena ribadire che TDD non è una soluzione a tutto. Cerco sempre di separare l'implementazione pronta per l'esplorazione e la produzione. Il TDD in fase di esplorazione non è assolutamente necessario e sta persino rallentando. Dall'altro lato, il codice pronto per la produzione offre numerosi vantaggi che a breve e lungo termine sono molto preziosi per la salute mentale degli sviluppatori e il karma del progetto.

  • TDD mi fa pensare prima di implementare, che di solito è un'ottima pratica che impedisce molte riprese e dimentica le soluzioni
  • Mi fa pensare in piccole parti del problema, costringendomi a spezzare la soluzione a piccoli pezzi che si incastrano.
  • Mi fa scrivere un codice molto disaccoppiato perché ogni volta che devo stub / deridere / falsificare qualcosa che non si adatta al problema, lancio naturalmente un "WTF, perché dovrei farlo se non devo accoppiarlo con esso" . E mi fa capire meglio le connessioni tra le cose.
  • Mi dà una serie di controlli facilmente eseguibili per il mio codice, quindi non devo passare attraverso il doloroso stile "deb_dump", "p", "pp", "echo" del debug del codice. Segnala solo ciò che è sbagliato, quando è sbagliato. E se non ho ancora un controllo, è solo questione di aggiungere semplici test per verificarlo più e più volte.
  • Mi rende certo che il mio codice funziona se tutti i test superano la distribuzione. Poi invece di mangiare le unghie vado a mangiare una torta e bere caffè e godermi i miei pomeriggi.
  • I test di alto livello sono molto belli nei casi in cui devi refactificare qualcosa. Se il mio modulo deve fornire alcune funzionalità al mondo esterno e ho sviluppato test funzionali / di integrazione / di cetriolo per dimostrare che funziona correttamente, sarò molto coraggioso per rimediare all'inferno da quel codice. Più volte mi sono trovato di fronte al codice che non aveva test e che dovevo refactoring. In quel caso c'erano due modi per andare in pratica. 1) rilasciare il codice 2) saltare le modifiche e lasciarlo così com'è.

C'è una cosa che TDD non risolve. Se non sai come costruire ciò che stai costruendo, TDD non produrrà la soluzione per te. È necessario disporre di una "progettazione" approssimativa o di una panoramica del problema e della soluzione. TDD ti consentirà di implementarlo in modo più elegante e sostenibile con il codice di qualità superiore.

Alla fine, preferisco pensare in termini BDD che si basano sulle pratiche TDD. BDD mi fa implementare una soluzione usando il vocabolario del dominio e per adattare meglio il software al problema.


1

Ci possono essere molti modi per ottenere un grande design e ci sono senza dubbio molte interpretazioni diverse di ciò che costituisce "grande" - o addirittura "buono". Sospetto che la maggior parte dei TDDer non sia d'accordo con te sulla definizione - che se guardassimo il codice che ritieni ottimo, lo considereremmo meno che eccezionale. TDD ci porta ad alcune qualità molto specifiche e queste qualità si trovano raramente nel codice non TDD.

La testabilità, ovviamente, è una di quelle qualità, e quella generale. Metodi e classi estremamente piccoli sono forse una caratteristica secondaria e ciò porta a una denominazione eccellente. Forse conosci programmatori che ottengono queste qualità senza fare TDD, ma io no.


1
Quasi sicuramente troverai queste stesse qualità nel codice prodotto da un processo a cascata, ad esempio per i militari, lo spazio, ecc. Suppongo sia vero che non sono comuni nelle versioni a metà di Agile e / o della cascata praticate in la maggior parte delle organizzazioni per progetti quotidiani.
Aaronaught,

@Aaronaught Dillo al team Mars Climate Orbiter . :-)
Eric King,

Ho avuto qualche esperienza con il processo a cascata su progetti militari senza armi negli anni '90, e anche molte discussioni sul raffreddamento dell'acqua con i veterani di altre applicazioni militari. Il consenso generale era che la metodologia a cascata e la fatturazione a costo maggiorato producevano sistemi difettosi che erano molto difficili da mantenere.
Kevin Cline,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.