Google Test



  • Hallo, ich bin zwangsläufig mit Google Test in Berührung gekommen und muss damit meine Software testen (habe keine Ahnung davon). Da meine Software relativ skalierbar ist, kann ich keine festen Wert als Rückgabe erwarten, im Allgemein kann ich nur mit dem Zwischenergebnis false rechnen oder den Endergebnissen false oder true.
    Meine Frage ist jetzt, ob ein Google Test das automatisch erkennt und daraufhin entsprechend testet, oder ob ich diesen Test dann selber schreiben muss? Ich bin leider absoluter Anfänger auf dem Gebiet. Könnte mir jemand im Allgemeinen mal kurz erläutern, wie Google Test funktioniert? Auch für hilfreiche Links bin ich sehr dankbar!



  • @julianmaximilian sagte in Google Test:

    kann ich keine festen Wert als Rückgabe erwarten, im Allgemein kann ich nur mit dem Zwischenergebnis false rechnen oder den Endergebnissen false oder true.

    Gibt es gar keinen erwünschten Rückgabewert bei spezifischen Inputs, bzw. Verhalten? Können auch geworfene Exceptions sein, völlig egal.

    Meine Frage ist jetzt, ob ein Google Test das automatisch erkennt und daraufhin entsprechend testet, oder ob ich diesen Test dann selber schreiben muss?

    Die Tests müssen selber geschrieben werden. Es sind im Grunde Testfunktionen, welche Deine eigenen Funktionen auf ihr Verhalten oder ihr Rückgabewert hin prüfen. Zumindest ist es bei allen Test-Frameworks, mit welchen ich beruflich und privat zutun habe (u.a. NUnit, JUnit, Jasmine und Protractor), der Fall.

    Ich bin leider absoluter Anfänger auf dem Gebiet. Könnte mir jemand im Allgemeinen mal kurz erläutern, wie Google Test funktioniert? Auch für hilfreiche Links bin ich sehr dankbar!

    Hattest Du noch nie was mit Testing zutun?

    Google dokumentiert sein Framework auf GitHub, ansonsten gibt es sicherlich auch anderweitig gute Literatur.

    https://github.com/google/googletest/blob/master/googletest/docs/primer.md
    https://github.com/google/googletest/blob/master/googlemock/README.md

    Du solltest Dir beim Testing die AAA-Konvention angewöhnen. Arrange, Act and Assert (oder Given, When, Then).

    https://www.c-sharpcorner.com/UploadFile/dacca2/fundamental-of-unit-testing-understand-aaa-in-unit-testing/

    Wichtig ist außerdem, welche Testart Du durchführen möchtest. Soll eine Funktion in Isolation und dadurch ohne Abhängigkeiten geprüft werden (Unit-Test) oder sollen Abhängigkeiten (bspw. andere Funktionen, auf welche Deine intern zugreift) nicht simuliert werden (Integrationstest)? Habe Dir deshalb auch die Dokumentation von gMock zusätzlich verlinkt.

    Wenn Deine Funktion nur true oder false zurückgibt, also einen boolischen Wert, dann musst Du einen entsprechenden Test schreiben, welcher eben prüft, dass nichts anderes als true oder false zurückkommt. Wie sinnvoll das ist, kann ich ohne Dein Programm zu kennen, nicht sagen.

    Also als Kick-Start für Dich solltest Du, wenn Du Dich eingelesen hast, eine Testfunktion schreiben, welche gemäß der AAA-Konvention zuerst alles vorab bereitstellt (Arrange), dann Deine Funktion aufruft und den Rückgabewert speichert (Act) und zum Schluss diesen auf ein gewünschtes Ergebnis evaluiert (Assert).



  • Vielen Dank erstmal für die Antwort! Ich habe eigentlich nie einen spezifischen Wert als Rückgabe, da es sich um eine Simulation handelt, in der ich Zufallsvariablen habe, die auch das Ergebnis beeinflussen. Daher könnte ich im besten Falle diese die Zufallsvariablen überschreiben und stattdessen dafür festgelegte Variable benutzen. Diese müsste ich dann natürlich aber über den Test irgendwie einspeisen.



  • @julianmaximilian Du testest eigentlich nie das große Ganze mit Unittests, sondern immer einzelne Module. D.h. es macht keinen Sinn deine ganze Simulation mit einem Test versuchen zu erschlagen, sondern du pickst dir kleine Untereinheiten raus und testest die mit Unittests ab.

    Fairerweise muss man sagen, dass die Module dafür "testfreundlich" geschrieben sein sollten. Das macht es zumindest einfacher, Tests zu entwerfen. D.h. du hast z.B. eine Klasse, die mittels einer Methode etwas tut. Du gibst einen Wert/Parameter rein ( oder auch nicht ), rufst die Methode auf und prüfst ab, ob sie getan hat was sie tun sollte. Das ganze führst du mit verschiedenen Werten durch ( auch mit ungültigen ) und prüfst jedes Mal ob das passiert ist, was du von der Methode erwartet hast. Und wenn die Methoden selbst keine Rückgabewerte haben, dann brauchst du Methoden, die z.B. einen Status abrufen, oder irgendein Callback, was Daten zurückliefert. Es gibt verschiedenste Varianten, deren Sinnhaftigkeit aber auch immer davon abhängt, was du testest.

    Wenn man "TDD" ( "test-driven-development" ) betreibt, ist es auch eigentlich eher so, dass man die Klasse im Kopf ( oder anderswo ) entwirft und dann zuerst die Tests schreibt und danach die Klasse schrittweise mit Leben füllt, bis alle Tests erfolgreich sind. Wenn man den Quellcode schon hat und erst hinterher die Tests schreibt ist etwas komplizierter, aber nicht unmöglich.


  • Mod

    Was die Zufallszahlen angeht: Eine ganz wichtige Eigenschaft von testfreundlicher Software ist, dass man keine festen Abhängigkeiten hat. Beispielsweise sollte ein Stück Software, das Zufallszahlen verbraucht, niemals fest von einem Zufallsgenerator abhängen, d.h. der spezielle Zufallsgenerator darf nicht unantastbar im Code fest verdrahtet sein, sondern muss nach außen offen für den Nutzer änderbar sein. D.h. der Nutzer übergibt dem Zufallszahlenverbraucher den Zufallszahlengenerator. Und im Fall eines Tests übergibst du dann eben einen getürkten Zufallsgenerator, der eine bestimmte, gewünschte Sequenz erzeugt.

    Wie schon angedeutet sollte man das nicht nur für Zufallsgeneratoren so handhaben, sondern mit allen möglichen Abhängigkeiten. Nicht nur, weil dann Tests viel einfacher werden, sondern auch weil das auch sonst allerlei wesentliche Vorteile bezüglich Wiederverwendbarkeit des Codes hat. Das ist ein recht wichtiges Prinzip beim Design von Software und hat daher auch ein Schlagwort: Dependency Injection. Solltest du unbedingt mal angucken, wenn du halbwegs ernsthafte Programme schreibst, was du ja anscheinend auch vor hast. Der Zweck von Googletest ist unter anderem, dich dabei zu unterstützen.


Log in to reply