La copertura del codice al 100% è un sogno irrealizzabile?


28

È possibile aspettarsi una copertura del codice del 100% nelle applicazioni Web pesanti jquery / backbonejs? È ragionevole fallire uno sprint a causa della mancata copertura del 100% quando la copertura del codice attuale si aggira intorno al 92% -95% in javascript / jquery?


7
"Fail a sprint" suona stranamente inquietante ...
Donal Fellows il

5
È un asintoto.
Robert Harvey,

12
anche se hai una copertura completa, alcuni bug non saranno trovati, quindi non fare affidamento su quel numero per sistemare tutto
maniaco del cricchetto,

11
Tutto è possibile. La vera domanda è se il valore della copertura del codice al 100% vale il costo in termini di tempo e risorse.
JohnFx,

5
Perché ti preoccupi di questo, quando il presupposto sottostante - che la copertura del test automatizzato al 100% (o qualsiasi altro numero) renderà magicamente migliore il tuo codice - è un sogno irrealizzabile?
Mason Wheeler,

Risposte:


30

È ugualmente realistico in quanto non realistico.

Realistico
Se si dispone di test automatici che hanno dimostrato di coprire l'intera base di codice, è ragionevole insistere sulla copertura del 100%.
Dipende anche da quanto sia critico il progetto. Più è critico, più è ragionevole aspettarsi / richiedere una copertura completa del codice.
È più facile farlo per progetti di dimensioni medio-piccole.


Non realistico Stai iniziando con una copertura dello 0% ...
Il progetto è mostruoso con molti, molti percorsi di errore che sono difficili da ricreare o innescare.
La direzione non è disposta a impegnarsi / investire per assicurarsi che la copertura sia presente.

Ho lavorato su una gamma di progetti che vanno da nessuna copertura a decente. Mai un progetto con il 100%, ma ci sono state certamente delle volte in cui avrei voluto avere una copertura più vicina al 100%.
In definitiva la domanda è se la copertura esistente soddisfa abbastanza i casi richiesti per consentire al team di sentirsi a proprio agio nella spedizione del prodotto.

Non conosciamo l'impatto di un fallimento sul tuo progetto, quindi non possiamo dire se il 92% o il 95% è sufficiente o se quel 100% è realmente necessario. O del resto, il 100% testa completamente tutto ciò che ti aspetti.


30
... E solo perché hai una copertura del codice al 100% non significa che hai una copertura del ramo al 100%, quindi anche con una copertura del codice al 100% potresti perdere molto.
Bryan Oakley,

3
+1 per le dimensioni del progetto. La suddivisione in componenti più piccoli, riutilizzabili e testabili ci ha permesso di ottenere una copertura del ~ 95%. Non è necessaria una copertura del 100%. I test di integrazione dovrebbero coprire le lacune dei test unitari.
Apoorv Khurasia,

5
@BryanOakley ... e anche i tuoi test potrebbero essere inutili, o addirittura non provare nulla
David_001

5
@BryanOakley E anche con una copertura delle filiali al 100%, è possibile che una determinata combinazione di filiali possa causare un problema. (due istruzioni IF sequenziali, ad esempio, possono essere diramate dentro e intorno in test separati, ma manca un test che entra in entrambi . Copertura completa del ramo , ma manca un percorso di esecuzione)
Izkata,

4
Anche la copertura delle filiali al 100%, inclusi tutti i percorsi di esecuzione, non è sufficiente. Forse qualche errore si verifica solo quando prendi una combinazione di rami e hai un input esterno, ad esempio una data non valida. Non è possibile che tutti i casi saranno mai coperti. Allo stesso tempo, si può avere una buona confidenza con una copertura inferiore al 100% ma casi di spigoli scelti opportunamente come input.
Andrea,

32

Chi mette alla prova le prove?

Nella migliore delle ipotesi è molto ingenuo e irrealistico anche in senso teorico e poco pratico in senso commerciale.

  • Non è realistico con un codice che presenta un'elevata complessità ciclomatica. Ci sono troppe variabili per coprire ogni combinazione.
  • Non è realistico con un codice fortemente concorrente. Il codice non è deterministico, quindi non è possibile coprire tutte le condizioni che potrebbero verificarsi perché il comportamento cambierà ad ogni esecuzione del test.
  • Non è realistico in senso commerciale, paga davvero dividendi per scrivere test per codice che è un codice di percorso critico, che è un codice importante e un codice che può cambiare frequentemente.

