Devi davvero fare BDD / TDD in un primo modo di prova?


11

Anche se non ho partecipato a un progetto TDD o BDD, o lo sono stato in alcuni che affermano che stanno facendo TDD ma sono piuttosto lontani da ciò, queste sono cose a cui penso e cerco davvero di leggere il più possibile di.

Torna alla domanda Quando fai BDD dovresti prima scrivere il tuo "test" e farlo fallire, giusto? E quindi implementare quella funzione o come la chiami tu. Ma se lo porti all'estremo non potrebbe essere una sorta di sviluppo top-down? Stai guardando la tua interfaccia utente e dice "Vorrei avere questa caratteristica / comportamento qui". Quindi correggi l'interfaccia utente per implementare quella funzione e il codice che supporta l'interfaccia utente. A questo punto non hai implementato alcuna logica aziendale o logica di accesso ai dati, hai appena implementato il tuo comportamento. Quello a cui sto puntando invece di scrivere prima il test scrivi prima il tuo codice UI. In alcuni casi dovrebbe risultare lo stesso codice per l'accesso ai dati e il livello aziendale, poiché si utilizza il codice dell'interfaccia utente per definire ciò che l'azienda deve supportare.

Ovviamente dovresti integrare questo con i test usati per assicurarti che la funzione funzioni come dovrebbe nella funzione.

qualche idea?


I test in TDD sono test unitari , che guidano direttamente il modulo, proprio come se fosse attraverso un separato main. Nel tuo commento dall'alto verso il basso, stai parlando di test funzionali, che eseguono l'intero programma attraverso un singolo main.
Macneil,

@Macneil: non parlo di test funzionali che testano l'intero programma, anche se stai implementando / progettando il tuo programma dall'alto verso il basso, dovresti comunque implementare unit test per tutto il tuo codice pubblico. Solo perché lo fai dall'alto verso il basso non significa che non puoi rendere astratti diversi livelli in modo da poter isolare tutti i livelli da solo.
Tomas Jansson,

1
@Macneil: questo è un malinteso comune. I test TDD non sono test unitari . TDD verifica le funzionalità che non hanno una scala impostata.
Steven A. Lowe,

2
Ma esiste una scala prestabilita: il test deve essere eseguito rapidamente in TDD. Ci sono test che devono verificarsi anche al di fuori dell'ambito del TDD. Nel complesso, TDD è un piano di sviluppo, non un piano di test.
Macneil,

@Macneil: "rapidamente" è un termine relativo. La suite di test nel mio ultimo progetto viene eseguita in circa 30 minuti. Sostituisce 8 ore di test manuali. Questo è "rapidamente" abbastanza!
Steven A. Lowe,

Risposte:


8

Stai parlando di BDD da una prospettiva di alto livello di test dell'interfaccia utente. Il test è un po 'più soffice a questo livello rispetto al basso nel codice JavaScript / lato server.

Diversi libri che ho letto su TDD dicono che dovresti scrivere codice come se esistessero i sistemi sottostanti e scrivere abbastanza per far passare il test. È possibile scrivere stub sul server per ottenere il superamento dei test comportamentali dell'interfaccia utente. Quindi si inizia da questo stub seam e si scrivono alcuni test unitari per il codice lato server e si procede fino a una completa implementazione.

Spesso codice come se esistessero strati sottostanti per far passare un test di alto livello, mi sembra di scendere in una tana di coniglio ed estrarre molte altre classi per soddisfare il test di alto livello, e quindi scrivere test per questi livelli inferiori. Come hai già riconosciuto, ti aiuta a rimanere concentrato a partire da test di livello superiore.

Come ogni programmatore esperto sa, ci sono molti livelli per lo sviluppo del software. Tendo a lavorare al di sotto dell'interfaccia utente e pensare ai dati o al comportamento della mia interfaccia utente dal server e iniziare da lì (forse perché al giorno d'oggi non faccio molto lavoro con l'interfaccia utente).

