C ++ Unit Tests, spottende Objekte

8

Ich schaue mir gerade einige Komponententestbibliotheken in C ++ an und habe einige Fragen:

  1. In boost.test scheint es keine Spottmöglichkeit zu geben, aber ich kann kaum daran denken, Unit-Tests zu machen, ohne Mock-Objekte / Funktionen zu erstellen. Wie würdest du das in boost.test machen, machst du es manuell (wie? Ich meine, es gibt mehrere Möglichkeiten, die mir gefallen, keine davon scheint nett zu sein) oder machst du einfach ohne Mock-Objekte?

  2. googletest und googlemock sieht aus wie nette Bibliotheken mit Spottunterstützung, aber es erfordert jedes Objekt, das verspottet werden soll, virtuell zu sein. Ich mag das nicht wirklich, es ist nicht so, dass ich mir Sorgen um die Leistung mache (ich könnte ein Makro definieren, um es aus dem Produktionscode herauszubekommen), aber ich finde das sehr aufdringlich. Ich frage mich, ob es eine andere Lösung gibt, die nicht so viele Änderungen am bestehenden Code erfordert? (Liebe clojure dort)

DaVinci 30.11.2010, 00:14
quelle

3 Antworten

6
  1. Boost :: Test hat kein spöttisches Framework oder keine Bibliothek. Wenn du Mocks willst, musst du es selbst machen oder etwas wie GMock verwenden. Natürlich könntest du google mock mit Boost :: Test ohne Probleme verwenden.
  2. Wie sonst würden Sie erwarten, dass etwas zum Schein wird? So funktioniert es in jeder anderen Programmiersprache! (Okay, nicht mit Duck Tippen, aber das trägt mehr Overhead als virtuelle Methoden) Wenn Sie über die Leistung besorgt sind:

    1. Implementieren Sie alles virtuell wie in den allgemeinen Google-Mock-Dokumenten angegeben.
    2. Profiliere deinen Code für Orte, wo das nicht ausreicht
    3. Ersetzen Sie diese profilierten Abschnitte (bzw. das Segment Ihres Codes, das angibt, dass die Leistung ein Problem ist) durch hochperformante Abhängigkeitsinjektion statt.
    4. Ersetzen Sie nicht alles durch hochperfekte DI, denn das würde die Kompilierungszeiten durch das Dach schicken.

    Aber ich glaube nicht, dass die virtuellen Anrufe enorme Leistungsunterschiede verursachen werden. Der einzige Fall, in dem virtuelle Dateien fehlerhaft sind, sind die, in denen sie sich innerhalb innerer Schleifen befinden (wie in der iostream -Bibliothek, wo sie möglicherweise für jedes Zeichen von Eingabe oder Ausgabe genannt werden) und selbst dann nur in leistungssensitivem Code.

BEARBEITEN: Ich vermisste das sehr wichtige Wort nicht in der obigen Frage # 2 - dass Sie nicht um die Leistung besorgt sind. Wenn das der Fall ist, dann ist meine Antwort, Sie sind effektiv geschraubt. Ein einfacher Funktions- oder Methodenaufruf in C ++ generiert einen einfachen Methodenaufruf, und Sie können nicht ändern, wo dieser Aufruf hinweist. In den meisten Fällen erfordert dies keine too viel Codeänderung, da korrekter C ++ - Code wo immer möglich Referenzen verwendet, die trotz der Tatsache, dass virtuals verwendet werden, nicht geändert werden müssen. Sie müssen jedoch auf jeden achten, der Wert Semantik verwendet, weil sie dem Slicing-Problem unterliegen werden.

    
Billy ONeal 30.11.2010, 01:14
quelle
6

Schildkröte wurde explizit für Boost.Test entworfen und sieht sehr gut aus ich.

    
Dave Abrahams 15.01.2012 02:10
quelle
4

Haftungsausschluss Ich arbeite bei Typemock.

Typemock Isolator ++ kann alles Mögliche nachmachen !! Sie brauchen nicht virtuell - alles ist Mockable

Siehe hier

Sie können also öffentlich, privat, abstrakt (ohne tatsächlich eine konkrete Klasse zu erstellen), nicht virtuelle Argumente, Live-Instanz usw. fälschen. Und... Es fälscht alles rekursiv

%Vor%

Wir verwenden den folgenden Code

%Vor%     
Al.exe 14.07.2015 12:20
quelle

Tags und Links