Tutorial Google Test

Google Test è un framework di test per C++. In questa miniguida spiego come usarlo in Visual Studio 2008. Per seguire la guida non avete bisogno di conoscere Visual Studio 2008, dovete però avere un idea di cosa sia un framework xUnit, e dovete conoscere C o C++.

Scaricare e installare Google Test

Scarichiamo dal sito ufficiale l'ultima release, ad oggi il file gtest-1.4.0.zip e lo decompriamo, per esempio in c:\gtest-1.4.0.

Google Test supporta diversi compilatori tra cui fortunatamene Visual Studio 2008. I progetti di Visual Studio si chiamano “Soluzioni”, dentro la cartella C:\gtest-1.4.0\msvc ci sono due soluzioni:

·       gtest.sln (da usare se volete linkare staticamente la libreria gtest,come .LIB)

·       gtest-md.sln (da usare se volete linkare dinamicamente la libreria, come DLL).

Potete scegliere di usare sia uno che l’altro, io per semplicità io scelgo di usare la libreria statica.

Prima di aprire la soluzione togliete però l’eventuale flag read only da tutti i file dentro msvc. Se non lo fate ve ne pentirete J. Quando gtest.sln con Visual Studio 2008 vi chiederà di aggiornare la soluzione al nuovo formato, ditegli di sì con il solito Avanti, Avanti, Avanti. Se non avete tolto il readonly il Visual Studio si lamenterà.

Una volta apete provvede alla build di tutta la soluzione con F7 (Build > Build Solution).

Se tutto va bene dovrebbe crearvi i file gtest_maind.lib e gtestd.lib in C:\gtest-1.4.0\msvc\gtest\Debug.

Il primo progetto Visual Studio

Se siete pratici di Visual Studio saltate pure al prossimo paragrafo. Se come me non siete pratici seguitelo.

Creiamo il primo progetto di test,  daVisual Studio scegliamo:

File > New > New Project

e scegliamo Win32 Console Application”. Diamo al progetto un nome qualsiasi, io ho usato "LearningGoogleTest". Se il wizard ve lo chiede, sappiate che le "Precompiled Header" non vi servono.

Il risultato dovrebbe essere simile a questo:

I file stdafx.h, stdafx.cpp, targetver.h sono creati gratuitamente dal Visual Studio e per i miei scopi non valgono lo spazio che occupano, quindi io li cancello. 

Dato che non sono pratico di Visual Studio prima di procedere oltre provo con un Hello World:

// LearningGoogleTest.cpp

 

#include <stdio.h>

             

int main(int argc, char * argv[]) {

    printf("Hello world!\n");

    return 0;

}


Con CTRL+F5 (Debug > Start Without Debugging) possiamo ammirare la nostra creazione:

Notate quanto sia gentile Visual Studio 2008 a chiedervi di schiaccciare un tasto prima di chiudere la finestra, Visual Studio 6.0 non era così simpatico.

Aggiungiamo la libreria Google Test al nostro progetto

Le librerie C/C++ sono una scocciatura perché per poterle usare devi sistemare due cose:

·       i path dei file header (.h)

·       i path dei file di libreria (.dll o .lib)

Io preferisco affrontare questi problemi uno alla volta.

Sistemare i path degli headers

Includiamo l'header di gtest in LearningGoogleTest.cpp”:

// LearningGoogleTest.cpp

 

#include <stdio.h>

             

int main(int argc, char * argv[]) {

    printf("Hello world!\n");

    return 0;

}

 

// LearningGoogleTest.cpp

 

#include <stdio.h>

#include <gtest/gtest.h>

             

int main(int argc, char * argv[]) {

    printf("Hello world!\n");

    return 0;

}

 

Compiliamo (F7) e notiamo l’errore:

learninggoogletest.cpp(4) : warning C4627: '#include <gtest/gtest.h>': skipped when looking for precompiled header use

