Einsteigerfragen zu Unit Tests



  • Hi!
    Ich habe vor kurzem angefangen mich mit Unit Tests zu beschäftigen. Es erscheint mir natürlich sehr sinnvoll Code auf diese Art und Weise zu testen. Ich habe mir mehrere Tutorials durchgelesen.
    Dabei kommt mal wieder ein grundlegendes Problem von diesen Anleitungen zum tragen: quasi jeder bringt dasselbe einfache Beispiel:

    also z.B.

    TEST(FirstTestGroup, FirstTest)
    {
       FAIL("Fail me!");
    }
    

    schlägt fehl. Ok.

    .. aber keines zeigt, wie man denn jetzt vorgeht um seinen eigenen Code zu testen.

    Die Frage, die sich mit die ganze Zeit stellt ist: was hat das mit meinem bestehenden Code zu tun? Ich programmiere für ein Embedded Board unter Visual Studio. Dort wird der Unit Test auch angeboten (wird dann auf dem Board ausgeführt). Ich habe nun 2 Projekte. Mein Ursprüngliches und das Unit Test Projekt. Aber wie verknüpfe ich das das jetzt?


  • Mod

    Tendenziell kommen da so Dinge rein wie:

    list = {5,2,7,2,7,1}
    sort(list)
    assert(list == {1,2,2,5,7,7})
    

    In Wirklichkeit wird das natürlich oft komplizierter sein, denn die Idee ist es, dass man komplexes Verhalten testet, keine Trivialitäten. Deshalb ist es recht schwer, ein sinnvolles, einfaches Beispiel anzugeben. Obiger Test für eine hypothetische Sortierfunktion lässt beispielsweise noch vieles außen vor, was man normalerweise testen würde.



  • Du musst in der Test-Funktion Code von dir aufrufen und gewisse Annahmen überprüfen. Es sollte Funktionen wie ASSERT_TRUE() oder ASSERT_EQUALS() geben, mit denen du überprüfen kannst, ob dein Code das tut, was du erwartest.
    Wenn du bspw. eine Funktion foo() hast und du erwartest, dass sie den String "bar" zurück gibt, dann testest (je nach Framework) du das ungefähr so:

    ASSERT_EQUALS("bar", foo())
    

    Wenn der Test fehlschlägt, dann gibt dir der Test den von der Funktion tatsächlich zurückgelieferten Wert zurück.


  • Mod

    hm..ist das jetzt eine Frage zu C++ (kann nix mit dem (unvollständigen) Code anfangen) oder eher eine Frage zum Testen (wie testet man denn nun?)
    Im ersten Fall müsste man die Frage in das c++ Forum verschieben.
    Im letzteren Fall könnte man auf zuerst mal von Hand testen verweisen oder eben darauf, den vollständigen Code(-zusammenhang) anzuschauen, nicht nur Teile davon.



  • ShadowClone schrieb:

    Du musst in der Test-Funktion Code von dir aufrufen und gewisse Annahmen überprüfen.

    Ok. Abe jetzt mal von der organisatorischen Seite her: wieso füge ich dann keine TestKlasse zu meinem Projekt hinzu und teste von da aus? Wieso ein extra Projekt? Und wie rufe ich vom einen Projekt Code aus dem anderen auf?



  • SchlitzInDaHaus schrieb:

    Ok. Abe jetzt mal von der organisatorischen Seite her: wieso füge ich dann keine TestKlasse zu meinem Projekt hinzu und teste von da aus? Wieso ein extra Projekt?

    Um den Test-Code vom zu testenden Code zu trennen. Das bringt Übersichtlichkeit und hält unnötigen Code aus dem Produktions-Projekt raus.

    SchlitzInDaHaus schrieb:

    Und wie rufe ich vom einen Projekt Code aus dem anderen auf?

    Je nachdem. Z. B. indem man den zu testenden Code als Library baut und ihn in das Test-Projekt einbindet. Oder indem man den zu testenden Code direkt in das Test-Projekt einbezieht, z. B. bei Header-only.



  • Wieso ein extra Projekt?

    Weil du ein eigenständiges Binary (exe) erzeugst.

    einfachster Fall:
    Deine "richtiges" Projekt erzeugt ne exe für den "Kunden"
    Deine TestAp, verwendet die zu testende Klasse und erzeugt ebenfalls eine exe.
    Deine testapp, verwendet aber eigentlich andere Abhängigkeiten und vor allem deine TestLib Impl.
    Der Kunde würde sich freuen, wenn er bei den ausgelieferten shared libs ne unittest.xyz mit findet 🙂 oder auch nicht 🙂

    Und wie rufe ich vom einen Projekt Code aus dem anderen auf?

    Deine "Test.exe" verwendet die Produktiv-Code-Klasse (ist in der testexe eincompiliert). die testexe wird nur im Zuge des Tests in Rahmen vom "CI" oder bei einfacheren Projekten einfach beim Builden mit ausgeführt.
    D.h. deine Toolkette checkt nach dem bauen gleich, ob deine Tests auch ordnungsgemäß durchlaufen, wenn nicht, ist dein Build "Fehlerhaft"

    Ciao ...


Anmelden zum Antworten