Testare ogni riga di codice non è un buon obiettivo

Scrivere test è molto costoso, è il codice che deve essere scritto e testato da solo, è il codice che deve essere documentato in ciò che sta effettivamente cercando di testare, è il codice che deve essere mantenuto con le modifiche della logica aziendale e i test falliscono perché non sono aggiornati. Mantenere i test automatici e la documentazione su di essi può essere più costoso che mantenere il codice a volte.

Questo non vuol dire che i test unitari e i test di integrazione non siano utili, ma solo dove hanno senso, e al di fuori dei settori che possono uccidere le persone non ha senso provare a testare ogni riga di codice in una base di codice. Al di fuori di queste critiche uccisioni molte persone codificano rapidamente le basi, è impossibile calcolare un ritorno sugli investimenti positivo che comporterebbe una copertura del codice del 100%.

Arresto del problema:

Nella teoria della computabilità, il problema dell'arresto è il problema di determinare, da una descrizione di un programma informatico arbitrario e un input, se il programma finirà di funzionare o continuerà a funzionare per sempre.

Nel 1936 Alan Turing dimostrò che non poteva esistere un algoritmo generale per risolvere il problema di arresto per tutte le possibili coppie input-programma. Una parte fondamentale della dimostrazione era una definizione matematica di un computer e un programma, che divenne noto come una macchina di Turing; il problema dell'arresto è indecidibile rispetto alle macchine di Turing. È uno dei primi esempi di un problema decisionale.

Dal momento che non puoi nemmeno provare che qualcosa funzioni al 100%, perché realizzare questo obiettivo?

Chiaro e semplice, nella maggior parte dei casi non ha alcun senso commerciale.


7
questa deve davvero essere la risposta accettata. La copertura del codice al 100% è quasi pari allo 0%.
Ryathal,

1
"Esistono troppe variabili per coprire ogni combinazione." Questo non ha nulla a che fare con il 100% di copertura del codice. Se una riga di codice era abbastanza importante da essere scritta, ed è abbastanza importante da mantenere, allora è abbastanza importante da essere coperta da un test. Se non è coperto da un test, l'unica ipotesi sicura è che non funziona. È vero che per alcuni codici non ha senso dal punto di vista aziendale testarlo. Questo è lo stesso codice che non ha senso scrivere dal punto di vista aziendale.
still_dreaming_1

2
quindi pensi di scrivere casi di prova per coprire semplici getXXX()/setXXX()costruttori di assegnazioni di oggetti di valore sono un buon uso di tempo e risorse, mi dispiace che non sia proprio il caso nella realtà e un'opinione estremamente ingenua che manca di esperienza nel mondo reale per sostenerlo. Ricorda che il codice di prova è ancora codice che deve essere mantenuto. Meno codice scrivi per risolvere un problema, meglio è in ogni caso .

Uhm "Non è realistico con un codice che ha un'elevata complessità ciclomatica. Ci sono troppe variabili per coprire ogni combinazione." - ovviamente, è per questo che devi suddividere tale codice in pezzi più piccoli che hanno una piccola complessità ciclomatica e sono quindi più facili da testare. Il refactoring in questo modo è essenziale per i test: semplifica i test.
Predrag Stojadinović,

17

Nella maggior parte dei casi, la copertura del codice al 100% significa che hai "tradito" un po ':

  • Parti complesse e che cambiano frequentemente del sistema (come la GUI) sono state spostate in modelli dichiarativi o altri DSL.
  • Tutto il codice che tocca i sistemi esterni è stato isolato o gestito dalle librerie.
  • Lo stesso vale per qualsiasi altra dipendenza, in particolare quelli che richiedono effetti collaterali.

Fondamentalmente, le parti difficili da testare sono state deviate verso aree in cui non vengono necessariamente considerate "codice". Non è sempre realistico, ma nota che indipendentemente dall'aiutarti a testare, tutte queste pratiche rendono il tuo codebase più semplice su cui lavorare.


In che modo spostare le cose sui DSL è barare?
back2dos,

2
@ back2dos - Mentre potresti dire unit test, i tuoi script Python incorporati, probabilmente non stai testando unità i tuoi modelli html o CSS, o contando le linee in essi verso le stime di copertura.
Dan Monego,

12

Per un esempio impressionante e reale della copertura delle filiali al 100% , vedere Come viene testato SQLite .

