Frage

In Anbetracht solcher Code:

class ToBeTested {
public:
  void doForEach() {
    for (vector<Contained>::iterator it = m_contained.begin(); it != m_contained.end(); it++) {
       doOnce(*it);
       doTwice(*it);
       doTwice(*it);
    }
  }
  void doOnce(Contained & c) {
    // do something
  }
  void doTwice(Contained & c) {
    // do something
  }

  // other methods
private:
  vector<Contained> m_contained;
}

Ich mag, dass testen, ob ich Vektor mit 3 Werten meine Funktionen zu füllen in der richtigen Reihenfolge und Menge genannt werden. Zum Beispiel kann mein Test in etwa so aussehen:

tobeTested.AddContained(one);
tobeTested.AddContained(two);
tobeTested.AddContained(three);

BEGIN_PROC_TEST()
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)

tobeTested.doForEach()
END_PROC_TEST()

Wie würden Sie empfehlen, dies zu testen? Gibt es Mittel, um dies mit CppUnit oder GoogleTest Frameworks zu tun? Vielleicht erlauben einige andere Unit-Test-Framework solche Tests durchführen?

Ich verstehe, dass dies wahrscheinlich ohne Aufruf keine Debug-Funktionen von diesen Funktionen nicht möglich ist, aber zumindest kann er automatisch in einigem Test-Framework durchgeführt werden. Ich mag keine Trace-Protokolle scannen und überprüfen ihre Richtigkeit.

UPD : Ich versuche, den Staat nicht nur zu prüfen ein Objekt, sondern auch die Ausführungsreihenfolge , um Leistungsprobleme zu vermeiden auf so früh wie möglich (und im allgemeinen möchte ich wissen, dass mein Code genau ausgeführt wird, wie ich erwartet hatte).

War es hilfreich?

Lösung

Wenn Sie in der Leistung interessiert sind, empfehle ich Ihnen, einen Test schreiben, die Leistung misst.

Überprüfen Sie die aktuelle Zeit, führen Sie das Verfahren Sie besorgt sind, dann wieder die Zeit überprüfen. Behaupten, dass die Gesamtzeit kleiner als ein Wert.

Das Problem mit zu prüfen, ob Verfahren in einer bestimmten Reihenfolge aufgerufen wird, ist, dass Sie den Code ändern müssen wird, und Sie wollen nicht Ihre Tests haben zu aktualisieren, wenn das passiert. Sie sollten auf die Prüfung konzentrieren, um die tatsächlichen Bedarf statt Testen der Implementierung Detail, das diese Anforderung erfüllt.

Das heißt, wenn Sie wirklich testen möchten, dass Ihre Methoden in einer bestimmten Reihenfolge aufgerufen werden, müssen Sie Folgendes tun:

  1. Bewegen Sie sich in einer anderen Klasse, nennt es Collaborator
  2. Fügen Sie eine Instanz dieser anderen Klasse in die ToBeTested Klasse
  3. ein Mockframework Verwenden Sie die Instanz-Variable auf ToBeTested setzen ein Modell der Collborator Klasse sein
  4. Rufen Sie die Methode im Test
  5. Verwenden des Mockframework zu behaupten, dass die Methoden auf Ihrem Mock in der richtigen Reihenfolge aufgerufen wurden.

Ich bin kein nativer cpp Lautsprecher, damit ich nicht auf dem Mockframework kommentieren Sie verwenden sollten, aber ich sehe einige andere Kommentatoren haben ihre Vorschläge zu dieser Front hinzugefügt.

Andere Tipps

Sie könnten überprüfen mockpp .

Sie sollten alle guten Mockframework nutzen können, um zu überprüfen, dass Anrufe auf eine Zusammenarbeit Objekt in einer bestimmten Reihenfolge durchgeführt werden.

Sie jedoch im Allgemeinen nicht testen, ob ein Verfahren einige Anrufe zu anderen Methoden auf der gleichen Klasse macht ... warum würden Sie?

Im Allgemeinen, wenn Sie eine Klasse zu test, kümmern Sie nur über seinen öffentlich sichtbaren Zustand zu testen. Wenn Sie testen alles andere, Ihre Tests werden verhindern, dass Sie später Refactoring.

Ich könnte mehr Hilfe leisten, aber ich glaube nicht, Ihr Beispiel konsistent ist (Wo ist die Implementierung für die AddContained Methode?).

Anstatt zu versuchen, wie viele Funktionen, um herauszufinden, wurden genannt, und in welcher Reihenfolge, eine Reihe von Eingaben finden, die eine erwartete Ausgabe nur produzieren kann, wenn man die Dinge in der richtigen Reihenfolge aufrufen.

Einige spöttischen Frameworks können Sie bis setzen Erwartungen bestellt, mit dem Sie genau sagen, welche Funktion nennt man in einer bestimmten Reihenfolge erwarten. Zum Beispiel RhinoMocks für C # ermöglicht dies.

Ich bin keine C ++ Coder so bin ich nicht bewusst, was für C ++ verfügbar ist, aber das ist eine Art von Werkzeug, das erlauben könnte, was Sie zu tun versuchen.

http://msdn.microsoft.com/en-au/magazine /cc301356.aspx

Dies ist ein guter Artikel über Kontext-gebundenen Objekte. Es enthält einige so weit fortgeschritten, Sachen, aber wenn Sie nicht faul und wollen wirklich diese Art von Dingen zu verstehen, wird es wirklich hilfreich sein.

Am Ende werden Sie in der Lage sein, etwas zu schreiben wie: [CallTracingAttribute ()] public class traceme: Context {...}

Sie könnten ACE (oder ähnlich) Debug-Frameworks und in Ihrem Test verwenden, konfigurieren Sie das Debug-Objekt in eine Datei zu streamen. Dann brauchen Sie nur die Datei zu überprüfen.

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