Qual è il valore della scrittura di ulteriori test unitari quando si riprogramma una funzione più grande in funzioni più piccole?

8

Se ho una complessa unità testata :

def do_everything():
    # turn twizzles
    # push buttons
    # move mountain

E lo ri-fattore in alcune unità più piccole:

def do_everything():
    turn_twizzles()
    push_buttons()
    move_mountain()

def turn_twizzles():
    # turn twizzles

def push_buttons():
    # push buttons

def move_mountain():
    # move mountain

Sto perdendo tempo scrivendo test unitari extra per quelle unità più piccole?

    
posta Adam Terrey 17.11.2017 - 02:37
fonte

4 risposte

15

Presumo che tu abbia già test unitari che coprono il comportamento di do_everything() ? Se hai rotto turn_twizzles() ecc. Come metodi privati, non hai modificato alcun comportamento esterno, quindi non devi modificare alcun test.

Se tuttavia turn_twizzles() è reso pubblico, hai introdotto una nuova funzionalità (osservata al di fuori della classe), quindi sarebbe utile testarla.

    
risposta data 17.11.2017 - 10:03
fonte
12

Dipende. Per essere più precisi, dipende da

  • la complessità della funzione originale (se fosse molto complessa, testare ciascuna parte da sola ripagherà)
  • la complessità delle funzioni più piccole (se sono parti complesse da sole, testarle singolarmente porteranno a test più precisi e un rilevamento più preciso delle cause alla radice in caso di un difetto)
  • i test unitari esistenti (se già producono una copertura sufficiente per tutte quelle "parti", allora probabilmente è meno utile scrivere test individuali)
  • se vuoi mantenere quelle "funzioni di implementazione" più piccole delle funzioni originali, o meno (per la prima, scrivere test di unità per le funzioni più piccole sarebbe controproducente per questo obiettivo).

Specialmente quando quelle "funzioni più piccole" non sono così banali come nel tuo esempio, ma avranno una lista più o meno complessa di parametri di input, può diventare davvero difficile produrre test di unità sufficienti per la tua funzione originale per garantire il più piccolo le funzioni sono testate con tutte le combinazioni di input "interessanti". Questo sarebbe un chiaro segno per scrivere test unitari specifici anche per le funzioni più piccole.

Quindi, non c'è un chiaro "sì" o "no" a questa domanda, è un trade-off che devi decidere per caso.

    
risposta data 17.11.2017 - 08:29
fonte
6

Se turn_twizzles , push_buttons e move_mountain sono pubblici e richiamati da un altro codice, penso che sia importante rifattorizzare i test per verificare singolarmente queste funzioni.

Sfortunatamente dopo il refactor hai un problema: al test unitario do_everything devi essere in grado di simulare turn_twizzles , push_buttons e move_mountain . Scrivere test per do_everything senza prendere in giro le dipendenze sarà un test di integrazione - non necessariamente una cosa negativa a seconda del piano di test, ma non ci sarà molto vantaggio perché stai già testando individualmente le tre funzioni più piccole. Questo potrebbe essere il momento giusto per riprogettare questo componente e collaborare con altri oggetti per eseguire tutto il lavoro di do_everything .

Se turn_twizzles , push_buttons e move_mountain non vengono chiamati esternamente, devono essere contrassegnati come privati e non è consigliabile testarli separatamente da do_everything . Questo perché da una prospettiva esterna, do_everything sarebbe l'unità più piccola (perché gli altri sono inaccessibili). Vedi anche questa risposta su come suddividere i metodi usando metodi privati.

    
risposta data 17.11.2017 - 02:50
fonte
4

No. I test di unità extra sono più precisi. Se move_mountain fallisce, fallisce un singolo test che dice in modo molto specifico cosa è andato storto.

Questa precisione riduce il tempo di debug, che è prezioso. Inoltre, poiché il test è più mirato, dovrebbe essere più veloce da eseguire rispetto a testare la stessa funzionalità tramite la funzione completa, fornendo un feedback più rapido, che è prezioso.

    
risposta data 17.11.2017 - 03:28
fonte

Leggi altre domande sui tag