Integrationstests von C++ mit Docker: Fortgeschrittenes Niveau

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

Integrationstests von C++ mit Docker: Fortgeschrittenes Niveau



Die Entwicklung moderner C++-Anwendungen verlagert sich zunehmend in die Paradigmen von Microservices und Containerisierung. Integrationstests werden zu einer kritischen Phase, die es ermöglicht, das Zusammenspiel von Systemkomponenten unter Bedingungen zu überprüfen, die der Produktion möglichst nahe kommen. Docker bietet eine ideale Umgebung für isolierte und reproduzierbare Tests. In diesem Artikel betrachten wir fortgeschrittene Techniken für Integrationstests von C++ mit Docker, einschließlich der Konfiguration von Containern, dem Schreiben von Tests mit Google Test und der Integration in CI/CD-Pipelines.



1. Warum Docker das ideale Werkzeug für Integrationstests von C++ ist



Traditionelle Unit-Tests überprüfen einzelne Funktionen oder Klassen, garantieren jedoch nicht die korrekte Funktion des Gesamtsystems. Integrationstests prüfen Verbindungen: Datenbanken, Netzwerkprotokolle, Dateisysteme, externe APIs. Hier wird Docker unverzichtbar:



  • Reproduzierbarkeit: Ein Docker-Image enthält eine exakte Kopie der Umgebung (Compiler, Bibliotheken, Umgebungsvariablen). Ein lokal bestandener Test wird auf dem CI-Server und bei einem anderen Entwickler bestanden.
  • Isolation: Jeder Test wird in einem sauberen Container gestartet. Es gibt keine "Verschmutzung" durch globale Betriebssystemeinstellungen oder Restdaten vorheriger Tests.
  • Parallelität: Es können viele Testcontainer gleichzeitig gestartet werden, was Zeit in CI/CD spart.
  • Abhängigkeitsverwaltung: Docker Compose ermöglicht es, eine gesamte Infrastruktur hochzufahren: PostgreSQL, Redis, Kafka – in Sekundenschnelle.


2. Einrichtung der Testumgebung mit Docker Compose



Betrachten wir ein typisches Szenario: Ein C++-Dienst, der Daten aus PostgreSQL liest und an RabbitMQ sendet. Wir müssen die Integration dieser drei Komponenten testen.



Erstellen wir docker-compose.test.yml:



version: '3.8'services:  postgres_test:    image: postgres:15-alpine    environment:      POSTGRES_DB: testdb      POSTGRES_USER: testuser      POSTGRES_PASSWORD: testpass    ports:      - "5432:5432"    healthcheck:      test: ["CMD-SHELL", "pg_isready -U testuser -d testdb"]      interval: 5s      timeout: 5s      retries: 5

rabbitmq_test: image: rabbitmq:3-management-alpine environment: RABBITMQ_DEFAULT_USER: testuser RABBITMQ_DEFAULT_PASS: testpass ports: - "5672:5672" healthcheck: test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"] interval: 5s timeout: 5s retries: 5

test_runner: build: context: . dockerfile: Dockerfile.test depends_on: postgres_test: condition: service_healthy rabbitmq_test: condition: service_healthy environment: DB_HOST: postgres_test DB_PORT: 5432 DB_NAME: testdb DB_USER: testuser DB_PASS: testpass RMQ_HOST: rabbitmq_test RMQ_PORT: 5672


Der entscheidende Punkt ist der Healthcheck. Wir starten die Tests erst, wenn die Datenbank und der Message Broker betriebsbereit sind. Dies verhindert "Race Conditions" in den Tests.



3. Schreiben von Integrationstests in C++ mit Google Test



Zur Demonstration verwenden wir Google Test (gtest) – den De-facto-Standard für C++-Tests. Wir schreiben einen Test, der das Einfügen von Daten in PostgreSQL und deren Auslesen über RabbitMQ überprüft.



Zunächst erstellen wir einen einfachen Wrapper für die Arbeit mit RabbitMQ (vereinfacht):



// rabbitmq_client.h#pragma once#include <string>#include <amqpcpp.h>

class RabbitMQClient {public: RabbitMQClient(const std::string& host, int port, const std::string& user, const std::string& pass); bool sendMessage(const std::string& queue, const

Blogs

Buchempfehlungen