Come si può persino testare un tipo di dati astratto?
Voglio dire, oltre al normale (supposto) modo di fare test unitari, dove prendi in giro i collaboratori, li nutri nella classe per testare, insieme con i dati di esempio, e chiama i metodi pubblici, verificando che l'output è il previsto uno, come ti assicuri che gli interni siano ciò che vuoi?
Facciamo un esempio : diciamo che voglio implementare il mio PriorityQueue , ma voglio usare un Heap come rappresentazione interna e anche oltre, un array per il Parte di heap
Il modo normale per testare è controllare i metodi pubblici in diversi scenari, i metodi sono: push, pop, peek.
Ciò non fornisce alcuna garanzia sulle prestazioni dell'algoritmo utilizzato internamente. Potrei e dovrei preoccuparmi di fare alcuni "scenari" per controllare le prestazioni, ma queste sono utili dopo che ho implementato la mia cosa e sono principalmente per la raccolta di metriche.
Quindi, come faccio a testare le parti interne ? O meglio, come posso assicurarmi che la rappresentazione interna usi l'algoritmo che voglio.
So che avrò diversi livelli su internals se vado con l'implementazione "heap" (questi sono ovunque su Internet per implementazioni di PriorityQueues):
1. calcolo di left-child, right-child, parent per un nodo; Potrei estrarli in una classe separata e testarla. Oppure potrei semplicemente proteggerli e testarli nella classe PriorityQueue, ma questo incapsula l'interruzione perché i test guardano nello stato della classe per testare
2. shiftUp e shiftDown; stessi problemi come per quello di cui al punto 1., tranne ora posso farli ricevere l'oggetto che rappresenta lo stato interno, o utilizzare il campo privato diretto, nel caso di un linguaggio orientato agli oggetti. Così, protetto o in un'altra entità?
3. la rappresentazione interna è una matrice, quindi potrei avere un metodo toArray () pubblico e testarlo. Testare l'output di questo può persino "salvarmi" dal test dei due punti precedenti, ma ancora una volta, lo stato interno è esposto al mondo esterno. Voglio davvero farlo?
Le domande qui sono :
- separi il codice in più pezzi? quando ti fermi con la granularità?
- quanto sacrifico da KISS per avere alcuni test unitari? Voglio le cose semplici e potrei avere la maggior parte delle cose nella stessa classe e anche i metodi per usare direttamente i campi interni (in caso di OO)
- ci sono altri "suggerimenti", altri modi per garantire sia la funzionalità della struttura dati che l'algoritmo usato?