Google Test Tutorial
In diesem Google Test Tutorial zeige ich euch wie man das Testframework von Google für ein C++ Projekt auf Windows 10 verwendet. Um mit Testdriven Development und Unit Tests zu arbeiten empfiehlt sich ein fertiges Framework. Google Test ist eines von vielen, man findet es auf GitHub.
Google Test Tutorial
Das Google Test Framework besteht aus zwei Teilen:
- Google Test
damit erstellen wir Unit Tests für die Software - Google Mock
wird verwendet um Mock Klassen zu schreiben. Damit kann man beispielsweise Datenbanken im Test simulieren. Warum? Holt man Informationen aus externen Quellen wie einer Datenbank oder aus einem Netzwerk, dann besteht immer die Möglichkeit eines Timeouts oder Netzwerkfehlers. Der Test würde somit fehlschlagen, obwohl der Quellcode völlig in Ordnung ist. Solche Probleme löst man mit Mock Klassen.
Dieses Tutorial wird ausschließlich Google Test behandeln.
Wenn man unter Visual Studio Google Test verwenden will hat man zwei Möglichkeiten:
- selber bauen
Google Test findet man auf GitHub. Von dort hat man immer den aktuellen Stand des Codes, man kann sich jederzeit neue Binaries bauen. - integriertes Paket verwenden
Visual Studio hat im C++ Modul ein eigenes Google Test Paket, dass man installieren und damit recht einfach neue Google Test Projekte erstellen kann.
Selber bauen
Ich starte damit mir mittels git den aktuellen Stand der Software zu klonen:
Das Testframework wird mit CMake erstellt. Unter Windows kann man das Programm CMake GUI verwenden. Unter Source trägt man den Pfad zum gerade heruntergeladenen Code ein und unter Binaries einfach einen Subfolder mit dem Namen build (kannst du machen wie du willst, aber ein build Unterordner hat sich bisher bewährt).
Um die Visual Studio Projektmappe und die einzelnen Projekte zu erstellen klickt man den Configure Knopf. In einem Dialog muss man die bevorzugte Ausgabe wählen, in meinem Fall ist das Visual Studio 2019. Über Generate werden dann im build Ordner alle Dateien erstellt:
Nun kann man die gtest.sln Projektmappe öffnen und die Projektmappe lässt sich ohne Probleme erstellen:
unter build/lib/Release bzw. build/lib/Debug werden nun die *.lib Dateien für gtest und gtest_main erstellt.
Integriertes Paket verwenden
Seit Visual Studio 2017 ist Google Test fix integriert. Unter den Komponenten im Visual Studio Installer findet man den entsprechenden Eintrag:
Die Installation ist so etwas einfacher als den Quellcode selber zu erstellen. Unter den Projekttemplates findet sich nun ein Google Test Punkt. So erstellt man mit wenigen Mausklicks ein neues Testprojekt:
Die gesamte Konfiguration wird mit folgendem Dialog gemacht:
Ich wähle für gewöhnlich einfach das zu testende Projekt aus und lasse die anderen Einstellungen auf Standard.
Beispiel
Google Test wurde nun auf dem Windows Rechner unter Visual Studio 2019 erstellt. Alles ist vorbereitet, die Tests müssen wir aber immer noch selber schreiben. Ich zeige euch anhand eines Beispiels, wie man mit Google Test arbeitet und Unit Tests erstellt. Wenn man den Ansatz von Testdriven Development ernst nimmt, dann besteht nun jede Änderung im Code aus folgenden Schritten:
- Test erstellen
- testen ob der neue Test fehlschlägt
ohne Änderung am Code muss jeder neue Test per Definition ein Fehlschlag sein (sonst wäre die Änderung im Code ja nicht nötig!) - Programmänderung durchführen
- testen ob der Test nun ein positives Ergebnis liefert
so lange der Test fehlschlägt gibt es noch ein Problem im Code -> zurück zu Punkt 3 - die Liste aller Tests durchlaufen lassen
das ist nicht jedesmal notwendig, sollte aber so oft wie möglich gemacht werden
doch wie wird das im Code gemacht?
Ich teste Methoden von Klassen aus einem externen Projekt. Man kann diese sehr einfach mit dem Header in der test.cpp einfügen und einen Test schreiben. test.cpp ist dabei eine Datei die über die beschriebene Methode in Visual Studio mit dem Google Test Projekt erstellt wurde. Habt ihr das nicht gemacht müsst ihr selber eine test.cpp Datei erstellen in der gtest/gtest.h includiert wird. Einer meiner Tests:
#include "../Core/RandomNumberGenerator.h" // Test RandomNumberGenerator TEST(RandomNumberGenerator, randomNumber) { EXPECT_LT(RandomNumberGenerator::randomNumber(14, 15), 15); }
Erstellt man danach das Testprojekt, dann scheitert man an einem Fehler:
error LNK2019
Der Kompiler hat keine Ahnung wo die randomNumber Funktion implementiert ist. Das externe Projekt ist keine Bibliothek (*.lib oder *.dll), weshalb wir nicht einfach diese als externe Ressource angeben können. Man könnte nun hergehen und den Code (*.h und *.cpp) in diesem Test Projekt integrieren, das wäre aber viel Aufwand und unschön. Einfacher geht es, wenn man die *.obj des anderen Projekts einbindet. Das macht man in Visual Studio über:
Projekteigenschaften -> Linker -> Eingabe -> Zusätzliche Abhängigkeiten
Sobald dort die *.obj Datei von der Klasse hinzugefügt wurde kann man das Google Test Projekt bauen und laufen lassen. In meinem ersten Test soll geprüft werden ob die randomNumber Funktion auch sicher nicht die obere Grenze (exklusiv) zurück gibt. D.h. der zurückgegebene Wert muss immer kleiner als der maximale Wert sein. Das wird mit EXPECT_LT geprüft. Die Ausgabe:
Linux
In einem weiteren Tutorial zeige ich wie man gtest unter Linux einrichten kann und das hier gezeigte Projekt direkt unter Linux compiliert und dort auch den Komfort von automatisierten Tests nutzt.
Fazit
In diesem Tutorial habe ich zwei Methoden beschrieben wie man mit Google Test verwendet. Die direkte Integration in Visual Studio ab der Version 2017 erhöht den Komfort. Nach einem Nachmittag probieren habe ich nun ein eigenes Projekt in meiner Projektmappe in dem ich den Source Code der anderen Projekte mit Google Test automatisiert testen kann. Der weiteren Entwicklung mit Testdriven Development steht nun technisch nichts mehr im Weg. Keine Ausrede mehr schlechten Code zu schreiben.