Comparaison des frameworks de tests unitaires C ++ [fermé]

300

Je sais qu'il y a déjà quelques questions concernant les recommandations pour les cadres de test unitaire C ++, mais toutes les réponses n'ont pas aidé car ils recommandent simplement l'un des cadres mais ne fournissent aucune information sur une comparaison (de fonctionnalité).

Je pense que les frameworks les plus intéressants sont CppUnit, Boost et le nouveau framework de test Google. Quelqu'un a-t-il déjà fait une comparaison?

femme de ménage
la source
2
doublon possible des tests unitaires pour le code C ++ - Outils et méthodologie
HaskellElephant
J'ai mon propre cadre de test basé sur le CIO que j'aime davantage car ce n'est pas seulement un clone de ce que font tous les autres, mais il traite de ce que je trouve être tous les problèmes des autres. Vous écrivez des cas de test en dérivant d'une classe, pas en utilisant des macros. Les macros ne sont utilisées que pour les assertions car elles vous donnent une réflexion. Sortie personnalisée des statistiques de test. Exécutez à partir des scripts IOC pour choisir ce que vous testez, à quelle fréquence et avec quels paramètres.
CashCow
et c'est génial du point de vue du développement car lorsque j'ajoute mon propre test, je peux l'exécuter sans avoir à exécuter tout le monde en même temps. Je sais donc que mon code fonctionne.
CashCow

Réponses:

99

Voir cette question pour une discussion.

Ils recommandent les articles: Exploring the C ++ Unit Testing Framework Jungle , By Noel Llopis. Et le plus récent: les cadres d'unités de test C ++

Je n'ai pas encore trouvé d'article qui compare googletest aux autres frameworks.

Sam Saffron
la source
Comme je l'ai écrit: toutes les réponses recommandent simplement l'un des cadres mais ne comparent pas le cadre à un autre.
femme de ménage
Vous n'êtes pas satisfait de l'article non plus?
Gishu
7
Une critique: l'article, bien que bon, date de 2004 et ne comprend pas Google Test.
richq
2
Dans le premier lien, vous verrez deux comparaisons. À l'exception du nouveau cadre de google, la plupart des informations sont (sont?) Toujours pertinentes. (Et CppUnit n'est pas le plus intéressant, il est trop maladroit à utiliser)
Luc Hermitte
1
corrigé des liens et élargi la réponse avec une comparaison plus récente
Sam Saffron
120

Un nouveau lecteur est Google Test (également connu sous le nom de Google C ++ Testing Framework ), ce qui est plutôt sympa.

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

Caractéristiques principales:

  • Portable
  • Assertions fatales et non fatales
  • Messages informatifs sur les assertions faciles :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test détecte automatiquement vos tests et ne vous oblige pas à les énumérer pour les exécuter
  • Facilitez l' extension de votre vocabulaire d'assertion
  • Tests de décès (voir guide avancé)
  • SCOPED_TRACE pour les boucles de sous-programme
  • Vous pouvez décider quels tests exécuter
  • Génération de rapport de test XML
  • Fixtures / Mock / Templates ...
Wernight
la source
3
J'aime vraiment utiliser google test sur certains des autres frameworks, en particulier avec ses capacités de simulation qui se trouvent dans le framework googlemock.
Mike
8
Je fournis toutes ces fonctionnalités (bien que certaines ne soient pas encore publiques) et plus dans mon nouveau framework de test, CATCH. Voir ma réponse pour le lien.
philsquared
2
le combiner avec Google C ++ Mocking framework en fait un framework de test xUnit vraiment puissant pour le code C ++ de test unitaire.
ratkok
5
@CashCow L'exécution avec la build est quelque chose de différent de la détection de test. L'exécution avec build dépend de votre système de build. Des moyens de détection de test que vous n'ont à la liste tous les tests dans une autre classe, il suffit de créer les méthodes d'essai et voilà.
Wernight
Je n'aime pas leur utilisation excessive de macros et le fait d'utiliser des mots courants comme TEST qui pourraient entrer en conflit avec quelque chose. GTEST serait mieux, moins susceptible de se heurter.
CashCow
112

Je viens de pousser mon propre framework, CATCH , là-bas. Il est encore en cours de développement, mais je pense qu'il dépasse déjà la plupart des autres cadres. Différentes personnes ont des critères différents, mais j'ai essayé de couvrir la plupart des terrains sans trop de compromis. Jetez un oeil à mon entrée de blog liée pour un avant-goût. Mes cinq principales fonctionnalités sont:

  • En-tête uniquement
  • Enregistrement automatique des tests basés sur les fonctions et les méthodes
  • Décompose les expressions C ++ standard en LHS et RHS (vous n'avez donc pas besoin de toute une famille de macros d'assertion).
  • Prise en charge des sections imbriquées dans un appareil basé sur une fonction
  • Tests de nom en langage naturel - des noms de fonction / méthode sont générés

Il dispose également de liaisons Objective-C. Le projet est hébergé sur Github

