2010-06-13 30 views
11

Sono nuovo all'approccio TDD quindi mi chiedo se qualcuno con esperienza di spirito potrebbe illuminarmi un po '. Mi piacerebbe avere alcuni suggerimenti su come utilizzare insieme la metodologia UML e TDD.TDD e UML insieme

Sono stato abituato a: Progettare con UML -> Generare classi di scheletro (e quindi mantenerlo sincronizzato) -> Implementare e infine Testare. Devo ammettere che la parte di test è stata la peggiore, quindi ho iniziato a cercare qualcos'altro - TDD. Quindi ho una conoscenza generale di cosa si tratta, ma prima di procedere ulteriormente, sono interessato a sapere come va insieme al software design, in particolare UML.

Così quando progetto/creo per la prima volta il test, come si può inserire UML? Sarebbe possibile progettare prima le classi, da loro creare classi di scheletri, da esse generare test di unità che sarebbero "riempiti" prima dell'attuazione effettiva delle classi pregenerate UML, questo approccio interromperà l'intero TDD? O c'è un altro modo per mantenere insieme UML e TDD?

risposta

6

Quindi, quando progetto/creo il test, , come può entrare UML?Sarebbe possibile progettare classi prima, da loro di creare classi scheletro, da a generare unit test che sarebbe essere "riempiti" prima effettiva attuazione UML pregenerato classi, sarebbe questa pausa approccio tutta TDD? O esiste un altro modo che manterrebbe UML e TDD insieme?

Se si crea una intera classe skeleton - da che presumo si intende una classe con tutti i metodi definiti ma vuota - prima di scrivere il primo test, allora direi che non stai facendo TDD, e perdere i vantaggi di TDD. Come facciamo TDD - Test-Driven Design - i nostri test ci portano gradualmente ai seguenti elementi - metodi e classi - che il nostro programma ha bisogno. Se hai predeterminato, pre-specificato in UML, quali sono le tue classi e i tuoi metodi, gran parte del tuo design è già stato fatto, e il tuo sviluppo successivo è costretto a seguirlo, o hai sprecato gli sforzi che il lavoro successivo annulla.

Ci possono essere modi per utilizzare insieme UML e TDD per la progettazione, ma come lo hai descritto, stai facendo il disegno in UML, prima che TDD abbia una possibilità. Questo non ti darà tutti i benefici di TDD.

2

UML è la parte di progettazione, ovviamente.

Lo userei solo sul sistema con cui stavo finendo. Il rendering delle classi di test in UML mi sembra ridicolo.

Lo userei per avere un'idea generale di ciò che stavo creando. Quindi inizierei con TDD per implementarlo.

Per quanto riguarda il mantenimento del sincronismo, otterrei uno strumento UML che era in grado di importare ed esportare. Mi preoccuperei di più sul codice e meno su UML. È utile per catturare i tuoi pensieri e documentarli in seguito, ma non molto altro. Preferirei sempre lavorare, testare il codice sui diagrammi ogni giorno.

5

Se stai progettando classi utilizzando UML, stai progettando ciò che hai e pensi che il codice sia uguale a. Ma quello che tu crea usando TDD è la realtà.

Lascia UML fino alla fine per documentare i risultati del codice creato con TDD.

+2

@Downvoter: non importa se non dici _why_ hai downvoted. –

+0

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. –

6

Mentre alcune persone pensano che UML sia una metodologia di progettazione, è prima di tutto uno strumento di comunicazione. Da qui il nome, Unified Modeling Language. L'idea è di avere un vocabolario comune (di forme) che puoi inserire in un libro e tutti capiranno.

TDD d'altra parte è una metodologia di progettazione, il modo di costruire il sistema a partire dalla sua interfaccia e dal suo consumatore, e solo successivamente aggiungendo l'implementazione.

Una volta che il progetto è emerso come risultato dell'applicazione di TDD, è possibile comunicare tale progettazione utilizzando UML. Se non hai bisogno di comunicare (come se tu sia l'unico sviluppatore), probabilmente non hai bisogno di UML.

Alcune persone pensano all'analisi del dominio (identificando nomi chiave, verbi e aggettivi e costruendo un modello ontologico di base) come parte della metodologia UML, che si riflette nel caso d'uso & diagrammi ER ... Può essere utile fare prima di saltare nel ciclo TDD rosso/verde/refactoring. Poi di nuovo, in senso stretto, questo è DDD (Domain Driven Design), non UML di per sé.

+0

Potrebbe essere più costoso scrivere un'interfaccia, poi alcuni test, finalmente iniziare a implementare il codice per vedere che ti sei perso qualcosa di fondamentale, quindi devi cambiare interfaccia e test. Penso che potresti trarre grandi benefici dalla scrittura di alcuni UML e dalla creazione di interfacce da lì. –

12

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.

5

Oppure esiste un altro modo per mantenere insieme UML e TDD?

UML e TDD adattarsi meravigliosamente insieme:

  1. Fai il progetto iniziale in UML - non deve essere completo, solo coerente,
  2. creare il test vuoti autonomi. Questa fase potrebbe anche essere automatizzata
  3. Tutti i test fallirà a prima, come richiesto dal TDD (perché il codice generato dalla UML non ha alcun codice)
  4. Avvio test di scrittura per ogni classe
    1. Iniziare con classi che non hai molte associazioni se sei sicuro della tua architettura software e delle tue abilità UML (no, non stai facendo cascata, ma a volte sai solo cosa stai facendo - conosci già il dominio dell'applicazione o hai usato conoscenza esperta al punto 1)
    2. Iniziare con classi che hanno molte associazioni ("classi centrali") se non si è sicuri della propria comprensione del dominio dell'applicazione - questo renderà più facile da eliminare al più presto le decisioni di progettazione cattivi, perché si noterà il più presto possibile
  5. ... I test sono ancora riuscite
  6. Parallelamente a ogni unità in fase di sperimentazione (fase 4), scrivere l'implementazione all'interno dei corpi del metodo vuoto. NON modificare alcun nome di classe, interfaccia o metodo o firma dei parametri. È consentito soltanto per aggiungere private helper metodi, non di più
  7. Se al passo 6 (che è gestito in tandem con la fase 4) si rende conto è necessario apportare modifiche nella progettazione:
    1. andare alla fase 1 e perfezionare UML, quindi generare nuovamente il codice (i buoni strumenti UML non sovrascriveranno l'implementazione). Attenzione: evitare l'introduzione di nuove classi. Si vuole rifiniscono il punto 13 in poche settimane
    2. rieseguire il test e fissare la mancanza quelle che in precedenza erano OK
    3. continuare con quello che hai lasciato al punto 6
  8. Andare al punto 6, se non tutti i test di classe passano
  9. Procedere al test dei componenti, dei pacchetti e dei sottosistemi
  10. Aggiungere distribuzione per UML e distribuire l'ambiente di integrazione (http://en.wikipedia.org/wiki/Development_environment_%28software_development_process%29)
  11. Procedere al test di integrazione
  12. passare attraverso la fase di test/QA
  13. passare attraverso l'User Acceptance Testing
  14. Ribadire i passaggi precedenti come richiesto (in base al processo di sviluppo iterativo)
  15. ... mesi passano
  16. Deploy versione 1.0. 0 alla produzione

Non tentare di arrivare a molte decisioni di progettazione nella fase 1 o successive a reiterazioni della fase 1 (perfezionamento della progettazione). Si desidera completare il passaggio 13 nella prima iterazione dopo alcune settimane.