mercredi 28 avril 2010

[C++] Créer des tests unitaires en cpp avec Boost.Test

Si vous vous demandez encore pourquoi utiliser des tests unitaires ou encore ce que sont les tests unitaires je vous conseil vivement de vous renseigner et de revenir dans quelques minutes sur cette page !! Le web est une mine d'information infinie !!



Nous alons donc voir comment implémenter des tests unitaires en C++ avec la bibliothèque Boost qui contient entre autre la bibliothèque Boost.Test dont nous allons nous servir.



Tout d'abord il faut installer Boost. Si vous êtes sous visual studio il existe un fichier exécutable sur le site de Boost pour les distributions Linux vous devriez trouver les sources dans vos dépots.



Créez un nouveau projet "de test" qui ne sera rien d'autre qu'un projet C++ vide. Nommez le HelloWorldTest (Nom du projet à tester suivit de Test). Ceci n'est pas une obligation mais permet de se retrouver plus facilement quand on a beaucoup de projet dans un même dossier.


Ajoutez maintenant la librairie boost_unit_test_framework au liker (sous eclipse : bouton de droite sur votre projet, property, C/C++ Build, Settings, GCC C++ Linker, Librairies et ajouter boost_unit_test_framework).



Nous allons écrire notre premier fichier de tests. Pour cela créez un fichier Test.cpp (par exemple) et inscrivez dans celui ci ceci :



#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>


BOOST_TEST_DYN_LINK : Utiliser la bibliotheque dynamique de test de boost. (Celle que nous avons ajouter juste avant)
BOOST_TEST_MAIN : Genèrer une suite de tests principale (Master Test Suite)



Si vous compilez votre programme maintenant et que vous l'exécuter vous devriez avoir comme résultat


Test setup error: test tree is empty

Maintenant que nous avons un environnement de test fonctionnel nous allons passez à la rédaction de nos premiers tests.
Pour ceci renommer votre fichier Test.cpp en Test.h car à partir de maintenant nous l'inclurons dans tous nos fichiers de tests.
Dans votre programme à tester créez une classe Calculator avec des fonctions simples (add, sub, mul, div). Nous nous servirons de cette classe pour nos tests.



Dans votre programme de test créez un fichier CalculatorTest.cpp et incluez dans celui ci Test.h


#include "Test.h"

Nous avons besoins de faire référence à notre premier projet pour cela vous pouvez soit utiliser les fonctions de votre compilateur soit créer un lien symbolique de vos classes vers votre dossier source de test. Pour ma part, étant bien trop fainéant j'ai opté pour la deuxième solution. Mes classes étant dans le dossier Classes ceci me donne donc


ln -s ../HelloWorld/Classes/ ./

Nous rajoutons dans notre fichier CalculatorTest.cpp l'include de la classe que nous voulons tester.



#include "Classes/Calculator.h"

Et nous allons écrire un premier test !!




Pour cela nous allons utiliser plusieurs macro de Boost :
BOOST_AUTO_TEST_CASE : Qui va nous permettre de créer une "fonction virtuelle" de test
BOOST_REQUIRE_EQUAL : Qui va nous permettre de tester l'égalité d'un résultat et de retourner une valeur.
Ceci va ce présenter comme ça :


BOOST_AUTO_TEST_CASE(CalculatorAddTest1)
{
Calculator *myCalculator = new Calculator();
BOOST_REQUIRE_EQUAL(myCalculator->Add(1,2),3);//myCalculator->Add(1,2), 3);
}


Nous utilisons BOOST_AUTO_TEST_CASE pour créer une fonction de test que nous nommons CalculatorAddTest1. Nous créons un objet de type Calculator et le testons avec BOOST_REQUIRE_EQUAL.
Si vous compilez maintenant votre programme vous devriez obtenir un joli



Running 1 test case...

*** No errors detected


Il n'existe pas que BOOST_REQUIRE_EQUAL vous trouverez aussi BOOST_REQUIRE(expr), BOOST_REQUIRE_GE(left, right), BOOST_REQUIRE_GT(left, right), etc ... Vous pouvez trouvez la liste de ces macros dans la documentation de Boost.



Nous avons vu comment mettre en place un projet de tests unitaires avec Boost.Test ce qui est déjà pas mal pour aujourd'hui ! Nous continurons donc plus tard ;) !

dimanche 25 avril 2010

[Eclipse] Compiler un programme (C ou CPP) utilisant la GLib

Pour pouvoir compiler un programme utilisant la GLib avec eclipse il vous faut configurer des options pour le compilateur et le linker

Dans Eclipse
Bouton de droite sur votre projet, propriété, C/C++ Build, Setting
Dans l'onglet Tool Settings sélectionner GCC C++ Compilateur ou GCC C Compiler suivant si vous utiliser gcc ou g++.

Dans la textbox Command line pattern ajouter
`pkg-config --cflags glib-2.0`


De même dans GCC C/C++ Linker ajouter
`pkg-config --libs glib-2.0`
Et voilà vous pouvez enfin compiler votre application !