c++ - risposte - Come testare l'unità errori di compilazione deliberata del codice del modello




elettrotecnica domande e risposte (2)

Dovresti fare affidamento su un framework esterno per eseguire una serie di test di compilazione, ad esempio makefile o lavori hudson, e verificare 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 ha avuto successo, in casi più complessi potresti voler guardare l'output del compilatore e verificare che l'errore prodotto sia compatibile con l'errore che ti aspetti Dipenderà dal compilatore che stai usando.

Andare di un livello più in profondità significherebbe probabilmente scrivere un'estensione del compilatore per farlo (LLVM potrebbe essere in grado di gestire ciò che stai chiedendo)

Si noti che questo NON è un duplicato di Come scrivere un test unitario per verificare l'errore di compilazione? dato che non mi interessa testare la correttezza delle librerie esterne o del compilatore stesso.

È tipico del C ++, in particolare quando si tratta di modelli, di impiegare 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?

Dato che il test non dovrebbe nemmeno essere compilato, non puoi fare affidamento su cose come il boost-test , quindi suppongo che dovrebbe essere integrato nel sistema di build? In che modo vengono generalmente affrontati questi problemi?


Fallo nello stesso modo in cui vengono scritti i test del compilatore. 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 sopra expect , che è esso stesso costruito su Tcl.
  • Se usi lo script di shell (probabilmente più facile, DejaGnu è probabilmente eccessivo), potresti voler dare un'occhiata a shUnit2 .
  • Perl's Test::Harness sistema Test::Harness 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 chiamare il compilatore su una determinata stringa e controllare se emette un errore per la riga dove ci si aspetterebbe che non sarebbe così difficile e che si possa integrare negli altri test basati su boost.test.




templates