Vergleich von C ++ Unit Unit Frameworks [geschlossen]

300

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 (Funktions-) Vergleich liefern.

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

Hausmädchen
quelle
2
Mögliches Duplikat von Unit-Tests für C ++ - Code - Tools und Methodik
HaskellElephant
Ich habe mein eigenes IOC-basiertes Testframework, das mir besser gefällt, weil es nicht nur ein Klon dessen ist, was alle anderen tun, sondern auch die Probleme der anderen anspricht. Sie schreiben Testfälle, indem Sie von einer Klasse ableiten und keine Makros verwenden. Makros werden nur für Behauptungen verwendet, da sie Ihnen Reflexion geben. Angepasste Ausgabe von Teststatistiken. Führen Sie IOC-Skripte aus, damit Sie auswählen, was Sie wie oft und mit welchen Parametern testen möchten.
CashCow
und es ist aus entwicklungspolitischer Sicht brillant, wenn ich meinen eigenen Test hinzufüge, kann ich ihn ausführen, ohne dass alle anderen gleichzeitig ausgeführt werden müssen. Ich weiß also, dass mein Code funktioniert.
CashCow

Antworten:

99

Siehe diese Frage für eine Diskussion.

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

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

Sam Safran
quelle
Wie ich schrieb: Alle Antworten empfehlen nur eines der Frameworks, vergleichen das Framework jedoch nicht mit einem anderen.
Hausmeister
Du bist auch nicht zufrieden mit dem Artikel?
Gishu
7
Ein Kritikpunkt: Der Artikel ist zwar gut, stammt jedoch aus dem Jahr 2004 und enthält Google Test nicht.
Richq
2
Im ersten Link sehen Sie zwei Vergleiche. Mit Ausnahme des neuen Frameworks von Google sind (sind?) Die meisten Informationen immer noch relevant. (Und CppUnit ist nicht das interessanteste, es ist zu ungeschickt, um es zu benutzen)
Luc Hermitte
1
Links repariert und die Antwort mit einem neueren Vergleich erweitert
Sam Saffron
120

Ein neuer Player ist Google Test (auch als Google C ++ Testing Framework bekannt ), was allerdings ziemlich nett 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:

  • tragbar
  • Tödliche und nicht tödliche Behauptungen
  • Einfache Aussagen informative Nachrichten :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test erkennt Ihre Tests automatisch und erfordert keine Aufzählung, um sie auszuführen
  • Machen Sie es sich einfach , Ihr Assertionsvokabular zu erweitern
  • Todestests (siehe erweiterte Anleitung)
  • SCOPED_TRACE für Unterprogrammschleifen
  • Sie können entscheiden, welche Tests ausgeführt werden sollen
  • Generierung von XML- Testberichten
  • Fixtures / Mock / Templates ...
Wernight
quelle
3
Ich genieße es wirklich, Google Test über einige der anderen Frameworks zu verwenden, insbesondere mit seinen Verspottungsfunktionen, die im Googlemock-Framework zu finden sind.
Mike
8
Ich biete all diese Funktionen (obwohl einige noch nicht öffentlich sind) und mehr in meinem neuen Testframework CATCH an. Siehe meine Antwort für den Link.
Philsquared
2
Die Kombination mit dem Google C ++ Mocking-Framework macht es zu einem wirklich leistungsstarken xUnit-Testframework für Unit-Test-C ++ - Code.
Ratkok
5
@CashCow Das Ausführen mit dem Build unterscheidet sich von der Testerkennung. Das Ausführen mit Build hängt von Ihrem Build-System ab. Test - Erfassungseinrichtung Sie nicht haben , um alle Tests in einer anderen Klasse Liste, sondern die Tests Methoden erstellen und das ist es.
Wernight
Ich mag jedoch nicht die übermäßige Verwendung von Makros und die Tatsache, dass gebräuchliche Wörter wie TEST verwendet werden, die mit etwas in Konflikt geraten könnten. GTEST wäre besser und würde weniger wahrscheinlich zusammenstoßen.
CashCow
112

Ich habe gerade mein eigenes Framework, CATCH , veröffentlicht. Es befindet sich noch in der Entwicklung, aber ich glaube, es übertrifft bereits die meisten anderen Frameworks. Unterschiedliche Menschen haben unterschiedliche Kriterien, aber ich habe versucht, den größten Teil des Bodens ohne zu viele Kompromisse abzudecken. Schauen Sie sich meinen verlinkten Blogeintrag an, 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 innerhalb eines funktionsbasierten Geräts
  • Namenstests in natürlicher Sprache - Funktions- / Methodennamen werden generiert

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

