2015-07-15 13 views
5

Ho letto di TDD e l'ho provato sul mio nuovo progetto.Come fare a Test Driven Development in modo corretto?

TDD cycle

Capisco che in TDD è come test blackbox, vale a dire che conta quello piuttosto che come .Quindi, ho concluso e si fermò metodi di prova privati ​​dopo aver letto su molti post come non è il modo corretto.

Tuttavia, non sono riuscito a farlo a causa di questi motivi.

Vi mostrerò l'esempio: Ho un programma che legge un paragrafo di testo, quindi ho scritto qualcosa di simile nel mio metodo di test (per tdd step1).

/* 
My program reads a textual paragraph from file and saves it to my custom paragraph object; 
*/ 

Quindi di conseguenza ho fatto questo metodo per creare il RED caso .

public void paragraphMustNotBeNullTest(){ 
File f = new File("some path") 
ParagraphReader reader= new ParagraphReader(); 
reader.read(); 
assertNotNull("my custom paragraph is null",reader.getCustomParagraph()); 
} 

ho scritto seguente codice:

package com.olabs.reader; 

import java.io.FileInputStream; 
import java.io.InputStream; 

import com.olabs.models.OlabsParagraph; 

public class Para { 


    private String paragraphText = null; 
    private Paragraph oParagraph = null; 

    public Paragraph getCustomParagraph() { 
     return oParagraph; 
    } 
    public void setoParagraph(Paragraph oParagraph) { 
     this.oParagraph = oParagraph; 
    } 

    public void read() { 
     InputStream is = new FileInputStream("abc......"); 
//  .. 
     String text = is.read(); // assume I got text read from file. 
     this.paragraphText = text; 
    } 


    private void createCustomParagraph() 
    { 
     Paragraph p = new Paragraph(); 
     p.setText(paragraphText); 
     p.setId(1); 
     p.setType("Story"); 
     ........... 
    } 

    private void countWords() 
    { 
     // counting words in paragraph logic 
    } 


} 

Ora il problema è che io so in anticipo che userò countingwords e createCustomParagraph come metodi privati.

Così, in questo caso devo andare con:

  1. crearli come pubblico e seguire il ciclo TDD.

  2. renderli privati.

  3. eliminare i test per loro (poiché i metodi sono ora privati ​​e inaccessibili per i test). Penso che questo sia un modo piuttosto ingombrante e scorretto per fare tdd.

Sono confuso su this.Everyone dice scrivere il codice solo dopo che si scrive un test in mancanza, ma qui se so che sto per scrivere un metodo privatoallora come farò a fare questo?

Vi chiedo di correggermi se sbaglio da qualche parte. Anche se possibile, dare qualche esempio reale ...

Inoltre, temo che la maggior parte del tempo mi sarà test di editing o la rimozione a causa di problemi di accesso prescrittori o refactoring ...

Nota: Questa è non una domanda doppia. Non ho una buona risposta per le situazioni in tempo reale. In tutti gli esempi che ho visto, mostrano solo una singola classe con specificatori di accesso pubblico o predefiniti, quindi in realtà non mostrano esattamente come lavorare nel progetto in tempo reale.

+2

I metodi privati ​​sono (direttamente o indirettamente) richiamati da alcuni metodi pubblici. Metti alla prova i metodi pubblici. Ergo, tu testi i metodi privati ​​(indirettamente). Cosa ti confonde esattamente? – Turing85

+0

Quindi intendi reader.read(); la chiamata al metodo è sufficiente? cioè continuerò a scrivere metodi privati, non passerò attraverso il ciclo rosso verde giallo per questi nuovi metodi privati ​​(presumo in quell'istante che dovrebbe essere privato) che creo? – swapyonubuntu

+1

Se si introduce un nuovo metodo privato (e molto probabilmente buggato) (utilizzato da un metodo pubblico), scrivere un test non riuscito (e lo fa perché il metodo privato non funziona correttamente). – Turing85

risposta

4

Dalla mia esperienza personale, si sta testando la classe e l'interfaccia per la classe dal resto dell'applicazione. I casi di test TDD devono essere scritti rispetto ai metodi pubblici della classe.Il punto è testare che quando stimolato, la classe emette i risultati desiderati per superare i criteri del test. I metodi privati ​​interni verranno testati come parte dei test dell'interfaccia pubblica, ma l'obiettivo è verificare che l'interfaccia accessibile al pubblico funzioni. Dici di sapere in anticipo che i metodi privati ​​saranno utilizzati, ma se qualcuno si rifiuta di capire come sono fatte le cose nella classe senza cambiare il comportamento esterno, sarai comunque in grado di usare i tuoi test esistenti e verificare che il refactoring non abbia rotto un metodo precedentemente funzionante.

+0

significa che quando scrivo un metodo pubblico come reader.read(), posso continuare a scrivere altri metodi all'interno della classe del lettore (presumo che saranno privati ​​perché ho finito di scrivere public read) senza seguire il ciclo tdd per loro (es. rosso greem giallo per ogni metodo) come il mio unico metodo pubblico in questo caso (secondo il mio assunto e il metodo di chiamata ovvio sarà letto()) .. – swapyonubuntu

+0

Lo scopo della classe è quello di fornire le funzionalità dei metodi pubblici . Tutto ciò che accade all'interno della classe privata è supportato dai metodi pubblici. Se si utilizza l'approccio black box, l'implementazione interna può essere qualsiasi cosa fintanto che la funzionalità pubblica sta passando i test. –

+0

Devo concludere che l'interfaccia pubblica verrà creata, riformulata e scomposta in metodi privati ​​... e solo il metodo pubblico verrà chiamato nei test. Non sono sicuro se sto facendo tdd modo giusto. – swapyonubuntu

1

Se un metodo è un dettaglio di implementazione della cosa principale che si sta costruendo e che dovrebbe rimanere privato, ciò non significa che non ci sia modo di scrivere un test per questo. Puoi rendere questa funzionalità parte di un'altra classe in cui può essere pubblica, scrivere test che la esercitino direttamente, quindi chiamarla privatamente dalla cosa principale. In questo modo è possibile testare i metodi privati, nessun test viene eliminato e non è necessario passare attraverso le contorsioni per testare qualcosa indirettamente quando la cosa che lo utilizza non può esporre l'accesso a tutto ciò che si desidera testare. E ora invece di avere metodi privati ​​che sono pezzi nascosti di codice gnarly, hai blocchi di costruzione ben testati pronti per il riutilizzo da qualche altra parte.

+0

in questo caso non pensi di modificare il design per motivi di test. Puoi pubblicare un esempio? – swapyonubuntu

+1

@swapyonubuntu: va bene, è per questo che lo chiamano TDD. forse più tardi. –

0

Ottima domanda. L'ho anche chiesto molte volte. E in generale le risposte dicono che devi pensare ai test unitari che precedono un'implementazione delle funzionalità principali come i telai . Questi frame definiscono rigorosamente la funzionalità.

Quindi potresti anche non conoscere i metodi privati ​​prima di implementare alcune classi particolari. Ma dal momento che hai una serie di prove RED, l'unica cosa che devi fare è renderle verdi. Non importa come lo farai (metodi pubblici o privati).

Un obiettivo numero uno è scrivere le righe minime di codice, che devono essere coperte da dal test di unità. Ho coperto più approfonditamente il TDD topic sul mio blog.

Problemi correlati