Testen in C++: Frameworks und Werkzeuge zur Code-Überprüfung

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

Testen in C++: Überblick über Frameworks und Werkzeuge



Testen ist ein wesentlicher Bestandteil der professionellen C++-Entwicklung. Im Gegensatz zu Sprachen mit dynamischer Typisierung erfordert C++ besondere Aufmerksamkeit bei der Speicherverwaltung, RAII und Template-Metaprogrammen. Ohne qualitativ hochwertige Tests kann selbst eine kleine Refaktorisierung zu schwer auffindbaren Fehlern führen. In diesem Artikel betrachten wir die wichtigsten Frameworks für Modultests in C++, ihre Besonderheiten und Anwendungsbeispiele.



Warum C++-Code testen?

Die Hauptgründe für die Einführung von Tests:

  • Sicherheit bei Refaktorisierungen — Tests fixieren das korrekte Verhalten vor Änderungen.
  • Dokumentation — Tests zeigen, wie die API verwendet wird.
  • Erkennung von Regressionen — automatische Überprüfung nach jedem Commit.
  • Validierung von Grenzfällen — Umgang mit nullptr, leeren Containern, Überläufen.


Beliebte Frameworks für C++



1. Google Test (gtest)

Das am weitesten verbreitete Framework von Google. Unterstützt automatische Testregistrierung, Makros ASSERT_* und EXPECT_*, parametrisierte Tests, Mocks über Google Mock.

#include <gtest/gtest.h>

int add(int a, int b) { return a + b; }

TEST(AdditionTest, PositiveNumbers) { EXPECT_EQ(add(2, 3), 5); EXPECT_EQ(add(0, 0), 0);}

TEST(AdditionTest, NegativeNumbers) { EXPECT_EQ(add(-1, -2), -3);}

int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();}

Besonderheiten:

  • Unterstützung von Death-Tests zur Überprüfung von assert.
  • Mock-Factory (gmock) zur Isolation von Abhängigkeiten.
  • Integration mit CMake (find_package(GTest)).


2. Catch2

Modernes Framework mit ausdrucksstarker Syntax. Erfordert keine separate Testregistrierung — das Makro TEST_CASE reicht aus. Unterstützt BDD-Stil (Given-When-Then).

#include <catch2/catch_test_macros.hpp>

int factorial(int n) { return n <= 1 ? 1 : n * factorial(n - 1);}

TEST_CASE("Factorials are computed", "[math]") { REQUIRE(factorial(0) == 1); REQUIRE(factorial(1) == 1); REQUIRE(factorial(5) == 120);}

TEST_CASE("Negative input", "[math][edge]") { REQUIRE_THROWS_AS(factorial(-1), std::domain_error);}

Besonderheiten:

  • Generierung von Testdaten (GENERATE).
  • Aufteilung von Tests in Sektionen (SECTION).
  • Automatische Auswahl von main() (wenn CATCH_CONFIG_MAIN definiert wird).


3. doctest

Leichtes und schnelles Framework, minimale Kompilierzeit. Ideal für Projekte, bei denen die Build-Geschwindigkeit wichtig ist. Die Syntax ähnelt Catch2.

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN#include <doctest/doctest.h>

int divide(int a, int b) { if (b == 0) throw std::invalid_argument("division by zero"); return a / b;}

TEST_CASE("Division") { CHECK(divide(10, 2) == 5); CHECK_THROWS_AS(divide(5, 0), std::invalid_argument);}

Besonderheiten:

  • Sehr schnelle Kompilierung (Header-Datei ~5 KB).
  • Unterstützung der Makros CHECK, REQUIRE, WARN.
  • Integrierter Reporter in XML/JSON.


4. Boost.Test

Teil der Boost-Bibliotheken. Bietet umfangreiche Möglichkeiten, erfordert aber mehr Boilerplate-Code. Unterstützt automatische und manuelle Testregistrierung.

#define BOOST_TEST_MODULE MyTest#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(MathTests)

BOOST_AUTO_TEST_CASE(TestSum) { BOOST_CHECK_EQUAL(2 + 2, 4); BOOST_CHECK_CLOSE(3.14159, 3.14, 0.1); // Genauigkeit 0.1%}

BOOST_AUTO_TEST_CASE(TestFail) { BOOST_REQUIRE_MESSAGE(false, "This test always fails");}

BOOST_AUTO_TEST_SU

Empfehlungen