it-swarm.com.de

Komponententest für C++ - Code - Tools und Methodik

Ich arbeite an einem großen C++ - System, das seit einigen Jahren entwickelt wird. Im Zuge der Bemühungen, die Qualität des bestehenden Codes zu verbessern, haben wir ein großes langfristiges Refactoring-Projekt durchgeführt.

Kennen Sie ein gutes Tool, mit dem ich Komponententests in C++ schreiben kann? Vielleicht etwas ähnliches zu Junit oder Nunit?

Kann jemand einen guten Rat geben, wie man Unit-Tests für Module schreibt, die ohne Unit-Test geschrieben wurden?

134
Sakin

Unit-Tests auf Legacy-Code anzuwenden war der sehr GrundEffektiv mit Legacy-Code arbeiten wurde geschrieben. Michael Feathers ist der Autor - wie in anderen Antworten erwähnt, war er an der Erstellung von CppUnit und CppUnitLite beteiligt.

alt text

78
Joe Schneider

Google hat kürzlich eine eigene Bibliothek für Unit-Testing-C++ - Apps mit dem Namen Google Test veröffentlicht.

Projekt auf Google Code

38
agnul

Prüfen Sie einen ausgezeichneten Vergleich zwischen mehreren verfügbaren Suiten. Der Autor dieses Artikels entwickelte später UnitTest ++ .

Was mir besonders gut gefällt (abgesehen von der Tatsache, dass Ausnahmen usw. gut behandelt werden) ist, dass die Definition der Testfälle und Testvorrichtungen sehr begrenzt ist. 

30
andreas buykx

Boost verfügt über eine Testing-Bibliothek , die Unterstützung für Unit-Tests enthält. Es lohnt sich vielleicht, es auszuprobieren.

24
Jonas

Noel Llopis von Games From Within ist der Autor von Exploration des C++ Unit Testing Framework Jungle , einer umfassenden (aber jetzt veralteten) Bewertung der verschiedenen C++ Unit Testing-Frameworks sowie eines Buches zur Spieleprogrammierung .

Er verwendete CppUnitLite eine ganze Weile, um verschiedene Dinge zu reparieren, aber schloss sich schließlich mit einem anderen Autor von Unit-Test-Bibliotheken zusammen und produzierte UnitTest ++ . Wir verwenden hier UnitTest ++ und es gefällt mir bisher sehr gut. Es hat (für mich) genau das richtige Kräfteverhältnis bei geringem Platzbedarf. 

Ich habe einheimische Lösungen verwendet, CxxTest (für die Perl erforderlich ist) und boost :: test. Als ich hier bei meinem aktuellen Job Unit-Tests implementierte, kam es im Wesentlichen auf UnitTest ++ vs. boost :: test. 

Ich mag die meisten Boost-Bibliotheken, die ich verwendet habe, aber meiner Meinung nach ist boost :: test etwas zu schwerfällig. Mir gefiel vor allem nicht, dass Sie (AFAIK) das Hauptprogramm des Test-Kabelsatzes mit einem boost :: test-Makro implementieren müssen. Ich weiß, dass es sich nicht um "reines" TDD handelt, aber manchmal benötigen wir eine Möglichkeit, Tests mit einer GUI-Anwendung auszuführen, beispielsweise wenn ein spezielles Testflag in der Befehlszeile übergeben wird und boost :: test diesen Typ nicht unterstützen kann von Szenario. 

UnitTest ++ war das einfachste Test-Framework, das ich in meiner (begrenzten) Erfahrung kennenlernen und verwenden konnte. 

21
Brian Stewart

Ich verwende die exzellente Boost.Test -Bibliothek in Verbindung mit einer viel weniger bekannten, aber ach so awesome Turtle -Bibliothek: Eine auf Boost basierende Scheinobjekt-Bibliothek.

Stellen Sie sich vor, Sie möchten ein calculator-Objekt testen, das an einer view-Schnittstelle (das ist das Einführungsbeispiel von Turtle) funktioniert:

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

Sehen Sie, wie einfach und ausführlich die Erwartung für das Scheinobjekt ist. Offensichtlich ist der Test nicht erfolgreich, wenn die Erwartungen nicht erfüllt werden.

17
icecrime

