Su quale livello di astrazione faresti TDD?

3

problema

Mi trovo a inchiodare la struttura della classe avendo troppi test unitari che rendono difficile apportare modifiche.

Esempio

Supponiamo di avere una classe A che utilizza le classi B1 e B2. La classe B1 utilizza le classi C1 e C2.

ComincioscrivendoitestprimaperlaclasseA.Durantequestoprocesso,vengonocreateleclassiB1eB2.PerassicurarmicheleclassiB1eB2funzionino,inizioascriveretestperB1eB2.LostessoperC1eC2.

Ora,finiscoperaveretestunitaripertuttiidiversilivellidiastrazione.SupponendochelaclasseAfosseadesempiounsistemadibustepagaeleclassiB1,B2,C1eC2sononatementresicostruisceA.

Domanda

Dovehosbagliatonelmioprocesso?NondovreiaverscrittoproveperilivelliBeC?ImieitestunitaridilivelloAdovrebberocopriretuttelefunzionalitàdeilivelliBeC?

Qualèilprocessocheporteràaitestunitari"corretti" e a un design flessibile?

Forse puoi fare un esempio con due o più livelli di astrazione e mostrarmi il tuo processo e il codice (inclusi test unitari e codice di produzione e design) che vengono fuori dal tuo processo.

    
posta Lernkurve 31.01.2014 - 23:33
fonte

2 risposte

6

È interessante notare che recentemente Justin Searls ha scritto un post sul blog che copre questo argomento. Ha identificato 6 cause che potrebbero generare il dolore che stai sperimentando usando TDD e suggerire un approccio diverso per imparare TDD.

Penso che possa riguardare ciò che stai descrivendo nel tuo flusso di lavoro.

Ecco un riepilogo dei 6 diversi errori identificati da Justin quando si applica TDD.

  • Failure #1: Encouraging Large Units
  • Failure #2: Encouraging Costly Extract Refactors
  • Failure #3: Characterization Tests of Greenfield Code
  • Failure #4: Redundant test coverage
  • Failure #5: Eliminating Redundancy Sacrifices Regression Value
  • Failure #6: Making a Mess with Mocks

In risposta a questo post, lo zio Bob distrugge tutto. ( con un'eccezione riguardante l'architettura / design in alto).

Fondamentalmente lo zio Bob ci ricorda i principi fondamentali alla base di TDD. E questo è dove penso che troverai la tua risposta.

  1. Codifica prima il test. (test fallisce (rosso))
  2. Codifica la logica (test è verde)
  3. Refactor per rendere il tuo codice leggibile e mantenibile.

Uncle Bob dice:

... the Author argues that the new smaller units need new unit tests. That's news to me. I certainly don't rewrite my tests just because I extracted some functions or classes.

TDD è la pratica da provare per prima. Non richiede che una classe abbia il test unitario associato. Finché stai provando prima. Assicurati che l'intenzione dei tuoi test sia molto chiara e specifica. Ti aiuterà a rettificare correttamente il tuo codice (una volta che il test è verde), identificando correttamente le diverse responsabilità e interfacce che devi estrarre.

Inoltre mi assicuro che i miei test siano leggibili in quanto potrebbero essere letti come una forma di documentazione che specifica l'intenzione dietro al codice. A volte ciò implica che devo rifattirli e potrei finire con i test unitari per le mie diverse classi, o forse non del tutto.

Uncle Bob termina il suo articolo con un buon materiale per l'architettura. Spiega quando fare il front design e quando non farlo. Fondamentalmente, lo fai quando sai che ci sarà una separazione di preoccupazione. Ecco cosa dice a riguardo:

... So our up front decisions can be limited to choosing a user experience, and choosing the architectural pattern that is most consistent with that user experience. Once those choices are made, we can TDD the problem domain into existence.

Spero che troverai utili quei due post del blog. Mi è sicuramente piaciuto leggerli.

    
risposta data 01.02.2014 - 08:02
fonte
3

Non hai sbagliato.

  • TDD coinvolge i test unitari; cioè, verifica i metodi. Hai metodi a tutti e tre i livelli del tuo progetto, non solo il livello A.

  • Scrivere test al livello A per testare la funzionalità attraverso i livelli B e C non è TDD; è un test di integrazione. Lo vuoi ancora fare, ma non ha nulla a che fare con i tuoi test unitari.

  • Metti alla prova i tuoi metodi individuali a vari livelli del progetto, separandoli dagli altri livelli. Questo può essere fatto usando mock o stub.

Vale la pena notare È un comune malinteso che la pratica del TDD "automaticamente" crei un progetto architettonico per il tuo programma. Non lo farà. Devi ancora creare un'architettura per il tuo programma. Ciò che TDD farà ti costringerà a scrivere codice testabile, che ti aiuterà a creare un'architettura ragionevole e solida.

    
risposta data 31.01.2014 - 23:38
fonte

Leggi altre domande sui tag