Mi rendo conto che la tua domanda si rivolge specificamente a javascript che è un tipo di prodotto software completamente diverso, ma voglio sensibilizzare su ciò che può essere fatto con sufficiente motivazione.


9

La copertura del codice al 100% per i test unitari per tutti i pezzi di una particolare applicazione è un sogno irrealizzabile, anche con nuovi progetti. Vorrei che fosse il caso, ma a volte non riesci proprio a coprire un pezzo di codice, non importa quanto tu provi a sottrarre dipendenze esterne. Ad esempio, supponiamo che il tuo codice debba invocare un servizio web. È possibile nascondere le chiamate del servizio Web dietro un'interfaccia in modo da poter deridere quel pezzo e testare la logica aziendale prima e dopo il servizio Web. Ma il pezzo reale che deve invocare il servizio web non può essere testato in unità (comunque molto bene). Un altro esempio è se è necessario connettersi a un server TCP. È possibile nascondere il codice che si collega a un server TCP dietro un'interfaccia. Ma il codice che si connette fisicamente a un server TCP non può essere testato dall'unità, perché se è inattivo per qualsiasi motivo, ciò provocherebbe il fallimento del test unitario. E i test unitari devono sempre superare, indipendentemente da quando vengono invocati.

Una buona regola empirica è che tutta la tua logica aziendale dovrebbe avere una copertura del codice del 100%. Ma i pezzi che devono invocare componenti esterni, dovrebbero avere una copertura del codice il più vicino possibile al 100%. Se non riesci a raggiungerlo, non lo suderei troppo.

Molto più importante, i test sono corretti? Riflettono accuratamente la tua attività e i requisiti? Avere una copertura del codice solo per avere una copertura del codice non significa nulla se tutto ciò che fai è testare in modo errato o testare un codice errato. Detto questo, se i tuoi test sono buoni, avere una copertura del 92-95% è eccezionale.


1
Testare cosa succede quando si ottengono strane combinazioni di casi di errore e mancate risposte può essere eccezionalmente complicato.
Donal Fellows,

La comprensione di ciò che farà il tuo sistema quando presenterà questi difficili problemi fa parte del fascino dei test unitari? Inoltre, c'è un po 'di confusione qui tra unit test e test di integrazione.
Peter Smith,

questo si confonde unit testingcon il integration testingtest del codice che non hai scritto sta integrationtestando. Lo stack TCP è nel sistema operativo che non dovresti testare, dovresti presumere che sia già stato testato da chi lo ha mai scritto.

4

Direi che a meno che il codice non sia progettato con l'obiettivo specifico di consentire la copertura del test al 100%, il 100% potrebbe non essere realizzabile. Uno dei motivi sarebbe che se codifichi in modo difensivo - cosa che dovresti - a volte dovresti avere un codice che gestisca situazioni che sei sicuro che non dovrebbero accadere o che non potrebbero accadere data la tua conoscenza del sistema. Coprire tale codice con i test sarebbe molto difficile per definizione. Non avere tale codice può essere pericoloso - cosa succede se ti sbagli e questa situazione si verifica una volta su 256? E se ci fosse un cambiamento in un luogo non correlato che rende possibile una cosa impossibile? Ecc. Quindi il 100% può essere piuttosto difficile da raggiungere con mezzi "naturali" - ad esempio, se si dispone di codice che alloca memoria e si dispone di codice che controlla se non ha funzionato, a meno che non si derida il gestore della memoria (che potrebbe non essere facile) e scrivere un test che ritorna "memoria insufficiente", coprendo quel codice potrebbe essere difficile. Per l'applicazione JS, può essere una codifica difensiva attorno a possibili stranezze DOM in diversi browser, possibili guasti di servizi esterni, ecc.

Quindi direi che uno dovrebbe lottare per essere il più vicino al 100% possibile e avere una buona ragione per il delta, ma non vedrei che non ottenere esattamente il 100% come necessariamente fallimento. Il 95% può andare bene su un grande progetto, a seconda di quale sia il 5%.


Solo perché il codice non deve essere eseguito in produzione in circostanze normali non significa che non può essere scritto in modo da essere eseguito dai test. Quanto è critico per quel codice insolito funzionare correttamente? È abbastanza importante coprirlo con i test? Direi che se non è abbastanza importante coprire con i test, non è abbastanza importante per gestire quel caso. Il codice che non necessita di test è il codice che non deve esistere e deve essere eliminato.
still_dreaming_1

2

