Unit test C++ in Visual Studio

Unit test C++ in Visual Studio

Il test è una parte sempre più importante di un flusso di lavoro di sviluppo software. In molti casi, non è sufficiente testare un programma semplicemente eseguendolo e provandolo:man mano che l'ambito del progetto diventa più coinvolto, diventa sempre più necessario poter testare i singoli componenti del codice su base strutturata. Se sei uno sviluppatore C++ e sei interessato allo unit test, ti consigliamo di conoscere gli strumenti di unit test di Visual Studio. Questo post illustra proprio questo e fa parte di una serie rivolta ai nuovi utenti di Visual Studio. Questo post del blog esamina i seguenti concetti:

  1. Impostazione di unit test
  2. Il Framework di test unitario Microsoft Native C++
  3. Utilizzo di Esplora test per eseguire test nell'IDE
  4. Determinazione della copertura del codice di test unitario

Impostazione di unit test

Il modo più semplice e organizzato per configurare gli unit test consiste nel creare un progetto separato in Visual Studio per i test. Puoi creare tutti i progetti di test che desideri in una soluzione e connetterli a un numero qualsiasi di altri progetti di Visual Studio in quella soluzione che contengono il codice che vuoi testare. Supponendo che tu abbia già del codice che desideri testare, segui semplicemente questi passaggi per configurarti:

  1. Fai clic con il pulsante destro del mouse sulla soluzione e scegli Aggiungi> Nuovo> Progetto . Fare clic su Visual C++ categoria e scegli il Test sottocategoria. Seleziona Progetto di test unitario nativo , assegna al progetto un nome descrittivo, quindi fai clic su OK .
  2. Visual Studio creerà un nuovo progetto contenente unit test, con tutte le dipendenze dal framework di test nativo già impostato. La prossima cosa da fare è aggiungere riferimenti a tutti i progetti che verranno testati. Fai clic con il pulsante destro del mouse sul progetto di unit test e scegli Aggiungi> Riferimento...
  3. Seleziona tutti i progetti che desideri sottoporre a unit test dal tuo progetto di test, quindi premi OK . Il tuo progetto di unit test può ora accedere ai tuoi progetti in prova. Ora puoi iniziare a scrivere i test, purché aggiungi istruzioni #include per le intestazioni a cui desideri accedere.

NOTA: Potrai solo testare le funzioni pubbliche in questo modo. Per testare le funzioni private, devi scrivere i tuoi unit test nella stessa classe del codice che viene testato.

Il framework di test unitario Microsoft Native C++

Visual Studio viene fornito con un framework di test C++ nativo che puoi usare per scrivere i tuoi unit test. Il framework definisce una serie di macro per fornire una sintassi semplificata.

Se hai seguito i passaggi della procedura precedente, dovresti avere un progetto di unit test impostato insieme al tuo codice principale. Apri unittest1.cpp nel tuo progetto di test e guarda il codice iniziale fornito:Sin dall'inizio, noterai che le dipendenze sono già state impostate per il framework di test, così puoi metterti al lavoro scrivendo i tuoi test. Supponendo che tu abbia collegato il tuo progetto di prova ai tuoi progetti in prova tramite Aggiungi> Riferimento in precedenza, puoi semplicemente aggiungere le istruzioni #include per i file di intestazione del codice che desideri testare.

I test possono essere organizzati utilizzando TEST_CLASS e TEST_METHOD macro, che svolgono esattamente le funzioni che ti aspetteresti. Un TEST_CLASS è una raccolta di TEST_METHODS correlati e ogni TEST_METHOD contiene un test. Puoi nominare il tuo TEST_CLASS e TEST_METHOD tutto quello che vuoi tra parentesi. È una buona idea utilizzare nomi descrittivi che semplifichino l'identificazione di ciascun test/gruppo di test individualmente in un secondo momento.

Proviamo a scrivere alcune affermazioni di base. Al TODO commenta, scrivi:Assert::AreEqual(1, 1);

Questa è un'asserzione di uguaglianza di base che confronta due espressioni. La prima espressione contiene il valore previsto, la seconda contiene l'elemento che stai testando. Affinché l'Affermazione passi, entrambe le parti devono valutare lo stesso risultato. In questo banale esempio, il test passerà sempre. Puoi anche verificare i valori a cui non vuoi che venga valutata la tua espressione, in questo modo:Assert::AreNotEqual(1, 2);

