URL: https://linuxfr.org/news/opmock-un-outil-pour-le-tdd-efficace-en-c-et-c Title: Opmock : un outil pour le TDD efficace en C et C++ Authors: pognibene Date: 2011年03月13日T20:16:14+01:00 License: CC By-SA Tags: tdd, c, développement et c++ Score: 32 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_](http://opmock.sourceforge.net/) est un outil de génération automatique de _stubs_ et de [_mocks_](http://fr.wikipedia.org/wiki/Mock_%28programmation_orient%C3%A9e_objet%29), 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]]. ---- [Page sourceforge du projet Opmock](http://sourceforge.net/projects/opmock/) [Page du projet SWIG](http://www.swig.org/) ---- _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](http://www.swig.org/ "Simplified Wrapper and Interface Generator") 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 : ```c 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 !