Se sono davvero onesto, l'estrazione di una classe dai livelli sottostanti significa che non eseguirò prima il test ma ... entro pochi minuti o qualche ora avrò un test per quel codice. Mi sento ancora utile poiché posso aiutare a capire dove potresti dover fornire dipendenze a una classe e onorare il principio della singola responsabilità - se è difficile testarlo, stai facendo troppo in un posto, ecc.


Penso che tu abbia ragione. Questo mi è venuto in mente quando ho provato Ruby su rotaie quest'estate, lì hanno alcuni test bdd che guidano l'interfaccia utente che in seguito guida l'implementazione delle classi sottostanti.
Tomas Jansson,

17

Sì! Altrimenti, ciò che ottieni è un test guidato dallo sviluppo .

Realisticamente parlando, tuttavia, ci sono problemi che sono difficili da affrontare usando TDD "puro". Potresti essere più produttivo scrivendo un codice di produzione scoperto scoperto e coprendolo con i test in seguito (e imparando come affrontare problemi simili con TDD in futuro). Guarda questa tecnica , che il suo autore ha chiamato TDD risciacqua e ripeti per mancanza di un termine migliore.


3
La prima riga è fantastica.
Epsilon,

Rispetto al TDD è vero, ma fare le cose dall'alto in basso dovrebbe allinearsi abbastanza bene con BDD, giusto? Guardo la GUI e specifica il comportamento che desidero, sicuro di non scrivere subito il "test comportamentale", ma ho specificato il comportamento nell'interfaccia utente prima di implementarlo.
Tomas Jansson,

15

Se non scrivi prima i test, non stai guidando lo sviluppo attraverso i test. Ergo, non stai facendo uno sviluppo guidato dai test!


Ad essere onesti, la domanda non è più se nel fare BDD (non TDD) se dovremmo scrivere prima il test?
bytedev,

Sentiti libero di sostituire "test" con "comportamento". Non ho visto nulla per convincermi che, a fondo, c'è molta differenza tra TDD e BDD. Focus, forse. Ma l'idea principale? Non così tanto.
Frank Shearar,

Non sono d'accordo con il fatto che non stai facendo uno sviluppo guidato dai test. Non lo stai facendo in base alla definizione del termine con chiave, ma finché stai sviluppando test per il tuo codice, il codice sarà sicuramente guidato dai test, indipendentemente da quando li scrivi.
alternativa il

TDD significa specificamente scrivere test prima del codice. Se non ti piace, prendilo con Kent Beck, che ha inventato il termine. Scrivere test dopo il tuo codice potrebbe guidare il tuo codice in una certa misura, ma puoi ancora indurti a credere che stai guidando la progettazione del codice attraverso i test quando non lo sei. Ed è più difficile scrivere quei test, perché spesso devi cambiare il codice non testato . Visto troppo spesso per menzionare.
Frank Shearar,

@FrankShearar Ho riconosciuto che non è TDD secondo quello che ha detto Kent Beck, ma francamente non mi importa di quello che ha detto una persona a caso. È perfettamente possibile guidare la progettazione del codice attraverso test senza scrivere prima i test.
alternativa il

4

Se vuoi lavorare in questo modo, provaci. Ma non è sviluppo test-driven.


3

Quello che descrivi sembra molto simile all'approccio Front-Ahead Design . Sfortunatamente, Front-Ahead Design è la pugnalata satirica di Alex Papadimoulis a metodi agili.


Mi chiedevo se conoscessi qualche articolo che combatte contro FAD, ridimensionando la sua pugnalata satirica?
CL22,

3

Personalmente, credo che sia fondamentale pensare ai test durante la fase di progettazione. È davvero fantastico avere un'implementazione funzionante, ma l'unico modo per essere sicuri di avere un prodotto funzionante è se lo hai testato pezzo per pezzo. Il modo per affrontarlo è attraverso una combinazione di test unitari e un team qualificato di controllo qualità che lavora in partnership.

Ora come installare questa dicipline nel tuo team dipende da te. TDD è una di queste strategie - e una che ha il suo posto, e ci sono molte altre varianti. Tuttavia, TDD non è particolarmente adatto allo sviluppo del layout dell'interfaccia utente.

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.