webentwicklung-frage-antwort-db.com.de

Vergleich von C ++ Unit Test Frameworks

Ich weiß, dass es bereits einige Fragen zu Empfehlungen für C++ - Unit-Test-Frameworks gibt, aber alle Antworten haben nicht geholfen, da sie nur eines der Frameworks empfehlen, aber keine Informationen zu einem (Feature-) Vergleich liefern.

Ich denke, die interessantesten Frameworks sind CppUnit, Boost und das neue Testframework von Google. Hat jemand schon einen Vergleich gemacht?

284
housemaister

Siehe diese Frage für eine Diskussion.

Sie empfehlen die Artikel: Exploring the C++ Unit Testing Framework Jungle , Von Noel Llopis. Und die neueren: C++ Test Unit Frameworks

Ich habe noch keinen Artikel gefunden, der Googletest mit den anderen Frameworks vergleicht.

92
Sam Saffron

Ein neuer Player ist Google Test (auch bekannt als Google C++ Testing Framework), was allerdings ziemlich gut ist.

#include <gtest/gtest.h>

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

Haupteigenschaften:

  • Portable
  • Schwerwiegende und nicht schwerwiegende Behauptungen
  • Einfache Aussagen informative Nachrichten : ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test erkennt Ihre Tests automatisch und fordert Sie nicht auf, sie aufzuzählen, um sie auszuführen
  • Machen Sie es sich leicht, Ihr Behauptungsvokabular zu erweitern
  • Sterbetests (siehe erweiterte Anleitung)
  • SCOPED_TRACE Für Unterprogrammschleifen
  • Sie können entscheiden , welche Tests ausgeführt werden sollen
  • [~ # ~] xml [~ # ~] Testberichterstellung
  • Fixtures / Mock / Templates ...
114
Wernight

Ich habe gerade mein eigenes Framework herausgebracht, CATCH . Es ist noch in der Entwicklung, aber ich glaube, es übertrifft bereits die meisten anderen Frameworks. Unterschiedliche Leute haben unterschiedliche Kriterien, aber ich habe versucht, den größten Teil des Gebiets ohne zu viele Kompromisse abzudecken. Werfen Sie einen Blick auf meinen verlinkten Blog-Eintrag, um einen Vorgeschmack zu erhalten. Meine fünf wichtigsten Funktionen sind:

  • Nur Header
  • Automatische Registrierung von funktions- und methodenbasierten Tests
  • Zerlegt Standard-C++ - Ausdrücke in LHS und RHS (sodass Sie nicht eine ganze Familie von Assert-Makros benötigen).
  • Unterstützung für verschachtelte Abschnitte in einem funktionsbasierten Fixture
  • Namenstests in natürlicher Sprache - Funktions-/Methodennamen werden generiert

Es hat auch Objective-C-Bindungen. Das Projekt wird gehostet auf Github

105
philsquared

Boost Test Library ist eine sehr gute Wahl, insbesondere wenn Sie Boost bereits verwenden.

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

Es unterstützt:

  • Automatische oder manuelle Testregistrierung
  • Viele Behauptungen
  • Automatischer Vergleich von Sammlungen
  • Verschiedene Ausgabeformate (einschließlich [~ # ~] xml [~ # ~] )
  • Fixtures / Templates ...

PS: Ich habe einen Artikel darüber geschrieben, der Ihnen den Einstieg erleichtern könnte: C++ Unit Testing Framework: Ein Boost-Test-Tutorial

51
Wernight

Wikipedia hat ein umfassendes Liste der Unit-Testing-Frameworks mit Tabellen, in denen die unterstützten oder nicht unterstützten Funktionen aufgeführt sind.

22
John Deters

Ich habe kürzlich xUnit ++ veröffentlicht, speziell als Alternative zu Google Test und der Boost Test Library (siehe Vergleiche ). Wenn Sie mit xUnit.Net vertraut sind, sind Sie bereit für 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));
}

Haupteigenschaften:

  • Unglaublich schnell: Tests werden gleichzeitig ausgeführt .
  • Portable
  • Automatische Testregistrierung
  • Viele Assertionstypen (Boost hat nichts auf xUnit ++)
  • Vergleicht Sammlungen nativ.
  • Behauptungen gibt es in drei Ebenen:
    • schwerwiegende Fehler
    • nicht schwerwiegende Fehler
    • warnungen
  • Einfache Protokollierung : Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Protokollierung testen : Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Spielpaarungen
  • Datengetriebene Tests (Theorien)
  • Wählen Sie aus, welche Tests ausgeführt werden sollen , basierend auf:
    • Attributabstimmung
    • Name Teilstring Matchin
    • Testsuiten
14
moswald

CppUTest - Sehr schönes, leichtes Framework mit Scheinbibliotheken. Ein genauerer Blick lohnt sich.

4
ratkok

CPUnit ( http://cpunit.sourceforge.net ) ist ein Framework, das Google Test ähnelt, jedoch weniger Makros verwendet (Asserts sind Funktionen) und bei denen Makros vorangestellt sind, um das zu vermeiden übliche Makrofalle. Tests sehen so aus:

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

}

Sie registrieren sich automatisch, sodass Sie nicht mehr als dies benötigen. Dann ist es einfach zu kompilieren und auszuführen. Ich finde, dass die Verwendung dieses Frameworks der Verwendung von JUnit sehr ähnlich ist, für diejenigen, die einige Zeit damit verbracht haben, Java zu programmieren. Sehr schön!

4
Roger

Unter http://www.progweap.com/resources.html finden Sie einige relevante Ressourcen zum Testen von C++ - Einheiten

3
Dave Young

API Sanity Checker - Testframework für C/C++ - Bibliotheken:

Ein automatischer Generator für grundlegende Unit-Tests für eine gemeinsam genutzte C/C++ - Bibliothek. Es ist in der Lage, sinnvolle (in den meisten, aber leider nicht allen Fällen) Eingabedaten für Parameter zu generieren und einfache ("vernünftige" oder "flache") Testfälle für jede Funktion in der API durch die Analyse von Deklarationen im Header zu erstellen Dateien.

Die Qualität der generierten Tests ermöglicht es, in einfachen Anwendungsfällen das Fehlen kritischer Fehler zu überprüfen. Das Tool ist in der Lage, generierte Tests zu erstellen und auszuführen sowie Abstürze (Segfaults), Abbrüche, alle Arten von ausgesendeten Signalen, Nicht-Null-Programmrückgabecode und Programmabstürze zu erkennen.

Einzigartige Funktionen im Vergleich zu CppUnit, Boost und Google Test:

  • Automatische Generierung von Testdaten und Eingabeargumenten (auch für komplexe Datentypen)
  • Modern und hochgradig wiederverwendbar Spezialtypen statt Fixtures und Templates
2
linuxbuild