Il ciclo TDD è test, codice, refactoring, (ripetizione) e quindi spedizione. Come suggerisce il nome TDD, il processo di sviluppo è guidato da test, specificamente significa writing tests first prima di sviluppare o scrivere codice.
Il primo paragrafo è puramente definitorio ... da come Kent Beck defines TDD ... o come Wikipedians generally understand TDD ... ho pensato che fosse necessario picchiare con violenza il punto con questa definizione, perché io non sono sicuro se tutti sono discutere davvero lo stesso TDD o se gli altri capiscono veramente le implicazioni della [parte più importante o la] definizione di TDD, le implicazioni dei test di scrittura prima. In altre parole, penso che più l'attenzione delle risposte a questa domanda dovrebbe approfondire un po 'più a fondo il TDD, piuttosto che spiegare un pregiudizio per/contro UML. La lunga parte della mia risposta riguarda la mia opinione sull'uso di UML per supportare TDD ... UML è solo un linguaggio di modellazione, certamente non richiesto per fare TDD; potrebbe intralciare se applicato in modo inappropriato ... ma UML può aiutare a capire i requisiti per scrivere test, come la modellazione può aiutare il refactator se necessario e come la raccolta degli artefatti del processo accelera la documentazione del codice spedito. Gradirei qualsiasi commento, critica o suggerimento, ma per favore non votare la mia risposta in alto o in basso perché sei d'accordo o non sei d'accordo con il primo paragrafo ... l'acronimo TDD è Test-Driven Development che significa Test-First Development .
Scrivi prova in primo luogo implica che lo sviluppatore capisce le specifiche ei requisiti PRIMA ... ovviamente, ogni prova è scritto dovesse fallire fino a quando il codice viene scritto, ma in TDD, il test di deve essere scritto primo - non è possibile eseguire TDD senza concentrarsi sulla comprensione delle specifiche dei requisiti prima di scrivere i test, prima di scrivere il codice. Ci sono situazioni in cui i requisiti non esistono affatto; l'elicitazione dei requisiti comporta un po 'di hacking una versione pre-pre-alpha per "buttare il fango sul muro per vedere cosa si attacca" ... quel genere di cose non dovrebbe essere confuso con lo sviluppo, certamente non lo sviluppo basato sui test, è fondamentalmente solo una forma di requisiti-elicitazione per un dominio applicativo scarsamente compreso.
I diagrammi UML rappresentano una forma di requisiti per TDD. Non l'unico, ma probabilmente meglio delle specifiche scritte se sono disponibili persone che sono ben informate nella creazione di diagrammi UML. Spesso è meglio lavorare con diagrammi visivi per una migliore comunicazione nell'esplorazione del dominio del problema [con utenti/clienti/altri fornitori di sistemi] durante le sessioni di modellazione dei requisiti di pre-implementazione ... dove la simulazione delle prestazioni è necessaria per la comprensione dei requisiti (es. Interazioni di rete CANbus); spesso è l'ideale se possiamo lavorare con un linguaggio specifico o uno strumento CASE come Rhapsody o Simulink RT Workshop che può essere eseguibile, modulare e completo ... UML non è necessariamente parte di TDD, ma fa parte di una sintesi progettuale di approccio che comporta un maggiore sforzo per capire cosa è necessario prima di scrivere qualsiasi codice [e quindi perdere tempo a cercare di commercializzare quel codice a qualcuno a cui importa]; in generale, maggiore attenzione alla comprensione dei requisiti di sistema pone le basi per iterazioni di TDD agili più efficienti e produttive.
Il refactoring riguarda il miglioramento della progettazione: pulizia del lavoro, codice testato per semplificare e semplificare la manutenzione. Volete restringerlo il più possibile per rimuovere i grovigli offuscati in cui i bug potrebbero nascondersi o potrebbero generarsi nelle versioni future - non si refactoring perché un cliente lo richiede; si refactoring perché è più economico spedire codice pulito piuttosto che continuare a pagare il costo del supporto/mantenimento del pasticcio complesso. Generalmente, la maggior parte di TDD è più focalizzata sul codice; ma, potresti utilizzare UML per esaminare un ambito più ampio o fare un passo indietro per esaminare il problema, ad es. creare un diagramma di classe per aiutare a identificare test [mancanti] o possibili refactoring. Questo non è qualcosa che avresti bisogno di mandare o voler fare su base generale, ma se del caso.
L'ultimo passaggio, 'nave' è un passo serio ... 'nave' non è una scorciatoia per "lanciarlo oltre il muro e dimenticarlo, perché il buon codice non ha bisogno di supporto" o "abbandona e spera che non ci sono più iterazioni. " Dal punto di vista finanziario o aziendale, la spedizione è il passo più importante di TDD, perché è dove vieni pagato. La spedizione implica "cambi marcia" perché include integrazione di sistemi, preparazione per il supporto e la manutenzione, preparazione per il prossimo ciclo di sviluppo, ecc. L'uso principale dei diagrammi UML sarà di comunicare [in termini astratti] come il codice fa che cosa fa ... UML è utile perché si spera che i diagrammi siano un artefatto dei requisiti e dei processi di sviluppo; non è necessario ripartire da zero quando il codice viene spedito ... come strumento di comunicazione, UML sarebbe appropriato per ridurre errori di integrazione sistemi multi-modulo, progetti più grandi che potrebbero coinvolgere moduli scritti in lingue diverse, reti di sistemi embedded in cui diverse società deve collaborare a sistemi critici per la sicurezza, ma è necessario che l'astrazione sia avara o protettiva della loro "conoscenza proprietaria".
Proprio come si dovrebbe evitare di usare un grosso martello in situazioni in cui un piccolo cacciavite è appropriato O non si arriverà da nessuna parte chiedendo a tutti gli sviluppatori di standardizzare l'uso di Emacs come editor. A volte la vista non vale la salita - non si vuole sempre tirare fuori lo striscione UML o diventare noto un ragazzo che stava sempre spingendo UML ... in particolare non in situazioni dove non ci sono sostituti per scrivere test o leggere codice. Se ti attieni alle situazioni appropriate, non dovresti aver paura di usare UML come linguaggio di comunicazione in tutte le situazioni in cui la lingua ti aiuta.
@Downvoter: non importa se non dici _why_ hai downvoted. –
Il test delle unità richiede innanzitutto che lo sviluppatore sappia cosa deve fare l'unità. Sembra utile quindi forse per consolidare ciò che pensi che dovrebbe essere il codice in modo che tu abbia almeno un'idea di quali potrebbero essere le responsabilità di ogni classe. Se alla fine diventano qualcosa di completamente diverso, va bene anche questo. Finché non è pensato come incastonato nella pietra, UML sembra un buon modo per far rotolare la palla se non riesci a trovare un punto di partenza. –