2011-02-03 22 views
6

Supponiamo che io sto scrivendo un modello di raccolta costituito da un modello di funzioneCome scrivere test per i modelli C++?

template<T> void f(T); 

con il requisito che funziona con un set predefinito di classi A, B, C, e D, ad esempio, il seguente deve compilare :

template<> void f(A); 
template<> void f(B); 
template<> void f(C); 
template<> void f(D); 

Quale framework di test posso utilizzare per scrivere i casi di test che cattura questo requisito in fase di esecuzione, invece di non riuscire a compilazione del codice di prova? In un'altra parola, mi piacerebbe che il framework istanziasse i modelli al runtime e producesse un report di errore ben formattato se un sottoinsieme di questi fallisce.

So di poter rinunciare completamente ai framework di test e semplicemente scrivere un semplice file cc contenente le 4 righe sopra. Ma speravo di poter integrare questo requisito in normali casi di test standard per la generazione di rapporti sullo stato dei test. Ad esempio,

test f works with A: passed. 
test f works with B: passed. 
test f works with C: failed! Cannot cast type C! 
test f works with D: passed. 

3 of 4 tests passed. 
1 of 4 tests failed. 

risposta

5

Scrivi un caso di test che genera il compilatore ... ecco come ad es. autoconf test per l'esistenza di funzionalità.

+0

+1: ecco come vengono testati anche i compilatori: p Si potrebbe dare un'occhiata al framework 'lit' in LLVM/Clang che consente di specificare gli errori previsti nei commenti in linea accanto al test. –

1

in base a ciò che si sta cercando di testare qui, controllando se la cosa può compilare è l'unico test sensibile è possibile eseguire.

Il test non deve essere a scopo di test, ma per garantire la correttezza funzionale. Se si desidera eseguire test appropriati attorno alla classe, è necessario scrivere test che verificano la funzionalità del modello con tutte le 4 classi diverse con cui è possibile compilare.

2

Non capisco perché il failing in fase di esecuzione sia preferibile a un errore in fase di compilazione. Prima si fallisce nel processo di test unitario, meglio è. È preferibile che i test dell'unità non vengano compilati che falliti. È ancora più semplice da risolvere, infatti probabilmente non verrà nemmeno impegnato per il controllo del codice sorgente. Il tuo test unitario dovrebbe includere solo quelle quattro righe e affermare il vero alla fine. Nota che questo non è il modo in cui vorrei farlo io stesso.

+0

Perché vorremmo catturare tutte le specifiche funzionali da acquisire come test unitari da riportare come avanzamento del progetto. Se il programma di test non viene nemmeno compilato, non viene riportato nessuno dei test --- anche quelli che sono passati. – kirakun

+0

Forse dovresti interrompere il tuo programma di test in più programmi, uno per test. Ciò eviterebbe il problema che descrivi sopra. –

2

I modelli C++ sono una funzionalità di compilazione. In molti casi falliranno al momento della compilazione, in base alla progettazione. Non puoi semplicemente aggirare questo without doing something really crazy.

Tuttavia, vorrai anche sapere che le specializzazioni del modello sono corrette, in quanto le specializzazioni sostituiscono il comportamento che altrimenti otterresti dal modello. Quindi prova le specializzazioni. Ma renditi conto che non riuscirai mai ad aggirare gli aspetti del tempo di compilazione dei modelli.

Problemi correlati