Se stai iniziando con un nuovo progetto e stai utilizzando rigorosamente una metodologia test-first, è del tutto ragionevole avere una copertura del codice del 100%, nel senso che tutto il tuo codice verrà invocato ad un certo punto quando i tuoi test hanno stato eseguito. Tuttavia, potresti non aver testato esplicitamente ogni singolo metodo o algoritmo direttamente a causa della visibilità del metodo e in alcuni casi potresti non aver testato alcuni metodi nemmeno indirettamente.

Ottenere il 100% del tuo codice testato è potenzialmente un esercizio costoso, in particolare se non hai progettato il tuo sistema per consentirti di raggiungere questo obiettivo e se stai concentrando i tuoi sforzi di progettazione sulla testabilità, probabilmente non stai dando abbastanza attenzione a progettare la tua applicazione per soddisfare i suoi requisiti specifici, in particolare laddove il progetto è di grandi dimensioni. Mi dispiace, ma semplicemente non puoi averlo in entrambi i modi senza che qualcosa venga compromesso.

Se si stanno introducendo test in un progetto esistente in cui i test non sono stati mantenuti o inclusi in precedenza, è impossibile ottenere una copertura del codice del 100% senza che i costi dell'esercizio superino lo sforzo. Il meglio che puoi sperare è di fornire una copertura di prova per le sezioni critiche di codice che vengono chiamate di più.

È ragionevole fallire uno sprint a causa della mancata copertura del 100% quando la copertura del codice attuale si aggira intorno al 92% -95% in javascript / jquery?

Nella maggior parte dei casi, direi che dovresti considerare il tuo sprint come "fallito" solo se non hai raggiunto i tuoi obiettivi. In realtà, preferisco non pensare agli sprint come un fallimento in questi casi perché devi essere in grado di imparare dagli sprint che non soddisfano le aspettative al fine di ottenere la tua pianificazione corretta la prossima volta che definisci uno sprint. Indipendentemente da ciò, non credo sia ragionevole considerare la copertura del codice come un fattore nel relativo successo di uno sprint. Il tuo obiettivo dovrebbe essere quello di fare quanto basta per far funzionare tutto come specificato, e se stai programmando il test prima, allora dovresti essere sicuro che i tuoi test supporteranno questo obiettivo. Qualsiasi test aggiuntivo che ritieni necessario aggiungere è un rivestimento di zucchero efficace e quindi una spesa aggiuntiva che può trattenerti nel completare in modo soddisfacente gli sprint.


"Mi dispiace, ma semplicemente non puoi averlo in entrambi i modi senza che qualcosa venga compromesso." Quello non è vero. Puoi sempre ridimensionare le funzionalità o andare più lentamente. Se qualcosa non vale la pena testarlo, non vale la pena scriverlo. Se una riga di codice è abbastanza importante da mantenere, è abbastanza importante da testare. Se non è abbastanza importante da testare, non è abbastanza importante da tenere in giro. L'unica ipotesi sicura di una riga di codice non testata è che non funziona.
still_dreaming_1

@ still_dreaming_1, sembra che tu abbia sostenuto la mia affermazione e ti sia contraddetto. Il ridimensionamento delle funzionalità o l'alterazione delle scadenze sono compromessi, ognuno dei quali può influire sui costi del progetto e sulle aspettative degli stakeholder. Testare il codice legacy che non è stato precedentemente testato completamente è estremamente difficile, poiché devi capire non solo il codice mentre viene eseguito, ma le intenzioni del creatore originale e scrivere test che catturano il comportamento del codice legacy esistente non mostra necessariamente che il codice funzioni interamente come dovrebbe.
S.Robins,

Immagino che il mio punto sia che qualcosa che è stato compromesso, le funzionalità o le modifiche che non sono state ancora create perché lo sviluppo si sta muovendo più velocemente, non è un vero compromesso perché se perdi la copertura per spostarti più velocemente, tali funzionalità e modifiche possono si presume che non funzioni bene comunque. Allora, che senso aveva apportare quelle modifiche o aggiungere quelle funzionalità se non importa se funzionano bene o no? Se non importa se funzionano correttamente, tali modifiche non hanno bisogno di essere apportate e ora dovrebbero essere eliminate dal codice.
still_dreaming_1

