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("!"));
}
Auch in der Bibliothek
phpdotenv
PHP-Anwendungsüberwachung: Tools und Bibliotheken zur Leistungsverfolgung
gRPC C++ Leitfaden: Vollständiges Tutorial mit Beispielen
Überwachung von C++-Anwendungen: Bibliotheken und Tools zur Metrikenerfassung