Catch2 / Google Test für C++: vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Was sind Catch2 und Google Test und wozu braucht man sie?

\n\n

In der modernen Softwareentwicklung mit C++ ist Testen kein Luxus, sondern eine Notwendigkeit. Bibliotheken für Modultests (Unit Testing) ermöglichen es Entwicklern, automatisch zu überprüfen, ob einzelne Komponenten eines Programms (Funktionen, Klassen, Module) korrekt funktionieren. Die beiden beliebtesten Bibliotheken für diesen Zweck sind Catch2 und Google Test (gtest).

\n\n

Catch2 ist eine moderne, leichtgewichtige und sehr benutzerfreundliche Bibliothek für Modultests. Ihre Hauptbesonderheit ist die Verwendung von Makros, die Tests lesbar und wie normales Englisch aussehen lassen. Catch2 unterstützt den Behaviour-Driven Development (BDD)-Stil, die automatische Registrierung von Tests und erfordert keine komplexe Konfiguration.

\n\n

Google Test (gtest) ist eine leistungsstarke und ausgereifte Bibliothek von Google, die in vielen großen Projekten der De-facto-Standard ist. Sie bietet eine umfangreiche Sammlung von Assertion-Makros, Mechanismen zur Erstellung von Test-Fixuren (Test Fixtures), parametrisierte Tests und eine hervorragende Integration mit dem Build-System CMake.

\n\n

Beide Bibliotheken lösen die gleiche Aufgabe: Sie ermöglichen das Schreiben von Tests, die automatisch ausgeführt werden und über die Ergebnisse berichten. Die Wahl zwischen ihnen hängt oft von persönlichen Vorlieben, Projektanforderungen oder der vorhandenen Infrastruktur ab. In diesem Artikel werden wir beide Bibliotheken betrachten, da sie konzeptionell sehr ähnlich sind, aber Unterschiede in der Syntax und API aufweisen.

\n\n

Installation

\n\n

Im Gegensatz zu Python (wo pip verwendet wird) erfolgt die Installation von Bibliotheken für C++ in der Regel über die Paketmanager des Systems oder über die Integration mit dem Build-System (z. B. CMake). Betrachten wir beide Varianten.

\n\n

Installation von Catch2

\n

Methode 1: Über vcpkg (empfohlen)

\n
# Installieren Sie vcpkg, falls noch nicht geschehen\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh  # oder .\\bootstrap-vcpkg.bat unter Windows\n\n# Installieren Sie Catch2\n./vcpkg install catch2\n\n# Integration mit CMake\n./vcpkg integrate install
\n\n

Methode 2: Header-only (am einfachsten)
\nCatch2 kann als Header-only-Bibliothek verwendet werden. Laden Sie einfach die Datei catch.hpp aus dem offiziellen Repository herunter und legen Sie sie in Ihrem Projektordner ab. Binden Sie sie dann im Code ein:

\n
#define CATCH_CONFIG_MAIN  // Diese Zeile darf nur in einer .cpp-Datei vorkommen\n#include "catch.hpp"
\n\n

Installation von Google Test

\n

Methode 1: Über vcpkg

\n
./vcpkg install gtest\n./vcpkg integrate install
\n\n

Methode 2: Über CMake FetchContent (empfohlen für Projekte mit CMake)
\nFügen Sie Folgendes in Ihre CMakeLists.txt ein:

\n
include(FetchContent)\nFetchContent_Declare(\n  googletest\n  GIT_REPOSITORY https://github.com/google/googletest.git\n  GIT_TAG release-1.12.1\n)\nFetchContent_MakeAvailable(googletest)\n\n# Jetzt können Sie target_link_libraries für Ihre Testdatei verwenden\nadd_executable(my_tests test.cpp)\ntarget_link_libraries(my_tests GTest::gtest_main)
\n\n

Schnellstart mit einem Codebeispiel

\n\n

Lassen Sie uns eine einfache Funktion schreiben und sie mit beiden Bibliotheken testen. Die Funktion soll die Fakultät einer Zahl berechnen.

\n\n

Beispiel mit Catch2

\n
#define CATCH_CONFIG_MAIN\n#include "catch.hpp"\n\n// Zu testende Funktion\nunsigned int factorial(unsigned int n) {\n    if (n == 0) return 1;\n    return n * factorial(n - 1);\n}\n\n// Testfall\nTEST_CASE("Fakultäten werden korrekt berechnet", "[factorial]") {\n    REQUIRE(factorial(0) == 1);\n    REQUIRE(factorial(1) == 1);\n    REQUIRE(factorial(2) == 2);\n    REQUIRE(factorial(3) == 6);\n    REQUIRE(factorial(10) == 3628800);\n}\n\n// Ein weiterer Testfall mit Abschnitten\nTEST_CASE("Überprüfung von Grenzfällen", "[factorial][edge]") {\n    SECTIO                    

Empfehlungen