Testen in C++: Unit, Integration, E2E von A bis Z – vollständiger Leitfaden

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: Warum C++-Testen die Grundlage für zuverlässigen Code ist

\n

Die Entwicklung in C++ ist immer mit hoher Verantwortung verbunden. Die Sprache bietet vollständige Kontrolle über Speicher und Leistung, aber der Preis eines Fehlers kann katastrophal sein: von Speicherlecks bis zum Absturz des gesamten Systems. Deshalb ist Testen in C++ keine Option, sondern ein obligatorischer Schritt in der Entwicklung jedes ernsthaften Projekts.

\n

In diesem Artikel behandeln wir drei wichtige Testebenen: Unit (Modultests), Integration (Integrationstests) und E2E (End-to-End-Tests). Sie erfahren, wie sie sich unterscheiden, welche Werkzeuge Sie verwenden sollten und wie Sie Tests in C++ richtig schreiben. Das Material ist sowohl für Anfänger als auch für erfahrene Entwickler nützlich, die ihr Wissen systematisieren möchten.

\n\n

1. Unit-Tests in C++: Die „Bausteine“ des Programms testen

\n

Unit-Tests (oder Modultests) überprüfen die kleinste Codeeinheit – normalerweise eine einzelne Funktion oder eine Methode einer Klasse. Ihr Hauptziel: die Komponente zu isolieren und sicherzustellen, dass sie unabhängig von externen Abhängigkeiten korrekt funktioniert.

\n\n

1.1. Werkzeuge für C++-Unit-Tests

\n

Auf dem C++-Markt gibt es mehrere ausgereifte Frameworks. Hier sind die beliebtesten:

\n
    \n
  • Google Test (GTest) – der De-facto-Standard. Leistungsstarke Makros, Unterstützung für parametrisierte Tests, Mock-Objekte (über Google Mock).
  • \n
  • Catch2 – leicht, modern, mit hervorragender Syntax. Geeignet für kleinere Projekte.
  • \n
  • Boost.Test – Teil der Boost-Bibliothek. Umfangreich, aber funktional.
  • \n
\n

Wir werden Google Test als die am weitesten verbreitete Option verwenden.

\n\n

1.2. Beispiel eines Unit-Tests in C++ (Google Test)

\n

Angenommen, wir haben eine einfache Funktion zur Berechnung der Fakultät:

\n
// math_utils.h\n#pragma once\nint factorial(int n);
\n
// math_utils.cpp\n#include "math_utils.h"\nint factorial(int n) {\n    if (n < 0) return -1; // Fehler: negative Zahl\n    if (n == 0) return 1;\n    return n * factorial(n - 1);\n}
\n

Jetzt schreiben wir einen Unit-Test mit Google Test:

\n
// test_math_utils.cpp\n#include <gtest/gtest.h>\n#include "math_utils.h"\n\nTEST(FactorialTest, HandlesZeroInput) {\n    EXPECT_EQ(factorial(0), 1);\n}\n\nTEST(FactorialTest, HandlesPositiveInput) {\n    EXPECT_EQ(factorial(5), 120);\n}\n\nTEST(FactorialTest, HandlesNegativeInput) {\n    EXPECT_EQ(factorial(-1), -1);\n}\n\nint main(int argc, char **argv) {\n    ::testing::InitGoogleTest(&argc, argv);\n    return RUN_ALL_TESTS();\n}
\n

Wir führen die Tests aus – und sehen grünes Licht. Wenn die Funktion einen Fehler hätte (z. B. factorial(5) würde 119 zurückgeben), würde der Test fehlschlagen, und wir wüssten sofort von dem Problem.

\n\n

1.3. Best Practices für Unit-Tests

\n
    \n
  • Isolation: Verwenden Sie Mocks, um externe Abhängigkeiten (DB, Netzwerk, Dateisystem) zu ersetzen.
  • \n
  • Eine Überprüfung pro Test: Jeder TEST sollte ein Verhalten überprüfen.
  • \n
  • Aussagekräftige Namen: HandlesZeroInput ist besser als Test1.
  • \n
  • Abdeckung von Grenzfällen: Null, negative Zahlen, Maximalwerte.
  • \n
\n\n

2. Integrationstests (Integration Testing): Das Zusammenspiel überprüfen

\n

Integrationstests überprüfen, wie verschiedene Module des Systems zusammenarbeiten. Im Gegensatz zu Unit-Tests isolieren wir die Komponenten hier nicht – wir testen die tatsächlichen Verbindungen (z. B. den Aufruf einer Funktion aus einer Klasse, die eine andere Klasse verwendet).

\n\n

2.1. Wann sind Integrationstests notwendig?

\n
    \n
  • Wenn zwei Module Daten austauschen (z. B. Parser + Validator).
  • \n
  • Bei der Arbeit mit externen Ressourcen: Datenbank, Dateien, Netzwerk-Sockets.
  • \n
  • Nach dem Zusammenführen mehrerer unit-getesteter Komponenten.

Blogs

Buchempfehlungen