Secondo questa risposta a questa domanda , una buona ragione per iniziare sempre con un test non riuscito ("Rosso") è assicurarsi che il test sia lavorando e che il codice che verrà scritto è ciò che fa passare il test. (mia parafrasi)
Dal momento che mi sembra che la capacità di scrivere un test prima che un codice sia stato scritto è una sorta di acume mentale che non tutti possono fare (non posso), sarebbe sufficiente se scrivo prima il codice, quindi scrivi il test, quindi ripristina la modifica del codice per vedere che il test fallirà senza la modifica del codice?
Supponiamo che possa essere automatizzato con una sorta di integrazione IDE - sarebbe una forma alternativa di TDD?
Negli ambienti di sviluppo in cui TDD è applicato da IDE / Framework, l'applicazione rigorosa delle regole meccaniche limita le opzioni dello sviluppatore per le ottimizzazioni?
Un esempio in cui potrebbe essere utile:
Supponiamo che il modulo e i suoi test di unità siano già stati completati e che funzionino entrambi correttamente. Ora, voglio introdurre un refactoring che migliorerebbe le prestazioni di una quantità sconosciuta riducendo il numero di chiamate di funzione interne , senza alcun cambiamento fondamentale nella esterna comportamento del modulo.
Perché non so quanti benefici otterrei da quel refactoring, non posso scrivere un test per questo. Ma senza un test fallimentare, non sono autorizzato a modificare il codice. Questo sembra un problema di pollo e uova.
Se sono autorizzato a scrivere un test fittizio che cattura semplicemente il numero di chiamate di funzioni interne nel vecchio / nuovo codice e quindi modifica il codice (nel nome di "refactoring"), ora posso aggiornare il mio test ( se il refactoring ha successo nel ridurre il numero di chiamate interne) per affermare che il numero di chiamate interne dovrebbe essere ridotto.
(Ripensamento)
Anche se, questo tipo di test delle prestazioni ha un'importanza minore rispetto ai test unitari richiesti:
- Vorrei mantenere il beneficio del codice più efficiente se non ci sono cambiamenti nei requisiti funzionali, e non voglio che gli altri "rifattorino" questo vantaggio basandosi sull'ipotesi che nessun requisito funzionale possa essere rotto.
- Tuttavia, se si verifica una modifica dei requisiti funzionali e se non è possibile soddisfare il livello di prestazioni corrente, è necessario soddisfare prima i requisiti funzionali. Dopodiché, un nuovo obiettivo di rendimento verrà impostato dalla sperimentazione.
(Disclaimer: non ho mai fatto rigoroso TDD (e sono scettico su di esso), anche se ho fatto test-presto-dopo-coding per diversi mesi.)
Altre riflessioni
- La modifica del codice in questa domanda sembra essere "sviluppo post-TDD", poiché si verifica bene dopo che tutti i requisiti funzionali sono stati soddisfatti e tutti i test sono stati effettuati. Pertanto, purché tutti i test dell'unità TDD originale continuino a passare, questo tipo di modifica del codice è considerato "tuning".