web-dev-qa-db-fra.com

Comparaison des frameworks de tests unitaires C ++

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

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

284
housemaister

Voir cette question pour discussion.

Ils recommandent les articles: Exploration de la jungle du framework de test unitaire C++ , par Noel Llopis. Et le plus récent: C++ Test Unit Frameworks

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

92
Sam Saffron

Un nouveau joueur est Google Test (également appelé Framework de test Google C++ ), ce qui est plutôt agréable.

#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
  • Fatal et assertions non fatales
  • Assertions faciles informatives messages: ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test automatiquement ​​détecte vos tests et ne vous oblige pas à les énumérer pour les exécuter
  • Rendez-le facile à étendre votre vocabulaire d'affirmation
  • Tests de décès (voir guide détaillé)
  • SCOPED_TRACE pour les boucles de sous-programmes
  • Vous pouvez décider quels tests exécuter
  • XML génération du rapport de test
  • Calendrier/Mock/Modèles ...
114
Wernight

Je viens de pousser mon propre framework, CATCH , là-bas. Il est encore en 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 coup d'oeil à mon entrée de blog liée pour un avant-goût. Mes cinq principales fonctionnalités sont:

  • En-tête seulement
  • Enregistrement automatique des tests basés sur la fonction et la méthode
  • 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
  • Test de nom en langage naturel - les noms de fonction/méthode sont générés

Il a également des liaisons Objective-C. Le projet est hébergé sur Github

105
philsquared

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%
}

Ça supporte:

  • Enregistrement automatique ou manuel
  • Beaucoup d'affirmations
  • Comparaison automatique des collections
  • Différents formats de sortie (y compris XML)
  • Calendrier / Modèles ...

PS: J'ai écrit un article à ce sujet qui pourrait vous aider à démarrer: Framework de test unitaire C++: didacticiel de test Boost

51
Wernight

Wikipedia a une liste complète liste des frameworks de tests unitaires , avec des tableaux identifiant les fonctionnalités prises en charge ou non.

22
John Deters

J'ai récemment publié xUnit ++ , plus précisément comme alternative à Google Test et à la bibliothèque de tests Boost (consultez le 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 sont exécutés simultanément .
  • Portable
  • Enregistrement automatique de test
  • Plusieurs types d'assertions (Boost n'a rien sur xUnit ++)
  • Compare des collections de manière native.
  • Les assertions se présentent à trois niveaux :
    • erreurs fatales
    • erreurs non fatales
    • avertissements
  • Assertion facile : Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Test de l'enregistrement : Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Agencements
  • Tests basés sur des données (Théories)
  • Sélectionnez les tests à exécuter en fonction de:
    • Correspondance d'attribut
    • Nom correspondant à la sous-chaîne
    • Suites de test
14
moswald

CppUTest - très agréable, cadre léger avec des bibliothèques factices. Cela vaut la peine de regarder de plus près.

4
ratkok

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 les piège macro habituel. 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. Ensuite, il suffit de compiler et d’exécuter. Je trouve l'utilisation de ce framework très semblable à celle de JUnit, pour ceux qui ont dû passer du temps à programmer Java. Très agréable!

4
Roger

Il existe des ressources de test d'unité C++ pertinentes à l'adresse http://www.progweap.com/resources.html

3
Dave Young

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 partagée C/C++. Il est capable de générer des données d'entrée de paramètres raisonnables (dans la plupart des cas, mais malheureusement pas dans tous les cas) et de composer des cas de test simples (de "qualité" ou "superficielle") pour chaque fonction de l'API via l'analyse des déclarations contenues 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 construire et d'exécuter des tests générés et de détecter les plantages (segfaults), les abandons, toutes sortes de signaux émis, les codes de retour de programmes non nuls et les suspensions de programmes.

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

  • Génération automatique de données de test et d'arguments d'entrée (même pour des types de données complexes)
  • Moderne et hautement réutilisable types spécialisés à la place de fixtures et de templates
2
linuxbuild