Catch2 Matchers für C++: Vollständiges Tutorial 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

Catch2 Matchers für C++: Vollständiges Tutorial mit Beispielen

1. Was sind Catch2 Matchers und warum braucht man sie?

Die Bibliothek Catch2 (C++ Automated Test Cases in Headers) ist ein modernes Framework für Unit-Tests in C++, das als reine Header-Only-Bibliothek verteilt wird. Eine ihrer leistungsstärksten Funktionen ist das Matcher-System – deklarative Prüfwerkzeuge, die Tests lesbarer, flexibler und aussagekräftiger machen.

Im Gegensatz zu traditionellen Assertions wie REQUIRE(x == 5) erlauben Matcher die Formulierung komplexer Bedingungen in einer natürlichen, fast menschenlesbaren Form. Anstatt eine Schleife zu schreiben, um alle Elemente eines Vektors zu prüfen, können Sie einfach REQUIRE_THAT(vec, Catch::Matchers::AllMatch(Catch::Matchers::Predicate<int>([](int i) { return i > 0; }))) verwenden. Das spart nicht nur Code, sondern macht die Absicht des Testersteller kristallklar.

Warum Matcher? Erstens bieten sie hohe Ausdrucksstärke: Sie können prüfen, ob ein String eine Teilzeichenkette enthält, mit einem bestimmten Präfix beginnt oder ob eine Zahl in einem bestimmten Bereich liegt – und das mit einer einzigen, prägnanten Anweisung. Zweitens liefern Matcher bei fehlgeschlagenen Tests detaillierte Diagnosen – statt einer trockenen "false"-Meldung erhalten Sie eine aussagekräftige Nachricht wie "Erwartet: beginnt mit 'Hallo' Tatsächlich: 'Welt'". Drittens sind sie komponierbar: Sie können einfache Matcher mit logischen Operatoren (Und, Oder, Nicht) zu komplexen Ausdrücken kombinieren.

2. Installation

Catch2 ist eine Header-Only-Bibliothek. Für die Nutzung ist keine komplizierte Installation oder Build-Konfiguration erforderlich. Es gibt zwei Hauptwege:

Methode 1: Einzeldatei herunterladen (empfohlen für den Einstieg)

Laden Sie die Datei catch_amalgamated.hpp oder catch.hpp von der offiziellen Catch2-Release-Seite auf GitHub herunter. Legen Sie sie in Ihrem Projektordner ab und binden Sie sie ein:

#include "catch_amalgamated.hpp"

Methode 2: Paketmanager verwenden (vcpkg, Conan, CMake FetchContent)

Für professionelle Projekte empfiehlt sich ein Paketmanager. Beispiel mit vcpkg:

# Catch2 über vcpkg installieren
vcpkg install catch2

Dann in Ihrer CMakeLists.txt:

find_package(Catch2 REQUIRED)
target_link_libraries(my_test PRIVATE Catch2::Catch2WithMain)

Wichtig: In Catch2 v3.x und höher befinden sich die Matcher im Namensraum Catch::Matchers. In v2.x waren sie ebenfalls unter Catch::Matchers (gleicher Name, aber die Header-Struktur hat sich geändert). Für v3.x verwenden Sie #include <catch2/catch_test_macros.hpp> und #include <catch2/matchers/catch_matchers_all.hpp>.

3. Schnellstart – Minimales funktionierendes Beispiel

Schreiben wir einen einfachen Test mit einem Matcher zur String-Überprüfung:

// test.cpp
#define CATCH_CONFIG_MAIN  // Diese Zeile darf nur in einer .cpp-Datei stehen
#include <catch2/catch_test_macros.hpp>
#include <catch2/matchers/catch_matchers_all.hpp>
#include <string>

TEST_CASE("String-Matcher funktionieren", "[string]") {
    std::string hello = "Hallo, Welt!";

    // Prüfen, ob der String eine Teilzeichenkette enthält
    CHECK_THAT(hello, Catch::Matchers::ContainsSubstring("Welt"));

    // Prüfen, ob der String mit "Hallo" beginnt
    CHECK_THAT(hello, Catch::Matchers::StartsWith("Hallo"));

    // Prüfen, ob der String mit "!" endet
    CHECK_THAT(hello, Catch::Matchers::EndsWith("!"));
}

Empfehlungen