Tutti i test unitari in un file eseguibile o divisi in due?

12

Quando scrivi dei test per un pezzo di software, ad esempio una libreria, preferisci compilare tutti i test di unità in uno o separarli in più eseguibili?

Il motivo per cui lo sto chiedendo è perché attualmente sto usando CUnit per testare una libreria su cui sto lavorando. I test sono suddivisi in suite separate che vengono compilate in un eseguibile completo di output stampato per i guasti. Ora, il sistema di compilazione per quella libreria è CMake (che, nonostante il suo nome, ha poco a che fare con CUnit), che viene fornito con proprio framework di test, CTest . CTest mi consente di registrare un elenco di eseguibili che servono da test.

Sto valutando se utilizzare CTest per le prove di test automatizzate. Tuttavia, questo mi richiederebbe di suddividere i test che ho scritto finora in obiettivi di compilazione separati. Altrimenti, non posso davvero utilizzare alcune delle funzionalità avanzate di CTests, come i test in esecuzione selettiva.

Mi rendo conto che si tratta più di quali strumenti utilizzare e della loro gestione e convenzioni, ma a parte questo, ci sono altri motivi per preferire un singolo test eseguibile su quelli separati? O viceversa?

    
posta Benjamin Kloster 14.06.2012 - 19:30
fonte

2 risposte

5

Mi piace avere i miei test automatici in singoli file binari, o almeno raggruppati per gruppo "appartiene-insieme", e poi chiamarli da uno script di shell semplice (dove un codice di uscita diverso da zero segnala un errore e output su stderr può essere catturato per registrare una spiegazione). In questo modo, mantengo la massima flessibilità nel test - posso eseguire test individuali direttamente dalla riga di comando, posso creare tutti i tipi di script di fantasia se voglio, posso riordinarli come ritengo opportuno senza ricompilare nulla, ecc.

Ma ancora più importante, mi consente anche di includere test scritti in lingue diverse o utilizzare toolchain diversi nella stessa esecuzione. Ad esempio, i test unitari che scrivo sono molto probabilmente nella lingua principale del progetto, e eseguirli è questione di costruire e invocare i binari; ma voglio anche testare il mio database, e potrei voler alimentare gli script SQL direttamente al database per questo; Potrei voler eseguire uno strumento di analisi del codice statico sul mio codice (anche se è solo una sorta di linter). Potrei voler eseguire il mio codice HTML statico attraverso un controllo di validità. Potrei eseguire un comando grep sul codebase per verificare la presenza di costrutti sospetti, violazioni dello stile di codifica o parole chiave "red-flag". Le possibilità sono infinite: se può essere eseguito dalla riga di comando e aderisce a "zero exit status significa OK", posso usarlo.

    
risposta data 14.06.2012 - 19:41
fonte
2

Tendo ad avere una libreria per i test unitari di un'applicazione (o per un pacchetto di librerie che è comunemente condiviso). All'interno di questa libreria, cerco di replicare o approssimare gli spazi dei nomi degli oggetti sotto test per i proiettori di prova (io uso principalmente NUnit). Ciò semplifica la compilazione, poiché in .NET esiste un sovraccarico inerente alla creazione di ciascun binario che aumenterebbe i tempi di costruzione di una soluzione di 20 progetti rispetto a quella di una soluzione di 10 progetti con la stessa LOC. I binari di test non sono distribuiti in ogni caso, quindi qualsiasi organizzazione dei test in binari è per tua comodità, e generalmente trovo che YAGNI si applica qui come ovunque.

Ora, di solito non ho le considerazioni che ha i tdammers; il mio codice è praticamente tutto in una lingua e qualsiasi test che coinvolga stringhe SQL non è un test di unità (a meno che non si stia verificando che un produttore di query restituisce la stringa SQL prevista in base a determinati criteri) e praticamente non testare l'unità UI (in molte situazioni è semplicemente impossibile). Uso anche una libreria di test delle unità ben accetta da strumenti di terze parti come build-bots e plug-in IDE, quindi qualsiasi problema relativo all'esecuzione di test individuali, suite parziali, ecc. È minimo.

    
risposta data 14.06.2012 - 19:56
fonte

Leggi altre domande sui tag