Non ci credo più, o almeno mi rendo conto dell'aspetto pratico della verità che stai dicendo, specialmente in una base di codici legacy, quindi questa è solo una spiegazione del punto che stavo cercando di fare in quel momento. In realtà, ora sono completamente in conflitto anche sul fatto di fare TDD su una nuova base di codici, figuriamoci ottenere una copertura del 100%. Da un lato, ogni forma di logica e ragione mi dice che entrambe le cose dovrebbero essere buone, eppure in pratica non riesco a renderlo pratico. Quindi qualcosa non va nel mondo della programmazione, abbiamo bisogno di un nuovo paradigma.
still_dreaming_1

1

Non lo faccio naturalmente, ma l'ho fatto su due grandi progetti. Se hai comunque un framework per i test unitari, non è esattamente difficile, ma si aggiunge a molti test.

C'è qualche ostacolo particolare che stai incontrando che ti impedisce di colpire quelle ultime righe? In caso contrario, se ottenere una copertura dal 95% al ​​100% è semplice, quindi potresti anche farlo. Dato che stai chiedendo qui, suppongo che ci sia qualcosa. Cos'è quel qualcosa?


Questa è una delle migliori risposte qui. Chiedere cosa impedisce a una riga di codice di essere facilmente trattabile è una buona domanda. Ottenere quelle linee coperte ti costringerà a migliorare il codice per farlo accadere, quindi sarà una vittoria, una vittoria.
still_dreaming_1

0

Il 92% va bene. Sento che le vere domande sono:

  • Il 92% è ormai la "nuova" norma? Se il prossimo sprint prevede un test dell'88%, andrà bene? Questo è spesso l'inizio dell'abbandono delle suite di test.

  • Quanto è importante che il software funzioni e non abbia bug. Hai dei test per questi motivi, non "per motivi di test"

  • C'è un piano per tornare indietro e compilare i test mancanti?

  • Perché stai testando? Sembra che il focus sia% della linea coperta e non funzionalità


"Quanto è importante che il software funzioni e non abbia bug"? Buona domanda. Qual è la definizione di un bug? Qualcosa che non funziona come previsto. Se è corretto che un codice non funzioni correttamente, non scriverlo. L'intero punto del codice è che funzioni.
still_dreaming_1

0

Martin Fowler scrive nel suo blog :I would be suspicious of anything like 100% - it would smell of someone writing tests to make the coverage numbers happy, but not thinking about what they are doing.

Tuttavia, ci sono persino standard che impongono una copertura del 100% a livello di unità. Ad esempio, è uno dei requisiti degli standard della comunità europea dei voli spaziali (ECSS, European Cooperation for Space Standardization). Il documento collegato qui , racconta un'interessante storia di progetto che aveva l'obiettivo di raggiungere il 100% di copertura dei test in un software già completato. Si basa su interviste con gli ingegneri coinvolti che hanno sviluppato i test unitari.

Alcune delle lezioni sono:

  • La copertura al 100% è insolita ma realizzabile
  • Talvolta è necessaria una copertura del 100%
  • Una copertura del 100% comporta nuovi rischi
  • Non ottimizzare per la metrica al 100%
  • Sviluppa una strategia adeguata per massimizzare la copertura
  • Una copertura del 100% non è una condizione sufficiente per una buona qualità

0

Forse chiedere se è fattibile e ragionevole non sono le domande più utili da porre. Probabilmente la risposta più pratica è quella accettata. Analizzerò questo a un livello più filosofico.

Una copertura del 100% sarebbe l'ideale, ma idealmente non sarebbe necessaria o sarebbe molto più facile da raggiungere. Preferisco pensare se è naturale e umano che fattibile o ragionevole.

L'atto di programmare correttamente è quasi impossibile con gli strumenti di oggi. È molto difficile scrivere un codice totalmente corretto e privo di bug. Non è semplicemente naturale. Quindi, con nessuna altra opzione ovvia, passiamo a tecniche come TDD e copertura del codice di tracciamento. Ma finché il risultato finale sarà ancora un processo innaturale, avrai difficoltà a convincere le persone a farlo in modo coerente e felice.

Raggiungere il 100% di copertura del codice è un atto innaturale. Per la maggior parte delle persone, costringerli a raggiungere questo obiettivo sarebbe una forma di tortura.

Abbiamo bisogno di processi, strumenti, lingue e codice che si associno ai nostri modelli mentali naturali. Se non riusciamo a farlo, non c'è modo di testare la qualità in un prodotto.

