Opmock : un outil pour le TDD efficace en C et C++

Posté par . Modéré par Lucas Bonnet. Licence CC by-sa
32
14
mar.
2011
Ligne de commande

Le TDD (Test Driven development) est une pratique souvent utilisée dans les projets de développement utilisant les « méthodes agiles ». Pour supporter cette pratique, il est nécessaire de disposer d'outils qui permettent d'écrire facilement des tests unitaires, mais également de couper les dépendances d'une section de code, afin de la tester en isolation. Les langages actuels, comme Java ou C#, bénéficient tous de pléthore d'outils de ce type, comme Jmockit ou Mockito. Cependant, le C et le C++ n'ont pas cette chance, bien qu'une quantité impressionnante de code les utilise.

Opmock est un outil de génération automatique de stubs et de mocks, qui permet de simplifier énormément le TDD avec des bases de code importantes en C ou C++, existantes ou nouvelles.
Le projet est placé sous licence GPLv3.

Opmock est né d'un besoin concret : il s'agissait de tenter d'introduire TDD sur une base de code C et C++ ancienne (15 ans d'historique), très volumineuse, dans le domaine des télécoms embarquées. S'il existe de nombreux outils de test unitaire (comme cppunit, cxxtest, check, et bien d'autres), ceux qui permettent d'automatiser la création de stubs ou de mocks ne sont pas légion. En C++, on peut utiliser Google Mock, mais cet outil est fortement dépendant de fonctionnalités avancées du C++ qui ne sont souvent pas disponibles pour du code embarqué. En C, on a cmock, mais il n'implémente pas toute la syntaxe du C et présente des incompatibilités avec du code manipulant les signaux.

Opmock est donc un générateur de code C/C++ (mais écrit en Java), sous licence GPL v3, avec pour cible principale les systèmes Unix et GNU/Linux. Il s'appuie sur le programme SWIG pour analyser des fichiers headers et générer du code qui permet :

  • de gérer des mocks programmables dans le périmètre d'un test ;
  • de gérer des « callbacks » (équivalents à des stubs multiples pour une même fonction) ;
  • d'enregistrer et vérifier les paramètres passés lors d'un test.

Un exemple simple :

void test_fizzbuzz_with_3()
{
  // la prochaine fois qu'on appelle la fonction C do_sound,
  // elle doit recevoir le paramètre "FIZZ" et retourner 0.
  // le paramètre est validé par un "string matcher" dont on passe l'adresse
  do_sound_ExpectAndReturn ("FIZZ", 0, cmp_cstr);

  // on invoque le code à tester, qui va lui-même appeler la dépendance,
  // en l’occurrence la fonction do_sound. Mais c'est notre mock qui va
  // être appelé au lieu de la fonction originale... Et il va se comporter
  // comme nous l'avons défini plus haut.
  char *res = fizzbuzz(3);

  // on vérifie qu'on a le résultat attendu
  // sinon le test échoue
  OP_ASSERT_EQUAL_CSTRING("FIZZ", res);
  free(res);

  // on vérifie que le mock a reçu les bons paramètres
  // et qu'il a été appelé le bon nombre de fois,
  // sinon le test échoue
  OP_VERIFY();
}

Si opmock embarque également un framework de test unitaire minimal, mais en général suffisant, il permet, bien sûr, d'en utiliser un autre comme Google Test ou Cppunit.

Il est activement utilisé pour le réusinage (refactoring) et pour améliorer une base de code de quelques dizaines de millions de lignes chez l'un des plus grands constructeurs mondiaux de télécom.

Si, vous aussi, vous développez en C ou en C++, et que vous voulez le faire en utilisant des tests unitaires, alors essayez-le !

  • # Mystère mystère...

    Posté par (page perso) . Évalué à 1.

    S'agirait-il d'un vieil OS pour ordiphone qui sera bientôt supplanté par "fenêtre" chez un fabricant désormais milliardaire?

    • [^] # Re: Mystère mystère...

      Posté par . Évalué à 3.

      Pas du tout. Il s'agit d'un logiciel qui gère certains équipements de réseau qui permettent à une très grande majorité des internautes en Europe d'avoir Internet chez eux. Je ne peux pas en dire plus, j'ai signé un NDA :-)

  • # Ca parait très intéressant

    Posté par . Évalué à 1.

    Je bosse moi-même chez un constructeur d'équipements télécom, et je suis assez curieux de voir la mise en application de ce genre d'outils. Jusque là j'avais des doutes sur l'utilisation de ce type d'outils en embarqué, mais si c'est réellement utilisé, je vais tenter de m'y plonger.

    Il n'y a pas beaucoup de documentation sur le site, n'y aurait-il pas quelques tutoriaux/exemples parlant quelque part ?
    Genre "Le TDD en embarqué avec Opmock expliqué aux enfants" ? ;-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.