Ho scritto una classe Matrix e ho controllato che non consentiva la moltiplicazione di matrici di dimensioni incompatibili utilizzando eccezioni C++. Ho scritto test unitari per verificare il comportamento, e si aspettano che venga lanciata un'eccezione.Test di unità per errori di compilazione con C++
Ora sto cambiando la dimensione di Matrix da variabile di runtime a parametro di modello. Se riuscirò a farlo correttamente, il codice che tenterà di moltiplicare le matrici di dimensioni errate non verrà nemmeno compilato.
Sembrerebbe che ora questi test unitari siano ridondanti. Tuttavia, poiché non so come cambierò il mio codice in futuro, e cosa si romperà, voglio ancora implementare dei test per questo. Se prima mi aspettavo che i miei test generassero eccezioni specifiche in punti specifici, ora voglio che il mio test generi errori specifici di compilazione in punti specifici.
Qual è il modo migliore per farlo? Immagino una specie di meccanismo basato su Makefile e script di shell che aspetterebbe un codice di errore specifico - o dovrei provare qualcos'altro? Questa idea è una pratica comune o completa follia?
Modifica: Certamente, "Test di unità" non è un nome appropriato per questo tipo di meccanismo, lo so, ma per ora non riesco a pensare a un modo migliore. Ci sono già tre autori di commenti che hanno dedicato il loro prezioso tempo e impegno a spiegarmi quali sono i test unitari e quali no. Sfortunatamente, pur essendo tecnicamente vero, questo non aiuta a risolvere un problema reale qui a portata di mano.
Edit 2: Questo è BDD scenario che voglio per verificare:
- Dato due matrici di dimensioni 2x2 e 3x3
- Quando l'utente tenta di moltiplicarle
- Quindi ottiene un errore
Prima, che l'errore era un errore di runtime e il test per esso era banale. Ma ora sono diventato un errore in fase di compilazione, e non vedo come posso continuare a testare automaticamente questo scenario e confermare, su ogni commit (ho dei test unitari nei miei git hook) che mi dà ancora un errore.
test unitari sono per il rilevamento di errori di esecuzione. I compilatori sono per rilevare errori di compilazione del tempo. – RPGillespie
I test di unità non rilevano errori di runtime. I test unitari verificano che gli errori di runtime previsti vengano rilevati dal programma stesso o dal suo runtime. Lo strumento che sto cercando (hai ragione, unit test non è il nome migliore per esso) non rileva gli errori di compilazione, ma controlla che il compilatore li rilevi. –
I test unitari devono testare le funzioni della scatola nera le cui implementazioni internamente possono essere modificate, in modo da poter verificare che la modifica degli interni non abbia compromesso la sua funzionalità. Suggerirei di creare API indipendenti dall'implementazione per le vostre matrici. Una funzione come 'bool canMultiply (Matrix & a, Matrix & b)' può usare tutto ciò che vuole internamente ed è verificabile con il test dell'unità. – RPGillespie