CPPUnit tests zählen



  • Hallo,

    für eine kleine Test-Statistik habe ich mir eigene Makros erweitert.
    Diese zählen in einer Variablen jeden ausgeführten Test.
    Jetzt möchte ich gern wissen wie ich es anstellen kann wirklich alle Bedingungen zu zählen.

    Beispiel

    CPPUNIT_ASSERT_EQUAL_STRING_MESSAGE_MB(msg,exp,giv)
       CPPUNIT_ASSERT_EQUAL_STRING_MESSAGE_MB(msg,exp,giv)
       CPPUNIT_ASSERT_EQUAL_STRING_MESSAGE_MB(msg,exp,giv)
    

    Als Ergebnis möchte ich gern 3 haben.
    Wenn Test 2 allerdings schon fehlschlägt kommt das Programm gar nicht bis zum 3. Aufruf.

    Weiteres Problem:
    in einer Schleife wird eine Bedingung ausgeführt

    Beispiel

    for (int i=0; i<100; i++) {
       ...
       CPPUNIT_ASSERT_EQUAL_STRING_MESSAGE_MB(msg,i,giv)
    }
    

    jetzt hätte ich gern 100 als Ergebnis, egal wann ein Test fehlschlägt.

    Ich bitte um Tipps



  • Sollen wir raten, wie CPPUNIT_ASSERT_EQUAL_STRING_MESSAGE_MB definiert ist?

    Wenn Test 2 allerdings schon fehlschlägt kommt das Programm gar nicht bis zum 3. Aufruf.

    Wieso sollte das so sein?
    Falls assert aufgerufen wird, so wie es der Name vermuten lassen könnte: wieso entfernst du es nicht!? Ist aber offensichtlich, also meinst du wohl etwas anderes.



  • Es ist vielleicht nicht so elegant gelöst wie es könnte.
    Ich habe eine Klasse Unittest_info
    mit einer statischen Variablen, diese soll bei jedem Test erhöht werden.
    Danach wird das original-Makro aufgerufen.

    /** zum Vergleichen von Strings (char*)
    */
    #define CPPUNIT_ASSERT_EQUAL_STRING_MESSAGE_MB(message,expected,actual)      \
    	{\
    	(Unittest_info::testCheckCounter++); \
    		std::string expectedString=expected;\
    		std::string actualString = actual;\
    		std::string msgString = message;\
      ( \
      CPPUNIT_NS::assertEquals( (expectedString),              \
                                  (actualString),                \
                                  CPPUNIT_SOURCELINE(),    \
                                  (msgString) ) );\
    							  }
    

    In meiner Statistik gebe ich mit einem XmlOutputterHookMB aus
    wieviele Checks durchgeführt wurden.

    Ich weis das ich an einem Assert nicht vorbeikomme,
    aber vielleicht gibt es ja eine Möglichkeit das

    Beim Einfügen des Makros ein Zähler hochgezählt wird,
    so das, naiv gedacht, das Zählen dem Präprozessor überlassen wird



  • Das wird so nicht gehen. Selbst wenn man die Anzahl der Ersetzung mitzählen lassen könnte (mir fällt jedenfalls im Moment keine Möglichkeit ein), würden Schleifen dabei nicht berücksichtigt.
    Wenn nach dem ersten fehlgeschlagenen Test keine weiteren mehr durchgeführt werden sollen, kannst du dir bei Fehlschlag die relevanten Informationen merken und ein Flag setzen, das vor jedem Test überprüft wird und dazu führt, dass er nicht durchgeführt wird, falls es gesetzt ist. Die Fehlermeldung kannst du dann bei Programmende ausgeben lassen.
    Wenn allerdings zwischen den Tests sich noch weiterer Code befindet, der nach dem ersten fehlgeschlagenen Test auch nicht mehr ausgeführt werden darf, sehe ich dafür keine einfache Lösung - sofern die Anzahl der Tests nicht konstant ist, gibt es auch keine.



  • mir würde was zum mitzählen einfallen^^
    __COUNTER__ wird zumindest vom MSVC unterstützt und imho auch vom gcc...
    nur kann das eben jeder und alles nutzen - vll gibts da noch was anderes, musst du ma in der msdn rumwühlen, aber so wird z.bsp. auch jedes static_assert mitzählen, was du iwo mal im quellcode hast...
    allerdings müsste man da wieder die schleife weglassen und die aufrufe von hand einfügen bzw. dem präprozessor sagen...

    allerdings find ich den grund für das mitzählen wollen ein wenig komisch...
    kann aber auch sein, dass ich ihn einfach nicht verstanden habe...

    bb



  • Hallo,
    das mit __COUNTER__ hab ich probiert,
    funktioniert in einer Datei recht schön.

    Ich brauche das jetzt aber so das als Letztes eine Bestimmte Datei erzeugt wird,
    damit ich den Counter-Wert dann einer Varialblen zuweisen kann, kann jemand einen Tip geben wie ich das provoziere ?


Anmelden zum Antworten