Sviluppo basato su test con semplice C: gestione di più moduli

5

Sono nuovo nello sviluppo basato sui test, ma lo amo. C'è, tuttavia, un problema principale che mi impedisce di utilizzarlo in modo efficace.

Lavoro per applicazioni mediche incorporate, semplice C, con problemi di sicurezza.

Supponiamo che tu abbia il modulo A che ha una funzione A_function() che voglio testare. Questa funzione chiama una funzione B_function , implementata nel modulo B . Voglio disaccoppiare il modulo così, come insegna James Grenning, creo un modulo Mock B che implementa una versione finta di B_function .

Tuttavia arriva il giorno in cui devo implementare il modulo B con la versione reale di B_function . Ovviamente il due B_function non può vivere nello stesso eseguibile, quindi non so come avere un "launcher" univoco per testare entrambi i moduli.

La via d'uscita di James Grenning è quella di sostituire, nel modulo A , la chiamata a B_function con un puntatore a funzione che può avere il valore del mock o la funzione reale in base alle necessità. Comunque lavoro in una squadra, e non posso giustificare questa decisione che non avrebbe senso se non fosse per il test, e nessuno mi ha chiesto esplicitamente di usare un approccio basato sui test.

Forse l'unica via d'uscita è generare un eseguibile diverso per ogni modulo.

Qualunque soluzione più intelligente? Grazie

    
posta Angelo 02.09.2012 - 10:26
fonte

1 risposta

1

In base a ciò che hai descritto, suggerirei che è un motivo orribile per utilizzare un puntatore a funzione. Otterrà la tua capacità di eseguire il debug, analizzare i core dump e complicherà il futuro sviluppo / manutenzione. I puntatori di funzione hanno il loro posto, ma questo non è uno di questi.

Penso che ti stai avvicinando ai test dal punto di vista sbagliato. A_func dipende dalla presenza di B_func affinché funzioni. Pertanto, non è possibile testare A in modo corretto senza avere l'effettiva implementazione di B in atto. Mettendo un falso B_func sul posto genererà solo una serie limitata di test per A_func. Per definizione, non puoi esercitare completamente A_func senza il vero B_func in atto.

Presumendo che non si abbia a che fare con una serie a cascata di inclusioni di moduli, la suite di test appropriata avrebbe alcuni test per esercitare B_func e poi alcuni test aggiuntivi per esercitare le variazioni che A_func può attraversare. È chiaro che potresti avere una certa ridondanza tra i test per B_func e il test indiretto di B_func da A_func, ma in genere non è un grosso problema.

    
risposta data 03.09.2012 - 02:22
fonte

Leggi altre domande sui tag