Ich habe gerade mein eigenes Framework, CATCH , da draußen geschoben. Es befindet sich noch in der Entwicklung, aber ich glaube, es übertrifft die meisten anderen Rahmenbedingungen bereits. Verschiedene Personen haben unterschiedliche Kriterien, aber ich habe versucht, die meisten Abgründe ohne zu viele Kompromisse abzudecken ein Vorgeschmack Meine fünf wichtigsten Funktionen sind:

  • Nur Kopfzeile
  • Automatische Registrierung von Funktions- und Methodentests
  • Dekomponiert Standard-C++ - Ausdrücke in LHS und RHS (sodass Sie keine ganze Familie von Assert-Makros benötigen).
  • Unterstützung für verschachtelte Abschnitte in einem funktionsbasierten Gerät
  • Namenstests in natürlicher Sprache - Funktions-/Methodennamen werden generiert

Es hat auch Objective-C-Bindungen.

14
philsquared

CxxTest ist ein leichtes, benutzerfreundliches und plattformunabhängiges JUnit/CppUnit/xUnit-ähnliches Framework für C++.

9
David Sykes
7
Jorge Ferreira

UnitTest ++ , klein und einfach.

7
yrp

Ich bin derzeit auf der Suche nach einem Unit-Test- und Mock-Framework, das in unserem Unternehmen für eine langjährige Codebasis verwendet werden kann. Wie Sie wissen, ist die Liste der Komponententest-Frameworks für c ++ lang. Daher habe ich einige Filter angewendet, um sie auf eine vollständige Anzeige zu reduzieren, die genauer betrachtet werden kann. Das erste Filterkriterium war, dass es kostenlos sein muss. Das zweite Kriterium war die Projektaktivität. Ich habe auch nach mockenden Frameworks gesucht, weil Sie eines benötigen, wenn Sie Komponententests schreiben möchten.

Ich habe die folgende Liste (ungefähr) nach Aktivität sortiert, höchste Aktivität oben:

  • GoogleTest/GoogleMock: Viele Mitwirkende und von Google selbst verwendet. Dies wird wahrscheinlich für einige Zeit hier sein und Updates erhalten. Für meine private Code-Basis werde ich zu dieser Kombination wechseln, in der Hoffnung, auf den schnellsten Zug zu springen.

  • BoostTest + Turtle: Nicht so oft aktualisiert, aber das Testframework ist Teil des Auftriebs und sollte daher beibehalten werden. Turtle hingegen wird hauptsächlich von einem Mann gepflegt, aber es hat keine Aktivität abgelehnt, also ist es nicht tot .. Ich habe fast alle meine Testerfahrung mit dieser Kombination gemacht, weil wir die Boost-Bibliothek bereits an meinem vorherigen Job verwendet haben und ich derzeit benutze es für meinen privaten Code.

  • CppUTest: Bietet Test und Spott. Dieses Projekt war von 2008 bis 2015 aktiv und hat in letzter Zeit viel zu tun. Diese Entdeckung war etwas überraschend, da viele Projekte mit deutlich weniger Aktivitäten häufiger bei der Suche im Web auftauchten (wie CppUnit, das 2013 zuletzt aktualisiert wurde). Ich habe mich nicht näher damit befasst, daher kann ich nichts zu den Details sagenEdit (16.12.2015): Ich habe es kürzlich ausprobiert und fand dieses Framework etwas unbeholfen und "C- stylisch ", vor allem bei den Mock-Klassen. Es schien auch eine kleinere Vielfalt von Behauptungen zu haben als andere Rahmen. Ich denke, seine Hauptstärke ist, dass es mit reinen C-Projekten verwendet werden kann.

  • QTest: Die mit dem Qt-Framework ausgelieferte Testbibliothek. Wartung sollte für einige Zeit garantiert sein, aber ich verwende sie eher als unterstützende Bibliothek, da die Test-Registrierung IMO unbeholfener ist als in anderen Frameworks. Soweit ich es verstehe, zwingt es Sie zu einem Testexe pro Testvorrichtung. Die Testhilfefunktionen können jedoch beim Testen von Qt-Gui-Code von Nutzen sein. Es hat keine Spötze.

  • Catch: Es hat kürzlich Aktivität, wird aber hauptsächlich von einem Mann entwickelt. Das Schöne an diesem Framework ist der alternative Fixture-Ansatz, mit dem Sie wiederverwendbaren Fixture-Code im Test selbst schreiben können. Sie können auch Testnamen als Zeichenfolgen festlegen. Dies ist Nizza, wenn Sie ganze Sätze als Testnamen schreiben. Ich wünsche mir, dass dieser Stil von googleTest abgezogen und eingefügt wird ;-)

