Vergelijking van C++ Unit Test Frameworks

Ik weet dat er al een paar vragen zijn over aanbevelingen voor C++ Unit-testkaders, maar alle antwoorden hielden niet omdat ze een van de frameworks aanbevelen, maar geen informatie over een (functie) vergelijking verstrekken.

Ik denk dat de meest interessante frameworks CPPunit zijn, Boost en het nieuwe Google-testkader. Heeft iemand al een vergelijking gedaan?


Antwoord 1, Autoriteit 100%

Bekijk deze vraag voor een discussie.

ze bevelen de artikelen aan:
Onderzoek naar het C++ eenheidstestkader Jungle , door Noel Llopis.
En hoe meer recent: C++ testeenheid frameworks

Ik heb nog geen artikel gevonden dat al het googletest vergelijkt met de andere frameworks.


Antwoord 2, Autoriteit 118%

Een nieuwe speler is Google-test (ook bekend als Google C++ Testkader ) wat echter behoorlijk leuk is.

#include <gtest/gtest.h>
TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

Belangrijkste kenmerken:

  • draagbaar
  • fataal en niet-fatale beweringen
  • Easy Assertions Informative Berichten : ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test Automatisch Detecteert uw tests en vereist niet dat u ze opsommingt om ze te laten uitvoeren
  • Maak het gemakkelijk om uit te breiden Your Assertion Wocabulary
  • Doodstests (zie Geavanceerde gids)
  • SCOPED_TRACEvoor subroutine-lussen
  • U kunt bepalen welke tests
  • uitvoeren

  • XML Testrapportgeneratie
  • armaturen / mock / sjablonen

Antwoord 3, Autoriteit 112%

Ik heb net mijn eigen raamwerk geduwd, Catch , daar. Het is nog in ontwikkeling, maar ik geloof dat het al de meeste andere frameworks overtreft.
Verschillende mensen hebben verschillende criteria, maar ik heb geprobeerd de meeste grond te dekken zonder te veel wisselden.
Bekijk mijn gekoppelde bloginvoer voor een proever. Mijn top vijf functies zijn:

  • header alleen
  • Auto-registratie van functie- en methode-gebaseerde tests
  • Ontbleeft standaard C++ uitdrukkingen in LHS en RHS (dus u hebt geen hele familie van Assert Macro’s nodig).
  • Ondersteuning voor geneste secties binnen een op functie gebaseerde armatuur
  • Naamtesten met behulp van natuurlijke taal – functie / methodamen worden gegenereerd

Het heeft ook objectieve C-bindingen. Het project wordt gehost op github


Antwoord 4, Autoriteit 50%

Boost Test Library is een zeer goede keuze, vooral als u al boost gebruikt.

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

Het ondersteunt:

  • Automatischeof handmatige testregistratie
  • Veel beweringen
  • Automatische vergelijking van collecties
  • Verschillende uitvoerformaten (inclusief XML)
  • Fixtures/ Sjablonen

PS: ik heb er een artikel over geschreven dat je misschien op weg kan helpen: C++ Unit Testing Framework : Een zelfstudie voor een boost-test


Antwoord 5, autoriteit 24%

Wikipedia heeft een uitgebreide lijst met frameworks voor unit-testing, met tabellen die functies identificeren die wel of niet worden ondersteund .


Antwoord 6, autoriteit 15%

Ik heb onlangs xUnit++uitgebracht, specifiek als alternatief voor Google Test en de Boost Test Library (bekijk de vergelijkingen). Als je bekend bent met xUnit.Net, ben je klaar voor 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));
}

Belangrijkste kenmerken:

  • Ongelooflijk snel: tests worden gelijktijdiguitgevoerd.
  • Draagbaar
  • Automatischetestregistratie
  • Veeltypen beweringen (Boost heeft niets op xUnit++)
  • Vergelijkt collectiesnative.
  • Beweringen zijn er in drieniveaus:
    • fatale fouten
    • niet-fatale fouten
    • waarschuwingen
  • Eenvoudig bewerenloggen: Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Testlogboekregistratie: Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Installaties
  • Datagestuurdetests (theorieën)
  • Selecteer welke tests u wilt uitvoerenop basis van:
    • Kenmerkovereenkomst
    • Naam subtekenreeks matchin
    • Testsuites

Antwoord 7, autoriteit 5%

CppUTest– zeer mooi, lichtgewicht framework met nepbibliotheken. De moeite waard om eens van dichterbij te bekijken.


Antwoord 8, autoriteit 4%

CPUnit (http://cpunit.sourceforge.net) is een framework dat vergelijkbaar is met Google Test, maar die afhankelijk is van minder macos (beweringen zijn functies), en waar de macro’s worden voorafgegaan om de gebruikelijke macro-valkuil te vermijden. Tests zien er als volgt uit:

#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.
    }
}

Ze registreren zich automatisch, dus meer heb je niet nodig. Dan is het gewoon compileren en uitvoeren. Ik vind het gebruik van dit framework erg veel lijken op het gebruik van JUnit, voor degenen die enige tijd hebben moeten besteden aan het programmeren van Java. Heel mooi!


Antwoord 9, autoriteit 3%

Er zijn enkele relevante bronnen voor het testen van C++-eenheden op:
http://www.progweap.com/resources.html


Antwoord 10, autoriteit 3%

API Sanity Checker— testraamwerk voor C/C++-bibliotheken:

Een automatische generator van basiseenheidstests voor een gedeelde C/C++-bibliotheek. Het is in staat om redelijke (in de meeste, maar helaas niet alle, gevallen) invoergegevens voor parameters te genereren en eenvoudige (“sanity” of “shallow”-kwaliteit) testgevallen voor elke functie in de API samen te stellen door de analyse van declaraties in de header bestanden.

De kwaliteit van gegenereerde tests maakt het mogelijk om de afwezigheid van kritieke fouten in eenvoudige gebruikssituaties te controleren. De tool is in staat om gegenereerde tests te bouwen en uit te voeren en crashes (segfaults), aborts, alle soorten uitgezonden signalen, niet-nul programma-retourcode en vastlopen van programma’s te detecteren.

Unieke eigenschappen in vergelijking met CppUnit, Boost en Google Test:

  • Automatisch genereren van testgegevens en invoerargumenten (zelfs voor complexe gegevenstypen)
  • Moderne en zeer herbruikbare gespecialiseerde typenin plaats van armaturen en sjablonen

Other episodes