Sto scrivendo un'applicazione software di qualche migliaio di righe di codice (in Python), e al fine di mantenere il tutto insieme, lentamente ma certamente la necessità di test unitari (e successivamente, altri tipi di test .. .) è sorto.
Il mio problema è come organizzare le numerose funzioni di test che ho scritto finora: Supponiamo che abbia una funzione myfunc
per cui voglio scrivere test. Quello che ho sono funzioni in questo modo:
test1pos_myfunc():
#...
test2pos_myfunc():
#...
test3pos_myfunc():
#...
#and so on...
che testano ciascuno se un input se myfunc
fornisce l'output corretto. Poi ho anche un'altra suite di funzioni dove cerco dove vengono lanciate le eccezioni corrette se fornisco input non validi a myfunc
; questi sono
test1neg_myfunc():
#...
test2neg_myfunc():
#...
test3neg_myfunc():
#...
#and so on...
Questa configurazione sembra non ideale, in particolare per i test "negativi", perché spesso raggruppo insieme quelle funzioni che testano se viene lanciata la stessa eccezione - ad es. test1neg_myfunc
, test2neg_myfunc
e test3neg_myfunc
potrebbero testare tutti se la stessa eccezione MyError
viene generata per input diversi e test4neg_myfunc
e test5neg_myfunc
potrebbero verificare se viene generata la stessa MyHorribbleError
.
Ora, se voglio aggiungere un'altra funzione di test per testare'MyError ', devo rinumerare tutte le altre funzioni. Quale sarebbe un modo migliore per organizzare questo?
Ecco alcune soluzioni che ho pensato, ma nessuna mi soddisfa:
-
usa il nome dell'eccezione nel nome della funzione e riavvia la numerazione per ogni test di una nuova eccezione (sembra una cattiva idea, perché ridurrà la leggibilità), ad es.
test1MyError_myfunc
,test2MyError_myfunc
e così via. -
prendere tutti i test di un'eccezione e raggrupparli come metodi in una classe; e poi anche tutti i test che appartengono ad una funzione in una classe (questo è meglio che i miei nomi di test diventino più brevi e - ma poi di nuovo ci si sente male, perché sto importando un concetto da OOP in un ambiente in cui sto programmando rigorosamente procedurale! E usando una classe solo per raggruppare insieme alcune funzioni sembra eccessivo, Python non offre qualcosa di meglio come contenitore per memorizzare altre cose?)
-
esternalizzare tutti i test, simili all'organizzazione in classi, in diversi moduli (tutto ciò che ho scritto sulle classi si applica, ma con l'enorme svantaggio che avrò una tonnellata di file poi in giro)
Qualcuno può inventarsi qualcosa di meglio? Quali sono gli standard industriali qui? (Sono un programmatore alle prime armi.)