Frage

Ich bin ein ziemlich neuer Software-Entwickler arbeitet derzeit das Hinzufügen von Unit-Tests in ein bestehenden C ++ Projekt, dass begannen vor Jahren. Aufgrund einer nicht-technischen Grund, darf ich keine vorhandenen Code ändern. Die Basisklasse aller meine Module hat eine Reihe von Methoden für das Setzen / Abrufen von Daten und die Kommunikation mit anderen Modulen.

Da ich will Einheit nur jedes einzelne Modul zu testen, möchte ich in der Lage sein, in Dosen Werte Methoden für alle meine Zwischenmodul-Kommunikation zu verwenden. D. h für ein Verfahren Ping (), die überprüft, ob ein anderes Modul aktiv ist, möchte ich es haben Rückkehr wahr oder falsch basierend auf welche Art von Test mache ich. Ich habe mich in Google-Test und Google Mock, und es unterstützt spöttische nicht-virtuelle Methoden. Doch der Ansatz beschrieben ( http://code.google.com/p/googlemock/ wiki / Kochbuch # Mocking_Nonvirtual_Methods ) erfordert mich zu „templatize“ die ursprünglichen Methoden in entweder real oder Mock-Objekte zu nehmen. Ich kann nicht meine Methoden in der Basisklasse aufgrund der Anforderung gehen und templatize bereits erwähnt, so dass ich diese virtuellen Methoden der spöttischen eine andere Art und Weise brauchen

Grundsätzlich ist die Methoden, die ich zu verspotten will, sind in einiger Basisklasse, die Module I Unit-Test will und schaffen Mocks von abgeleiteten Klassen dieser Basisklasse. Es gibt Zwischenmodule zwischen meinen Basismodulklasse und die Module, die ich testen möchten.

Ich würde schätzen jede Beratung!

Danke,

JW

EDIT: Eine konkretere Beispiele

Meine Basisklasse können sagen, rootModule, das Modul I zu testen will, ist leafModule. Es ist ein Zwischenmodul, das erbt von rootModule, leafModule erbt von diesem Zwischenmodul.

In meinem leafModule möchte ich die doStuff () Methode testen, die den nicht virtuellen GetStatus (Modulname) in der rootModule Klasse definiert nennt. Ich muss irgendwie machen GetStatus () einen gewählten Dosen Wert zurückzukehren. Mocking ist neu für mich, so Mock-Objekte auch den richtigen Ansatz verwendet?

War es hilfreich?

Lösung

würde ich ein Perl / Ruby-/ Python-Skript schreiben, in dem ursprünglichen Quellbaum und schreibt einen verspottete Quellbaum in einem anderen Verzeichnis zu lesen. Sie haben nicht zu voll Parsen C ++, um eine Funktionsdefinition zu ersetzen.

Andere Tipps

Es gibt einige verschiedene Möglichkeiten für den Ersatz nicht-virtuelle Funktionen. Eine davon ist neu zu erklären sie und kompilieren eine neue Test ausführbare Datei für jede andere Gruppe von nicht-virtuellen Funktionen, die Sie testen möchten. Das ist kaum skalierbar.

Eine zweite Möglichkeit besteht darin, sie virtuell für den Test zu machen. Die meisten Compiler können Sie etwas über die Befehlszeile definieren, damit Ihr Code mit -DTEST_VIRTUAL kompilieren = virtuelle oder -DTEST_VIRTUAL, um sie entweder virtuelle oder normal abhängig davon, ob oder nicht, es ist im Test oder nicht.

Eine dritte Option, die sein kann, verwendbar ist einen Mockframework zu verwenden, die Sie verspotten nicht-virtuelle Funktionen ermöglicht. Ich bin den Autor von HippoMocks (Haftungsausschluss im Hinblick auf Neutralität und so weiter), und wir haben vor kurzem die Möglichkeit, verspotten Ebene C-Funktionen auf X86-Plattformen hinzugefügt. Dies kann mit einem wenig Arbeit zu nicht-virtuellen Member-Funktionen erweitert werden und würde das sein, was Sie suchen. Beachten Sie, dass, wenn Ihr Compiler sowohl die Verwendung und die Definition einer Funktion auf einmal sehen kann, dass sie es inline kann und dass die spöttischen fehlschlagen. Das gilt insbesondere für Funktionen, die in Header definiert sind.

Wenn reguläre C-Funktion spöttische für Sie ausreichend ist, können Sie es verwenden, wie es jetzt ist.

Ein Ansatz wäre verschiedene Quellen angeben, für die Prüfung. Sagen Sie Ihr Produktionsziel verwendet rootModule.h und rootModule.cpp. Verwenden Sie unterschiedliche Quellen für Ihr Prüfziel. Sie können einen anderen Header angeben, indem Sie Ihren Weg gehören zu ändern, so dass # include „rootModule.h“ tatsächlich Lasten Unittest / rootModule.h. Dann Mock rootModule zu Inhalt Ihres Herzens.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top