philsquared
la source
Veuillez considérer l'ajout CHECK_FLASEet les REQUIRE_FLASEmacros.
Emile Cormier
6
Le meilleur cadre à mon avis.
CoffeDeveloper
3
doctest est ma réimplémentation de Catch avec un énorme accent sur la vitesse de compilation - consultez la FAQ pour voir comment ils diffèrent
onqtam
@einpoklum Catch n'est pas abandonné - le créateur travaille sur la version 2 de la bibliothèque. doctest est une sorte de réimplémentation de Catch 1 avec quelques décisions de conception de bonus
onqtam
2
Je suis vraiment perdu quand je compare tous les frameworks de test (dont je dois maintenant choisir). Pourriez-vous écrire votre propre réponse en comparant et en contrastant le doctorat avec Catch et d'autres offres?
einpoklum
53

La bibliothèque de tests Boost est un très bon choix, surtout si vous utilisez déjà Boost.

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

Elle supporte:

  • Enregistrement automatique ou manuel des tests
  • De nombreuses affirmations
  • Comparaison automatique des collections
  • Différents formats de sortie (y compris XML )
  • Luminaires / Modèles ...

PS: J'ai écrit un article à ce sujet qui pourrait vous aider à démarrer: C ++ Unit Testing Framework: A Boost Test Tutorial

Wernight
la source
J'avais l'habitude d'utiliser le test Boost et je l'aimais bien, sauf qu'il semblait changer considérablement entre les versions. Il était assez difficile de vendre des tests unitaires à mon client sans avoir à passer plus de temps (et leur argent) à réparer les tests lorsque l'API a changé, qu'à réparer le code qu'elle était censée tester. En fin de compte, je l'ai abandonné et j'ai écrit le mien - c'était il y a environ 5 ans.
Composante 10
5
Le lien du tutoriel est rompu
mloskot
2
@mloskot Cela fonctionne à nouveau.
Chris Jester-Young
@mloskot Désolé pour cela, veuillez m'envoyer directement un e-mail si vous voyez qu'il est cassé. C'est facile à trouver qu'un commentaire. :)
Wernight
@Wernight Yup, fonctionne à nouveau. Thx
mloskot
16

J'ai récemment publié xUnit ++ , spécifiquement comme une alternative à Google Test et à la bibliothèque de tests Boost (voir les comparaisons ). Si vous connaissez xUnit.Net, vous êtes prêt pour xUnit ++.

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

Caractéristiques principales:

  • Incroyablement rapide: les tests s'exécutent simultanément .
  • Portable
  • Enregistrement automatique des tests
  • De nombreux types d'assertions (Boost n'a rien sur xUnit ++)
  • Compare les collections nativement.
  • Les assertions se déclinent en trois niveaux:
    • erreurs fatales
    • erreurs non fatales
    • avertissements
  • Enregistrement facile des assertions :Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Journalisation des tests :Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Agencements
  • Tests basés sur les données (théories)
  • Sélectionnez les tests à exécuter en fonction:
    • Correspondance d'attribut
    • Correspondance de sous-chaîne de nom
    • Suites de test
moswald
la source
2
La question demande une comparaison. OMI, il est essentiel de présenter quelles sont les différences entre votre framework et, au moins, les deux populaires: googletest et Boost. Surtout, si vous annoncez xUnit ++ comme alternative à ces deux-là. Sera +1 si mis à jour :)
mloskot
C'est suffisant. :) J'ai déjà un tableau de comparaison sur le wiki , mais je vais essayer de résumer quelques différences directement dans ma réponse.
moswald
1
J'ai décidé de lier directement le tableau wiki, il encombrait le résumé pour tout lister.
moswald
le lien fonctionne pour moi, merci! +1
mloskot
1
votre projet a été interrompu? Le dernier commit remonte au 09/2015 ... Quoi qu'il en soit, excellente réponse. Merci.
zertyz
5

CppUTest - un cadre très agréable et léger avec de fausses bibliothèques. Il vaut la peine de regarder de plus près.

ratkok
la source
4

CPUnit ( http://cpunit.sourceforge.net ) est un framework similaire à Google Test, mais qui repose sur moins de macos (les assertions sont des fonctions), et où les macros sont préfixées pour éviter l'écueil habituel des macros. Les tests ressemblent à:

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

Ils s'enregistrent automatiquement, vous n'avez donc pas besoin de plus que cela. Ensuite, il suffit de compiler et d'exécuter. Je trouve que l'utilisation de ce framework ressemble beaucoup à l'utilisation de JUnit, pour ceux qui ont dû passer du temps à programmer Java. Très agréable!

Roger
la source
2

API Sanity Checker - framework de test pour les bibliothèques C / C ++:

Un générateur automatique de tests unitaires de base pour une bibliothèque C / C ++ partagée. Il est capable de générer des données d'entrée raisonnables (dans la plupart des cas, mais malheureusement pas tous) pour les paramètres et de composer des cas de test simples (de «santé mentale» ou de «faible profondeur») pour chaque fonction de l'API grâce à l'analyse des déclarations dans l'en-tête des dossiers.

La qualité des tests générés permet de vérifier l'absence d'erreurs critiques dans des cas d'utilisation simples. L'outil est capable de créer et d'exécuter des tests générés et de détecter les plantages (erreurs de segmentation), les abandons, toutes sortes de signaux émis, le code retour de programme non nul et le blocage de programme.

Fonctionnalités uniques par rapport à CppUnit, Boost et Google Test:

  • Génération automatique des données de test et des arguments d'entrée (même pour les types de données complexes)
  • Types spécialisés modernes et hautement réutilisables au lieu d'appareils et de modèles
linuxbuild
la source