Scrittura test per codice il cui scopo non capisco

58

Recentemente ho completato un refactoring black-box. Non riesco a verificarlo, perché non riesco a capire come testarlo.

Ad un livello elevato, ho una classe la cui inizializzazione implica l'acquisizione di valori da una classe B. Se la classe B è "vuota", genera alcuni valori predefiniti sensibili. Ho estratto questa parte in un metodo che inizializza la classe B con le stesse impostazioni predefinite.

Devo ancora elaborare lo scopo / contesto di ciascuna classe, o il modo in cui verrebbero utilizzati. Quindi non posso inizializzare l'oggetto da una classe vuota B e controllare che abbia i valori giusti / faccia la cosa giusta.

La mia migliore idea è di eseguire il codice originale, l'hardcode nei risultati dei metodi pubblici a seconda dei membri inizializzati e testare il nuovo codice con quello. Non riesco a capire bene perché mi sento vagamente a disagio con questa idea.

C'è un attacco migliore qui?

    
posta JETM 23.02.2017 - 14:07
fonte

2 risposte

121

Stai andando bene!

La creazione di test di regressione automatici è spesso la cosa migliore che puoi fare per rendere un componente riparabile. Può essere sorprendente, ma tali test possono spesso essere scritti senza la piena comprensione di ciò che il componente fa internamente, purché comprendiate le "interfacce" di input e output (nel significato generale di quella parola). L'abbiamo fatto più volte in passato per applicazioni legacy in piena regola, non solo per le classi, e spesso ci ha aiutato a evitare di rompere cose che non avevamo compreso appieno.

Tuttavia, dovresti avere abbastanza dati di test e assicurarti di avere una solida comprensione di ciò che il software fa dal punto di vista di un utente di quel componente, altrimenti rischi di omettere casi di test importanti.

È IMHO una buona idea implementare i tuoi test automatici prima per avviare il refactoring, non dopo, in modo da poter eseguire il refactoring a piccoli passi e verificare ogni passaggio. Il refactoring stesso dovrebbe rendere il codice più leggibile, quindi ti aiuta ad aumentare la tua comprensione degli interni a poco a poco. Quindi i passaggi dell'ordine in questo processo sono

  1. ottenere la comprensione del codice "dall'esterno",
  2. scrivere test di regressione,
  3. refactor, che porta a una migliore comprensione degli interni del codice
risposta data 23.02.2017 - 14:30
fonte
1

Un motivo importante per scrivere i test unitari è che essi documentano l'API del componente in qualche modo. Non capire lo scopo del codice sotto test è davvero un problema qui. La copertura del codice è un altro obiettivo importante, difficile da raggiungere senza sapere quali rami di esecuzione esistono e come vengono attivati.

Tuttavia, se è possibile reimpostare lo stato in modo pulito (o costruire il nuovo oggetto di test ogni volta), si possono scrivere test di tipo "trash in-trash out" che si limitano a inviare input per lo più casuali al sistema e osservare l'output .

Tali test sono difficili da mantenere, come quando falliscono, può essere complesso dire perché e quanto sia serio. La copertura potrebbe essere discutibile. Tuttavia sono ancora molto meglio di niente. Quando questo test fallisce, lo sviluppatore può rivedere le ultime modifiche con più attenzione e, auspicabilmente, individuare il bug lì.

    
risposta data 24.02.2017 - 16:49
fonte

Leggi altre domande sui tag