Metodi di test unitari che chiamano i servizi web dei fornitori

10

Ho una classe con un metodo pubblico Send() e alcuni metodi privati. Chiama un paio di servizi web ed elabora la risposta. L'elaborazione viene eseguita in metodi privati.

Voglio testare il codice unitario. La mia comprensione è che i test unitari dovrebbero testare il mio codice in modo isolato (cioè prendere in esame le risposte dei fornitori).

Credo inoltre che i metodi privati non debbano essere sottoposti a test dell'unità Ma se eseguo semplicemente il test del metodo Send () il mio codice non viene testato separatamente e dipende dalla risposta del fornitore.

Dovrei quindi rendere pubblici i miei metodi privati in modo da poterli testare con risposte simulate? Sembra una cattiva pratica dato che solo la classe dovrebbe aver bisogno di chiamarli.

Chiedo scusa se è una domanda di base, sono abbastanza nuova per il test delle unità.

Im usando c # e VS2010

    
posta Tom Squires 23.09.2011 - 10:36
fonte

3 risposte

18

È necessario separare il codice relativo ai servizi Web (ad esempio, l'invio e la ricezione di dati) dal codice che elabora i risultati. Spostare quest'ultimo codice in una classe distinta, rendendo pubblici i metodi necessari. Quindi puoi facilmente testare la logica di elaborazione, separatamente dalle dipendenze esterne.

Inoltre, rendi il tuo codice conforme al principio di responsabilità singola . Come regola generale, sentire la necessità di testare metodi privati è spesso un'indicazione che la classe ha troppe responsabilità, quindi dovrebbe essere refactored in più classi.

    
risposta data 23.09.2011 - 10:40
fonte
3

Penso che un test con tali dipendenze ( chiamata ai servizi web dei fornitori ) sia un test di integrazione piuttosto che un test unitario.

    
risposta data 23.09.2011 - 13:03
fonte
3

Come altri hanno affermato, se i tuoi test unitari hanno dipendenze esterne come servizi web o chiamate database, allora NON sono affatto test unitari, sono test di integrazione.

I test di unità reali possono essere eseguiti indipendentemente dai componenti esterni oltre al componente che devono essere testati e dovrebbero essere ripetibili indipendentemente dall'ambiente. Se i servizi web esterni non funzionano, il test dell'unità non dovrebbe fallire.

Ci aggiriamo usando un Mocking Framework. Gli oggetti fittizi ci consentono di creare una simulazione di un componente in modo che il componente nel nostro test dell'unità utilizzi questi oggetti simulati anziché reali. Possiamo iniettare oggetti mock nel componente testabile e specificare quale argomento (o) ci stiamo aspettando, cosa vorremmo che restituisse quando viene chiamato, anche quale eccezione vorremmo che generasse. Consiglio vivamente di leggere di più sull'argomento in quanto migliorerà l'affidabilità e l'indipendenza dei test delle unità.

Per un buon post su diversi C # mocking framework vedi il seguente thread SO:

link

EDIT: Per quanto riguarda la sensibilità, disporrai del fatto che trascuro di menzionare DbUnit o altri strumenti transazionali che possono ripristinare le modifiche al database alla fine del test. Anche questi sono ripetibili e possono essere indipendenti dall'ambiente con i dati di test generati, pertanto in questo caso non è necessario un quadro di simulazione.

    
risposta data 23.09.2011 - 13:11
fonte

Leggi altre domande sui tag