06 avril 2005

Création de tests unitaires avec KDevelop et CppUnit

1. Prérequis

Pour pouvoir utiliser CppUnit, celui-ci doit être présent sur votre machine. Sur un système Linux Mandrake la commande suivante permet de l'installer :

% urpmi cppunit-devel

2. Création d'un sous-projet

D'abord, il faut un projet KDevelop, pour en créer un, je vous invite à consulter cet article http://blog.touv.fr/2005/03/creer-un-simple-programme-qt-avec.html. Ensuite, il faut créer un sous-projet. Personnellement, je l'ai appelé : «tests»

3. Configurer Automake et Autoconf

Au moment où j'écris cet article, je ne connais pas le moyen (si il existe) de paramétrer complétement Automake depuis KDevelop.

On va donc faire à la main une partie de la configuration.

Quittez KDevelop et rendez-vous dans le répertoire «tests». Editez le fichier «Makefile.am».

Théoriquement, il devrait ressembler à ça :

INCLUDES = 
METASOURCES = AUTO

Ajoutez les lignes suivantes :

KDE_CXXFLAGS=$(USE_EXCEPTIONS)

check_PROGRAMS = tester

Maintenant rendez-vous dans le répertoire racine de votre projet. Editez le fichier «configure.in.in»
Théoriquement, il devrait ressembler à ça :

#MIN_CONFIG(3.0.0)

AM_INIT_AUTOMAKE(exemple, 0.1)
AC_C_BIGENDIAN
AC_CHECK_KDEMAXPATHLEN

Ajoutez la ligne suivante :

AM_PATH_CPPUNIT(1.9.6)

Voilà maintenant vous pouvez retourner dans KDevelop, et ajouter la librairie $(CPPUNIT_LIBS) dans les options de la cible «tester»

http://www.touv.fr/IMG/png/kd-exemple18.png

Après ces petites modifications, il faut "purger" le projet (Menu Construire / Purger) puis le reconstruire (Menu Construire / Constuire le Projet)

4. Lanceur de tests

Ajoutez un fichier main.cpp à la cible «tester».

Chez moi, KDEvelop refuse de créer se fichier. Je suis d'abord obligé de le créer puis ensuite je l'ajoute en tant que fichier existant.

Son contenu est extrait de la documentation de cppunit :

#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
#include "test.h"

int main(int argc, char* argv[])
{
 
  CppUnit::Test *suite =   
       CppUnit::TestFactoryRegistry::getRegistry().makeTest();

  CppUnit::TextUi::TestRunner runner;
  runner.addTest( suite );

  runner.setOutputter( 
       new CppUnit::CompilerOutputter( 
            &runner.result(),
            std::cerr 
       ) 
  );
 
  bool wasSucessful = runner.run();

  return wasSucessful ? 0 : 1;
}

5. Créer des tests

Pour cela, on va créer une classe nommée Test. Donc dans KDevelop, on ajoutera à la cible «tester», 2 fichiers : test.h et test.cpp

test.h

#ifndef TEST_H
#define TEST_H

#include <cppunit/extensions/HelperMacros.h>

class Test : public CppUnit::TestFixture
{
  CPPUNIT_TEST_SUITE( Test );
  CPPUNIT_TEST( monPremierTestUnitaire );
  CPPUNIT_TEST_SUITE_END();

public:
  void setUp();
  void tearDown();
  void monPremierTestUnitaire();
 
private:
  int m_val;

};

#endif

test.cpp

#include "test.h"

CPPUNIT_TEST_SUITE_REGISTRATION( Test );

void Test::setUp()
{
    m_val = 1;    
}

void Test::tearDown() {}

void Test::monPremierTestUnitaire()
{
    int lav = 2;
    CPPUNIT_ASSERT_MESSAGE("forcement ça marche pas", m_val == lav);
}

6. Exécution

http://www.touv.fr/IMG/png/kd-exemple19.png

Aucun commentaire:

Enregistrer un commentaire