Scheinrahmen

Die Anzahl der Mock-Frameworks ist viel geringer als die Anzahl der Test-Frameworks, aber hier sind diejenigen, bei denen ich kürzlich Aktivitäten festgestellt habe.

  • Hippomock: Aktiv ab 2008, aber nur mit geringer Intensität.

  • FakeIt: Aktiv ab 2013, aber mehr oder weniger von einem Mann entwickelt.

Fazit

Wenn Ihre Code-Basis langfristig vorhanden ist, wählen Sie zwischen BoostTest + Turtle und GoogleTest + GoogleMock. Ich denke, dass diese beiden eine langfristige Wartung haben werden. Wenn Sie nur eine kurzlebige Codebasis haben, können Sie Catch ausprobieren, das eine Nice-Syntax hat. Dann müssten Sie zusätzlich ein Mocking Framework auswählen. Wenn Sie mit Visual Studio arbeiten, können Sie Test-Runner-Adapter für BoostTest und GoogleTest herunterladen. Auf diese Weise können Sie die Tests mit der in VS integrierten Test-Runner-Benutzeroberfläche ausführen.

5
Knitschi

Siehe auch die Antworten auf die eng verwandte Frage "Auswahl eines C++ - Testgeräts/Frameworks", hier

3
TonJ

Es gibt auch TUT , Template-Unit-Test, ein vorlagenbasiertes Framework. Die Syntax ist umständlich (einige nennen es Vorlagenmissbrauch), aber der Hauptvorteil besteht darin, dass alles in einer single-Header-Datei enthalten ist. 

Hier finden Sie ein Beispiel für einen Unit-Test, der mit TUT geschrieben wurde. 

3
philant

CppUTest ist ein hervorragendes, leichtes Rahmenwerk für C- und C++ - Gerätetests.

2
ratkok

Ich habe CPPunit ausprobiert und es ist nicht sehr benutzerfreundlich.

Die einzige Alternative, die ich kenne, ist die Verwendung von C++ .NET, um Ihre C++ - Klassen zu umschließen und Komponententests mit einem der .NET-Unit-Testframeworks (NUnit, MBUnit usw.) zu schreiben.

2
Dror Helper

Wenn Sie mit Visual Studio 2008 SP1 arbeiten, würde ich MSTest zum Schreiben der Komponententests dringend empfehlen. Ich verwende dann Google Mock zum Schreiben der Mocks. Die Integration mit der IDE ist ideal und erlaubt und trägt nicht den Aufwand von CPPunit in Bezug auf die Bearbeitung von drei Stellen für das Hinzufügen eines Tests.

1
Jared

Werfen Sie einen Blick auf cfix ( http://www.cfix-testing.org ). Es ist auf die Entwicklung von Windows C/C++ spezialisiert und unterstützt sowohl den Benutzermodus als auch den Kernelmodus.

1

Michael Feathers von ObjectMentor war maßgeblich an der Entwicklung von CppUnit und CppUnitLite beteiligt.

Er empfiehlt jetzt CppUnitLite

1
Seb Rose

Ich denke, VisualAssert macht einen guten Job bei der VS-Integration. Sie können die Tests von VS aus ausführen und debuggen, und Sie müssen keine ausführbare Datei erstellen, um die Tests auszuführen.

1
Ohad Horesh

Schauen Sie sich CUnitWin32 an. Es wurde für MS Visual C geschrieben. Es enthält ein Beispiel.

1
Dushara

Check out Fructose: http://sourceforge.net/projects/fructose/

Es ist ein sehr einfaches Framework, das nur Header-Dateien enthält und daher einfach portierbar ist.

0
rik

Ich verwende MS Test mit Typemock Isolator ++ . Versuche es!

0
Sam