La gente dice che "parlare di TDD funziona a malapena, se vuoi convincere qualcuno a TDD, mostra loro i risultati". Tuttavia, sto già ottenendo ottimi risultati senza TDD. Mostrandomi che le persone che usano TDD ottengono buoni risultati non saranno convincenti, voglio vedere che le persone che scrivono sia TDD che non-TDD ottengono risultati migliori con TDD.
Nonostante tutto ciò, sono interessato a dare una prova a TDD. Comunque non sono convinto che guadagnerò qualcosa da questo. Se si rivelerà utile, cercherò di spingerlo al resto della mia squadra.
La mia domanda principale è questa: TDD servirebbe a qualsiasi scopo per il codice, se posso già dimostrare la correttezza del codice?
Ovviamente, nessuno dei due è un proiettile d'argento. La tua prova potrebbe essere sbagliata perché ti sei perso un dettaglio e il tuo test potrebbe non riuscire a individuare un bug per cui non sei riuscito a testare. Alla fine, siamo umani, nessuno può fare il codice senza errori al 100% per sempre. Possiamo solo cercare di avvicinarci il più possibile.
Tuttavia, TDD potrebbe effettivamente salvare in qualsiasi momento del codice che ha dimostrato la sua correttezza? cioè codice che, nella macchina a stati in cui opera il codice, tutti gli stati possibili validi ei relativi intervalli sono riconosciuti dallo sviluppatore, tutti sono contabilizzati e il codice è progettato in un controllo degli errori in stile whitelist che passa ogni eccezione a un gestore superiore per assicurarsi che non vi siano perdite impreviste - > senza che entrambi visualizzino un messaggio pertinente (entro) sul client e invii notifiche di registro a un amministratore.
Le risposte con esempi di vita reale sarebbero migliori.
Alcuni chiarimenti:
-
Questa domanda non riguarda la possibilità di provare la correttezza del codice o meno. Assumiamo per impostazione predefinita che non tutto il codice può essere dimostrato corretto entro un ragionevole lasso di tempo, ma che alcuni pezzi di codice possono essere. Ad esempio, è molto facile dimostrare la correttezza di un modulo FizzBuzz. Non molto facile per un servizio di sincronizzazione dei dati basato su cloud.
-
All'interno di questo confine, la domanda chiede quanto segue: Inizia con il presupposto che un codebase è diviso in 2 parti: [I] parti che sono state dimostrate corrette [II] parti che non sono state dimostrate corrette, ma testate manualmente per funzionare.
-
Voglio applicare le pratiche TDD a questo codebase che non le possedeva fino ad ora. La domanda richiede quanto segue: il TDD dovrebbe essere applicato a ogni singolo modulo, o sarebbe sufficiente applicarli solo ai moduli che non sono stati dimostrati corretti?
-
"Proven correct" significa che puoi considerare questo modulo completamente funzionale, vale a dire, non fa affidamento su nessuno stato globale o esterno al di fuori di se stesso, e ha interamente la propria API per I / O che altri moduli che interagire con esso deve seguire. Non è possibile "rompere questo modulo" cambiando il codice al di fuori del modulo, nel peggiore dei casi si può abusarne e ricevere messaggi di errore formattati.
-
Ovviamente, ogni regola ha delle eccezioni, i bug del compilatore nelle nuove versioni del compilatore potrebbero introdurre dei bug in questo modulo, ma gli stessi bug potrebbero essere introdotti ai test che lo hanno testato e hanno dato un falso senso di sicurezza ai test che non più lavoro come previsto. La linea di fondo è che i test non sono una soluzione magica, sono un altro livello di protezione, e questa domanda discute la questione se questo strato di protezione valga lo sforzo nel caso specifico di un modulo che è stato dimostrato corretto (supponiamo che era davvero).