philsquared
quelle
Bitte erwägen Sie das Hinzufügen CHECK_FLASEund REQUIRE_FLASEMakros.
Emile Cormier
6
Bester Rahmen meiner Meinung nach.
CoffeDeveloper
3
doctest ist meine Neuimplementierung von Catch mit einem großen Fokus auf die Kompilierungsgeschwindigkeit
lesen
@einpoklum Catch wird nicht abgebrochen - der Ersteller arbeitet an Version 2 der Bibliothek. doctest ist eine Art Neuimplementierung von Catch 1 mit einigen Bonus-Designentscheidungen
Uhr
2
Ich bin wirklich ratlos, wenn ich alle Test-Frameworks vergleiche (von denen ich jetzt eines auswählen muss). Würden Sie Ihre eigene Antwort schreiben, indem Sie Doktest mit Catch und anderen Angeboten vergleichen und kontrastieren?
Einpoklum
53

Die Boost-Testbibliothek 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 beim Einstieg helfen kann: C ++ Unit Testing Framework: Ein Boost-Test-Tutorial

Wernight
quelle
Ich habe den Boost-Test verwendet und mochte ihn, außer dass er sich zwischen den Veröffentlichungen erheblich zu ändern schien. Es war schwierig genug, Unit-Tests an meinen Kunden zu verkaufen, ohne mehr Zeit (und Geld) damit verbringen zu müssen, die Tests zu reparieren, wenn sich die API änderte, als den Code zu reparieren, den sie testen sollten. Am Ende habe ich es fallen lassen und mein eigenes geschrieben - das war allerdings vor ungefähr 5 Jahren.
Komponente 10 10.
5
Der Tutorial-Link ist defekt
Mloskot
2
@mloskot Es funktioniert wieder.
Chris Jester-Young
@mloskot Entschuldigung, bitte senden Sie mir direkt eine E-Mail, wenn Sie sehen, dass es kaputt ist. Es ist leicht zu finden als ein Kommentar. :)
Wernight
@Wernight Yup, funktioniert wieder. Thx
Mloskot
24

Wikipedia verfügt über eine umfassende Liste von Unit-Testing-Frameworks mit Tabellen, in denen die unterstützten oder nicht unterstützten Funktionen aufgeführt sind.

John Deters
quelle
16

Ich habe kürzlich xUnit ++ veröffentlicht , speziell als Alternative zu Google Test und der Boost-Testbibliothek (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 .
  • tragbar
  • Automatische Testregistrierung
  • Viele Assertionstypen (Boost hat nichts auf xUnit ++)
  • Vergleicht Sammlungen nativ.
  • Behauptungen gibt es auf drei Ebenen:
    • schwerwiegende Fehler
    • nicht schwerwiegende Fehler
    • Warnungen
  • Einfache Assert- Protokollierung:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Testprotokollierung :Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Vorrichtungen
  • Datengesteuerte Tests (Theorien)
  • Wählen Sie aus, welche Tests ausgeführt werden sollen :
    • Attributabgleich
    • Name Teilzeichenfolge Matchin
    • Testsuiten
Moswald
quelle
2
Die Frage ist zum Vergleich. IMO, es ist wichtig, die Unterschiede zwischen Ihrem Framework und zumindest den beiden beliebtesten darzustellen: googletest und Boost. Insbesondere, wenn Sie xUnit ++ als Alternative zu diesen beiden bewerben. Wird +1 sein, wenn aktualisiert :)
Mloskot
Meinetwegen. :) Ich habe bereits eine Vergleichstabelle im Wiki , aber ich werde versuchen, einige der Unterschiede direkt in meiner Antwort zusammenzufassen.
Moswald
1
Ich habe mich entschlossen, die Wiki-Tabelle direkt zu verlinken. Die Zusammenfassung war voll, um alles aufzulisten.
Moswald
Der Link funktioniert bei mir, danke! +1
Mloskot
1
Wurde Ihr Projekt eingestellt? Das letzte Commit stammt aus dem Jahr 09/2015 ... Wie auch immer, tolle Antwort. Vielen Dank.
zertyz
4

CPUnit ( http://cpunit.sourceforge.net ) ist ein Framework, das Google Test ähnelt, jedoch weniger Macos verwendet (Asserts sind Funktionen) und bei dem den Makros ein Präfix vorangestellt wird, um die übliche Makrofalle zu vermeiden. Tests sehen aus wie:

#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 benötigen. Dann wird es einfach kompiliert und ausgeführt. Ich finde die Verwendung dieses Frameworks sehr ähnlich wie die Verwendung von JUnit für diejenigen, die einige Zeit mit der Programmierung von Java verbringen mussten. Sehr schön!

Roger
quelle
2

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

Ein automatischer Generator für grundlegende Komponententests für eine gemeinsam genutzte C / C ++ - Bibliothek. Es ist in der Lage, vernünftige (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 Analyse von Deklarationen im Header zu erstellen Dateien.

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

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

  • Automatische Generierung von Testdaten und Eingabeargumenten (auch für komplexe Datentypen)
  • Moderne und hoch wiederverwendbare Spezialtypen anstelle von Vorrichtungen und Vorlagen
Linuxbuild
quelle