Qui, affinché il test superi, le due espressioni non devono restituire lo stesso risultato. Sebbene questo tipo di asserzione sia meno comune, potresti trovarlo utile per verificare casi limite in cui desideri evitare che si verifichi un comportamento specifico.

Ci sono molte altre funzioni di affermazione che puoi provare. Digita semplicemente Afferma:: e lascia che IntelliSense fornisca l'elenco completo per dare un'occhiata. I suggerimenti delle informazioni rapide vengono visualizzati per ogni affermazione mentre si effettua una selezione nell'elenco, fornendo più contesto sul formato e sulla funzione. È possibile trovare un riferimento completo delle funzionalità nel framework nativo di Microsoft C++ su MSDN.

Utilizzo di Esplora test per eseguire test nell'IDE

Con Visual Studio, non sei limitato all'esecuzione di unit test nella riga di comando. La finestra Esplora testo in Visual Studio offre un'interfaccia semplice per eseguire, eseguire il debug e parallelizzare l'esecuzione dei test. Questo è un processo semplice. Dopo aver collegato il tuo progetto di test ai tuoi progetti in test, aggiungi alcune direttive #include nel file contenente i tuoi unit test al codice in test e scrivi alcune asserzioni, puoi semplicemente eseguire una build completa. Test Explorer scoprirà quindi tutti i tuoi unit test e si popolerà con essi.

NOTA: In .NET è disponibile una funzionalità denominata Live Unit Testing. Questa funzionalità non è attualmente supportata in C++, quindi gli unit test vengono rilevati ed eseguiti solo dopo aver eseguito le build.

Per eseguire i tuoi unit test, fai semplicemente clic su Esegui tutto collegamento in Esplora test. Questo creerà il tuo progetto (sebbene questo processo venga saltato se il progetto è già aggiornato), quindi eseguirà tutti i test. Esplora test indica i test superati con un segno di spunta e i test non superati con una X. Nella parte inferiore della finestra viene fornito un riepilogo dei risultati dell'esecuzione. È possibile fare clic su qualsiasi unit test non riuscito per vedere il motivo per cui non è riuscito, comprese eventuali eccezioni che potrebbero essere state generate. Sono inoltre indicati i tempi di esecuzione di ogni unit test. Per tempi di esecuzione dei test realistici, eseguire il test nella configurazione della soluzione di rilascio anziché nel debug, che fornirà tempi di esecuzione più rapidi e più approssimativi all'applicazione fornita.

Per essere in grado di eseguire il debug del codice mentre esegui gli unit test (in modo da poterti fermare ai punti di interruzione e così via), usa semplicemente il Test> Debug menu per eseguire i test.

Determinazione della copertura del codice di test unitario

Se si usa Visual Studio Enterprise, è possibile eseguire la copertura del codice negli unit test. Supponendo che tu abbia già impostato gli unit test per il tuo progetto, è semplice come andare a Test> Analizza la copertura del codice nel menu principale di Visual Studio nella parte superiore dell'IDE. Si apre la finestra Risultati della copertura del codice che riassume i dati della copertura del codice per i test. NOTA: Esiste un problema noto per cui la copertura del codice non funziona in C++ a meno che /DEBUG:FULL è selezionato come configurazione di debug. Per impostazione predefinita, la configurazione è impostata su /DEBUG:FASTLINK invece. Puoi passare a /DEBUG:FULL procedendo come segue:

  1. Fai clic con il pulsante destro del mouse sul progetto di prova e scegli Proprietà .
  2. Vai a Linker> Debug> Genera informazioni di debug .
  3. Imposta l'opzione su Genera informazioni di debug ottimizzate per la condivisione e la pubblicazione (/DEBUG:FULL) .

La finestra Risultati copertura codice fornisce un'opzione chiamata Mostra colorazione copertura codice , che colora il codice a seconda che sia coperto o meno. La copertura del codice viene contata in blocchi, con un blocco che è un pezzo di codice con esattamente un ingresso e un'uscita punto. Se un blocco viene attraversato almeno una volta, è considerato coperto.

Per ulteriori informazioni sui test di unità C++, inclusi alcuni argomenti più avanzati, consulta i seguenti articoli MSDN:

  • Scrittura di unit test per C/C++ con Microsoft Unit Testing Framework per C++
  • Unit test di applicazioni C++ esistenti con Esplora test
  • Utilizzo della copertura del codice per determinare la quantità di codice da testare