Risolviamo aggiungendo in

Project Settings > Configuration Properties > C/C++ > Additional Include Directories

il path (completo) di gtest-1.4.0\include

Tentiamo di nuovo ed ora abbiamo un errore durante la fase di linking:             

Risolviamo aggiungendo in

Project Settings > Configuration Properties > Linker > Input > Additional Dependencies

i path di queste due librerie

·       "c:\gtest-1.4.0\msvc\gtest\Debug\gtest_maind.lib"

·       "c:\gtest-1.4.0\msvc\gtest\Debug\gtestd.lib"

Mi raccomando di usare i doppi apici (") se ci sono spazi nei path!

In teoria farlo ora dovrebbe funzionare ma in pratica no! Se anche voi avete errori del genere:

allora vuol dire che lo switch Runtime Library usato per il progetto gtest.sln e quello del vostro progetto non coincidono.

Per risolvere andate in:

Project Settings > Configuration Properties > C/C++ > Code Generation > Runtime Library 

E assicuratevi che ci sia:

Multi-threaded Debug (/MTd)

A questo punto la build dovrebbe andare a buon fine.

Eseguire i test

A questo punto dovremmo avere a disposizione tutto l’occorrente per scrivere, compilare ed eseguire i test.

Riprendiamo il file LearningGoogleTest.cpp e togliamo la funzione main().

// LearningGoogleTest.cpp

 

#include <stdio.h>

#include <gtest/gtest.h>

 

TEST(foo,bar) {

              FAIL();

}

 

int main(int argc, char * argv[]) {

    printf("Hello world!\n");

    return 0;

}

// LearningGoogleTest.cpp

 

#include <stdio.h>

#include <gtest/gtest.h>

 

TEST(foo,bar) {

              FAIL();

}

 

In questo modo il linker andrà a prendere la main() da gtest_maind.lib la quale fa esattamente quello che ci serve: esegue tutti i test.

Premendo CTRL+F5 il programma si avvia e vengono eseguiti tutti i test. Il risultato dovrebbe essere questo:

Abbiamo un solo test e questo non passa ... per forza 0 non è uguale a 1!

Facciamo passare il test:

// LearningGoogleTest.cpp

 

#include <stdio.h>

#include <gtest/gtest.h>

 

TEST(foo,bar) {

              ASSERT_EQ(0,1);

}

// LearningGoogleTest.cpp

 

#include <stdio.h>

#include <gtest/gtest.h>

 

TEST(foo,bar) {

              ASSERT_EQ(1,1);

}

 

E con CTRL+F5 otteniamo la prima barra verde:

Integrazione in Visual C++

I messaggi di FAIL di gtest sono Visual Studio friendly. Ora vediamo come sfruttare questa feature.

 

Con il Post-Build Event diciamo Visual Studio di avviare i test dopo ogni build.

Per farlo impostiamo in 

Project Settings > Configuration Properties > Build Events > Post-Build Event > Command Line

il valore: 

"$(TargetDir)\$(TargetName).exe"

Ora, se avviamo la build (F7) dovrebbe ritrovarci i risultati dei test nella finestra Output. Ma non è finita qui. Simuliamo un fallimento nel nostro test:

 

// LearningGoogleTest.cpp

 

#include <stdio.h>

#include <gtest/gtest.h>

 

TEST(foo,bar) {

              ASSERT_EQ(1,1);

}

// LearningGoogleTest.cpp

 

#include <stdio.h>

#include <gtest/gtest.h>

 

TEST(foo,bar) {

              ASSERT_EQ(0,1);

}

Avviamo la build (F7) e otteniamo qualcosa del tipo:

Cliccando sul messaggio di errore il Visual Studio ci porta alla linea che l’ha provocato.


Comments

Andrea Francia
@des4maisons: Thanks, the next time maybe I'll use directly English.
des4maisons
This was very helpful, even after being fed through google translator. Thank you!