2011-09-02 19 views
35

Si noti che questo NON è un duplicato di How write a unit test for verifying compiling error? poiché non sono interessato a verificare la correttezza delle librerie esterne o del compilatore stesso.Errori di compilazione deliberata dell'unità di misura del codice modello

È tipico del C++, in particolare quando si tratta di modelli, di utilizzare tecniche che impediscono la compilazione di un particolare pezzo di codice. Poiché questi possono essere contorti, qual è il modo migliore per garantire che determinate parti di codice generino effettivamente errori del compilatore?

Poiché il test non deve nemmeno essere compilato, non è possibile fare affidamento su cose come , quindi suppongo che dovrebbe essere integrato nel sistema di generazione? In che modo vengono generalmente affrontati questi problemi?

+0

Non capisco .. potresti fornire un esempio per la cosa che vuoi testare? –

+0

Ad esempio, una classe template non dovrebbe essere istanziata se non c'è una specializzazione disponibile per un certo tipo, o che un particolare metodo non dovrebbe essere disponibile se un tipo non soddisfa certi requisiti, o in generale testare l'efficacia di 'boost :: enable_if', ecc. – UncleZeiv

+0

Beh, scrivi solo un caso di test che non dovrebbe essere compilato, quindi controlla che non sia stato compilato .. forse cerca il messaggio di errore appropriato per assicurarti che non sia compilato per il * giusto * motivo. –

risposta

10

farlo in modo simile test del compilatore sono scritti. Avrai un po 'di codice di test in qualche linguaggio di scripting (shell, perl, tcl ecc.) Che eseguirà il compilatore su determinati frammenti di codice e controllerà se quelli giusti sono stati compilati e quelli giusti no.

  • gcc usa DejaGnu, che è costruito in cima expect, che è a sua costruita sulla sommità Tcl.
  • Se si utilizza lo script di shell (probabilmente più semplice, DejaGnu è probabilmente eccessivo), è possibile che si desideri esaminare shUnit2.
  • Perl's Test::Harness il sistema dovrebbe essere per lo più facile da usare così com'è.
  • Dopotutto, non è molto più lavoro per eseguire il processo da C++, quindi scrivere una funzione per provare a richiamare il compilatore su una determinata stringa e verificare se emette un errore per la riga dove ci si aspetterebbe che non sarebbe così difficile e che puoi integrarlo negli altri test basati su boost.test.
3

Si dovrebbe fare affidamento su un framework esterno per eseguire una serie di test di compilazione, ad es. makefile, o lavori hudson e controlla l'output del compilatore o gli artefatti del compilatore. Se la compilazione dovesse fallire, non ci dovrebbe essere un file oggetto per il file in compilazione. Sto indovinando che potresti scrivere un plugin per Hudson per farlo o un semplice script batch che esegue un makefile che compila tutti i file di test che dovrebbero fallire o avere successo e segnalare i successi o gli errori di conseguenza.

Nel caso più semplice verificherebbe solo l'esistenza del file '.o' per vedere se il test è riuscito, in casi più complessi si potrebbe voler guardare l'output del compilatore e verificare che l'errore che si produce concorda con l'errore che ti aspetti. Dipenderà dal compilatore che stai usando.

Andando un livello più profondo probabilmente significherebbe scrivere un'estensione compilatore per farlo (LLVM potrebbe essere in grado di gestire quello che stai chiedendo)

+0

Sicuramente non separati [Jenkins] (http://jenkins-ci.org/) (il nome "Hudson" è bloccato in Oracle) .Siamo parlando di 10 frammenti di linea –

Problemi correlati