Ich arbeite an einem großen C ++ - System, das sich seit einigen Jahren in der Entwicklung befindet. Im Rahmen der Bemühungen, die Qualität des vorhandenen Codes zu verbessern, haben wir ein großes langfristiges Refactoring-Projekt durchgeführt.
Kennen Sie ein gutes Tool, mit dem ich Unit-Tests in C ++ schreiben kann? Vielleicht etwas ähnliches wie Junit oder Nunit?
Kann jemand einen guten Rat zur Methodik des Schreibens von Komponententests für Module geben, die ohne Berücksichtigung von Komponententests geschrieben wurden?
c++
unit-testing
refactoring
Sakin
quelle
quelle
Antworten:
Das Anwenden von Komponententests auf Legacy-Code war genau der Grund, warum das effektive Arbeiten mit Legacy-Code geschrieben wurde. Michael Feathers ist der Autor - wie in anderen Antworten erwähnt, war er an der Erstellung von CppUnit und CppUnitLite beteiligt .
quelle
Google hat kürzlich eine eigene Bibliothek zum Testen von C ++ - Apps namens Google Test veröffentlicht.
Projekt auf Google Code
quelle
Schauen Sie sich einen hervorragenden Vergleich zwischen mehreren verfügbaren Suiten an. Der Autor dieses Artikels entwickelte später UnitTest ++ .
Was mir besonders gefällt (abgesehen von der Tatsache, dass Ausnahmen usw. gut behandelt werden), ist, dass die Definition der Testfälle und Testvorrichtungen nur in sehr begrenztem Umfang verwaltet wird.
quelle
Boost verfügt über eine Testbibliothek, die Unterstützung für Unit-Tests enthält. Es könnte sich lohnen, einen Blick darauf zu werfen.
quelle
Noel Llopis von Games From Within ist der Autor von Exploring the C ++ Unit Testing Framework Jungle , einer umfassenden (aber jetzt veralteten) Bewertung der verschiedenen C ++ Unit Testing Frameworks sowie eines Buches über Spieleprogrammierung.
Er benutzte CppUnitLite eine ganze Weile, um verschiedene Probleme zu beheben, schloss sich aber schließlich mit einem anderen Autor der Unit-Test-Bibliothek 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 selbst entwickelte Lösungen verwendet, CxxTest (für das Perl erforderlich ist) und boost :: test. Als ich hier bei meinem aktuellen Job Unit-Tests implementierte, kam es ziemlich genau auf UnitTest ++ vs boost :: test an.
Ich mag die meisten Boost-Bibliotheken, die ich verwendet habe, sehr, aber meiner Meinung nach ist boost :: test etwas zu hartnäckig. Besonders hat mir nicht gefallen, dass Sie (AFAIK) das Hauptprogramm des Testkabels 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 des Szenarios.
UnitTest ++ war das einfachste Test-Framework zum Einrichten und Verwenden, auf das ich in meiner (begrenzten) Erfahrung gestoßen bin.
quelle
Ich verwende die ausgezeichnete Boost.Test- Bibliothek in Verbindung mit einer viel weniger bekannten, aber ach so großartigen Turtle- Bibliothek: einer auf Boost basierenden Scheinobjektbibliothek.
Stellen Sie sich vor, Sie möchten ein
calculator
Objekt testen, das auf einerview
Schnittstelle funktioniert (das ist das Einführungsbeispiel von Turtle), da ein Codebeispiel besser spricht als Worte :Sehen Sie, wie einfach und ausführlich es ist, Erwartungen an das Scheinobjekt zu deklarieren? Offensichtlich ist der Test fehlgeschlagen, wenn die Erwartungen nicht erfüllt werden.
quelle
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:
Es hat auch Objective-C-Bindungen.
quelle
CxxTest ist ein leichtes, benutzerfreundliches und plattformübergreifendes JUnit / CppUnit / xUnit-ähnliches Framework für C ++.
quelle
CppUnit ist der Weg. Siehe Link unten:
http://cppunit.sourceforge.net/cppunit-wiki
http://en.wikipedia.org/wiki/CppUnit
quelle
UnitTest ++ , klein & einfach.
quelle
Ich bin derzeit auf der Suche nach einem Unit-Test- und Mock-Framework, das in unserem Unternehmen für eine langlebige Codebasis verwendet werden kann. Wie Sie wissen, ist die Liste der Unit-Test-Frameworks für c ++ lang, daher habe ich einige Filter angewendet, um sie auf eine Hand voll 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 spöttischen Frameworks gesucht, weil Sie eines benötigen, wenn Sie Unit-Tests schreiben möchten.
Ich habe die folgende Liste (ungefähr) sortiert nach Aktivität erstellt, höchste Aktivität oben:
GoogleTest / GoogleMock: Viele Mitwirkende, die von Google selbst verwendet werden. Dies wird wahrscheinlich für einige Zeit hier sein und Updates erhalten. Für meine private Codebasis werde ich auf diese Kombination umsteigen, in der Hoffnung, in den schnellsten Zug zu springen.
BoostTest + Turtle: Nicht so oft aktualisiert, aber das Test-Framework ist Teil von Boost, daher sollte es beibehalten werden. Turtle hingegen wird hauptsächlich von einem Mann gepflegt, hat aber keine Aktivität, ist also nicht tot. Ich habe fast alle meine Testerfahrungen mit dieser Kombination gemacht, da wir die Boost-Bibliothek bereits bei meinem vorherigen Job verwendet haben und ich sie derzeit für meinen privaten Code verwende.
CppUTest: Bietet Tests und Verspottungen. Dieses Projekt war von 2008 bis 2015 aktiv und hat in letzter Zeit ziemlich viele Aktivitäten. Dieser Fund war eine kleine Überraschung, da viele Projekte mit deutlich weniger Aktivität häufiger bei der Suche im Web auftauchen (wie CppUnit, das 2013 das letzte Update hatte). Ich habe mich nicht eingehender damit befasst, daher kann ich nichts zu den Details sagen. Bearbeiten (16.12.2015): Ich habe dies kürzlich ausprobiert und festgestellt, dass dieses Framework etwas ungeschickt und "C-stylisch" ist, insbesondere bei Verwendung der Mock-Klassen. Es schien auch eine geringere Vielfalt an Behauptungen zu haben als andere Rahmenbedingungen. Ich denke, seine Hauptstärke ist, dass es mit reinen C-Projekten verwendet werden kann.
QTest: Die Testbibliothek , die mit dem Qt-Framework geliefert wird . Die Wartung sollte für einige Zeit garantiert sein, aber ich verwende sie eher als unterstützende Bibliothek, da die Testregistrierung IMO ungeschickter ist als in anderen Frameworks. Soweit ich es verstehe, zwingt es Sie, eine Test-Exe pro Testvorrichtung zu haben. Die Testhilfefunktionen können jedoch beim Testen des Qt-Gui-Codes von Nutzen sein. Es hat keine Verspottungen.
Fang: Es hat jüngste Aktivitäten, 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. Außerdem können Sie Testnamen als Zeichenfolgen festlegen. Dies ist hilfreich, wenn Sie dazu neigen, ganze Sätze als Testnamen zu schreiben. Ich wünschte, dieser Stil würde herausgerissen und in googleTest eingefügt ;-)
Mock Frameworks
Die Anzahl der Mock-Frameworks ist viel kleiner als die Anzahl der Test-Frameworks, aber hier sind diejenigen, bei denen ich festgestellt habe, dass sie kürzlich aktiv waren.
Hippomock : Ab 2008 aktiv, aber nur mit geringer Intensität.
FakeIt : Ab 2013 aktiv, aber mehr oder weniger von einem Mann entwickelt.
Fazit
Wenn Ihre Codebasis langfristig verfügbar ist, wählen Sie zwischen BoostTest + Turtle und GoogleTest + GoogleMock . Ich denke, diese beiden werden langfristig gewartet werden. Wenn Sie nur eine kurzlebige Codebasis haben, können Sie Catch ausprobieren, das eine schöne Syntax hat. Dann müssten Sie zusätzlich ein spöttisches 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-GUI ausführen.
quelle
Siehe auch die Antworten auf die eng verwandte Frage "Auswahl eines C ++ - Unit-Test-Tools / Frameworks" hier
quelle
Es gibt auch TUT , Template-Unit-Test, ein vorlagenbasiertes Framework. Die Syntax ist umständlich (manche nennen es Vorlagenmissbrauch), aber der Hauptvorteil ist, dass alles in einer einzigen Header-Datei enthalten ist .
Ein Beispiel für einen mit TUT geschriebenen Unit-Test finden Sie hier.
quelle
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 verpacken und Komponententests mit einem der .NET-Unit-Test-Frameworks (NUnit, MBUnit usw.) zu schreiben.
quelle
CppUTest ist ein ausgezeichnetes, leichtes Framework für C- und C ++ - Unit-Tests.
quelle
Michael Feathers von ObjectMentor war maßgeblich an der Entwicklung von CppUnit und CppUnitLite beteiligt.
Er empfiehlt jetzt CppUnitLite
quelle
Schauen Sie sich CUnitWin32 an . Es wurde für MS Visual C geschrieben. Es enthält ein Beispiel.
quelle
Schauen Sie sich cfix ( http://www.cfix-testing.org ) an, es ist auf die Entwicklung von Windows C / C ++ spezialisiert und unterstützt sowohl Unit-Tests im Benutzermodus als auch im Kernelmodus.
quelle
Wenn Sie mit Visual Studio 2008 SP1 arbeiten, würde ich die Verwendung von MSTest zum Schreiben der Komponententests dringend empfehlen. Ich benutze dann Google Mock zum Schreiben der Mocks. Die Integration in die IDE ist ideal und ermöglicht und trägt nicht den Aufwand von CPPunit in Bezug auf die Bearbeitung von drei Stellen für die Hinzufügung eines Tests.
quelle
Ich denke, VisualAssert leistet hervorragende Arbeit bei der VS-Integration. Sie können die Tests in VS ausführen und debuggen, und Sie müssen keine ausführbare Datei erstellen, um die Tests auszuführen.
quelle
Schauen Sie sich Fructose an: http://sourceforge.net/projects/fructose/
Es ist ein sehr einfaches Framework, das nur Header-Dateien enthält und daher leicht portierbar ist.
quelle
Ich verwende MS Test mit Typemock Isolator ++ . Versuche es!
quelle