Quelles sont les approches les plus modernes pour les tests unitaires pour le langage C++? La classe des langages avec une plus grande puissance d'introspection (comme Python) a des cadres de tests unitaires qui sont en quelque sorte plus naturels à utiliser. Les tests unitaires peuvent être définis plus facilement. En comparaison, le CppUnit
classique (basé sur JUnit
) semble adopter une approche très conservatrice. Existe-t-il quelque chose de nouveau et de meilleur qui utilise la puissance spécifique du C++ (ou même du C++ 11) pour vous faciliter la vie?
J'utilise le framework CppUnit
depuis un certain temps de manière plutôt simpliste pour certaines parties du projet sur Windows natif C++ (Visual Studio 2005 et 2010). Nous n'avons pas choisi l'approche de développement piloté par les tests plus tôt, car il y avait déjà beaucoup de code hérité, et nous avions trouvé assez difficile d'y ajouter des tests. Nous avons dû refactoriser l'application, mais l'ajout de tous les tests de Nice prendrait du temps, même dans le cas.
Récemment, nous sommes passés à Visual Studio 2013 (en raison de l'implémentation standard de C++ 11), et nous allons démarrer un nouveau projet, plutôt à long terme.
Ayant la bonne (petite) expérience précédente avec les tests unitaires, je voudrais essayer l'approche de développement piloté par les tests. Comme le projet n'est pas minuscule (taille attendue à peu près la même que l'ancien, c'est-à-dire environ 200 k lignes de code), je préfère un cadre plutôt plus facile (mais pas moins capable).
Il est possible que le nouveau projet conduise à une implémentation multiplateforme (Windows et Linux). Il existe une prise en charge des tests unitaires dans Visual Studio 2013, mais je n'ai aucune expérience avec elle et comment cela s'intégrerait-il avec la multiplateforme.
Jusqu'à présent, j'ai trouvé la liste des frameworks de tests unitaires pour C++ . Cependant, on ne voit pas en quoi elles diffèrent en principe. J'ai actuellement trois candidats (choix conservateur):
CppUnit
.Quoi qu'il en soit, il semble que les trois utilisent une approche similaire. Peut-être que le VS2013 prend en charge la génération du code, mais cela ne signifie pas qu'il mène à quelque chose de plus simple.
Existe-t-il une approche radicalement nouvelle?
Le seul cadre de test à considérer: Catch
Pour une introduction à la bibliothèque, voir aussi ici et ici
Il est facile à utiliser (une bibliothèque d'en-tête uniquement composée d'un seul en-tête), portable et possède de loin la syntaxe la plus simple et la plus propre de tout framework de test unitaire C++.
Et contrairement à d'autres bibliothèques, vous n'avez pas besoin de vous souvenir de deux douzaines de macros différentes ou de différents types d'assertions.
Vous utilisez simplement REQUIRE:
int one = 1;
REQUIRE( one == 2 );
qui, grâce à une surcharge d'opérateur intelligente, affichera à la fois l'expression d'origine et les valeurs d'argument développées dans la sortie:
test.cc(7): FAILED:
REQUIRE( one == 2 )
with expansion:
1 == 43
Comparé à cela, tout autre framework est une corvée pour utiliser IMO.
J'utilisais Boost.Test avant de trouver cela, mais c'était beaucoup plus lourd à configurer et à utiliser. Nous utilisons CppUnit au travail, et cela semble être conçu pour être aussi fragile et douloureux que possible.
J'ai examiné brièvement le cadre de test VS2013, mais je ne l'ai pas essayé, et il semble tolérable, mais ressemble beaucoup à une émulation de "la vieille garde". Il n'essaie pas vraiment d'être plus propre, plus facile ou meilleur que CppUnit, Boost.Test et tous les autres qui ont précédé Catch. Je dirais donc ne vous embêtez pas avec ça. Les tests devraient être faciles à écrire (et à comprendre), et Catch est à des années-lumière de tous les autres frameworks que j'ai vus sur ce front.
J'utilise le cadre de test intégré de Visual Studio 2013 depuis environ 6 semaines et j'aime vraiment ça. L'intégration est excellente et elle est très facile à saisir. Si vous travaillez sur un projet qui ne cible que Windows, je le recommande vivement.