Guarda tutti i software là fuori oggi. La maggior parte si incasina abbastanza regolarmente. Non vogliamo crederci. Vogliamo credere che la nostra tecnologia sia magica e renderci felici. E così scegliamo di ignorare, scusare e dimenticare la maggior parte delle volte che la nostra tecnologia incasina. Ma se prendiamo una valutazione onesta delle cose, la maggior parte del software oggi disponibile è piuttosto scadente.

Ecco alcuni sforzi per rendere la codifica più naturale:

https://github.com/jcoplien/trygve

https://github.com/still-dreaming-1/PurposefulPhp

Il successivo è estremamente incompleto e sperimentale. In realtà è un progetto che ho iniziato, ma credo che sarebbe un grande passo avanti per l'arte della programmazione se potessi mai farmi dedicare del tempo per completarlo. Fondamentalmente è l'idea che se i contratti esprimono gli unici aspetti di un comportamento delle classi a cui teniamo e che stiamo già esprimendo i contratti come codice, perché non hanno solo le definizioni di classe e metodo insieme ai contratti. In questo modo i contratti sarebbero il codice e non avremmo bisogno di implementare tutti i metodi. Lascia che la biblioteca capisca come onorare i contratti per noi.


-2

Raggiungere il 100% sul nuovo codice dovrebbe essere molto realizzabile e se stai praticando TDD probabilmente lo colpirai di default poiché stai scrivendo deliberatamente dei test per ogni linea di codice di produzione.

Su un codice legacy esistente che è stato scritto senza test unitari, può essere difficile in quanto spesso il codice legacy non è stato scritto pensando ai test unitari e può richiedere molto refactoring. Quel livello di refactoring spesso non è pratico date le realtà del rischio e il programma in modo da fare degli scambi.

Nel mio team specifico la copertura del codice al 100% e se nella revisione del codice ne vediamo di meno, il proprietario tecnico del componente discute del perché il 100% non è stato raggiunto con lo sviluppatore e deve essere d'accordo con il ragionamento dello sviluppatore. Spesso se si verifica un problema a colpire al 100%, lo sviluppatore parla con il proprietario tecnico prima della revisione del codice. Abbiamo scoperto che una volta che hai preso l'abitudine e apprendi le tecniche per aggirare diversi problemi comuni con l'aggiunta di test al codice legacy che colpire il 100% regolarmente non è così difficile come penseresti inizialmente.

Il libro di Michael Feather " Lavorare efficacemente con il codice legacy " è stato prezioso per noi per aver escogitato strategie per aggiungere test al nostro codice legacy.


-3

No, non è possibile e non lo sarà mai. Se fosse possibile, tutta la matematica cadrebbe nel finitismo. Ad esempio, come testereste una funzione che ha preso due numeri interi a 64 bit e li ha moltiplicati? Questo è sempre stato il mio problema con i test rispetto a dimostrare che un programma è corretto. A parte i programmi più banali, i test sono praticamente inutili in quanto coprono solo un numero limitato di casi. È come controllare 1.000 numeri e dire che hai dimostrato la congettura di Goldbach.


Oh! Quindi qualcuno è sconvolto dal fatto che non ho risposto al problema sul piano della sua concezione; test è uno spreco ... non mi interessa se è popolare. Non funzionerà mai. Non può. Gli scienziati informatici più intelligenti lo hanno saputo (Dijkstra, Knuth, Hoare et al.). Immagino che se sei un programmatore JavaScript che ostacola la programmazione eXtreme, allora non ti importa di quelle manovelle. Blah, qualunque cosa, a chi importa ... scrivere un codice scadente. Spreco di CO ^ 2 durante l'esecuzione dei test. - Voglio dire, chi ha più tempo di sedersi e pensare più? Lo abbiamo esportato sul computer.
sciocco

3
La domanda è taggata "TDD". TDD è più uno strumento di progettazione e uno strumento di esplorazione dei problemi che un test, e ogni "test" è solo un esempio di come il codice si comporterà in un contesto, in modo che le persone possano leggere e capire cosa sta succedendo, quindi cambiarlo in modo sicuro . TDD ben fatto tende a portare a codice più pulito e più facile da usare, e l'esecuzione dei test verifica solo che la documentazione sia aggiornata. La maggior parte delle suite TDD quasi mai cattura bug; non è quello per cui sono lì. Penso che il tuo voto sia stato annullato perché la tua risposta tradisce quella mancanza di comprensione, e spero che questo commento ti aiuti.
Lunivore,
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.