Tests d'intégration C++ avec Docker : de A à Z
\n\nLes tests d'intégration sont une étape clé du développement de tout projet C++ sérieux. Ils permettent de vérifier comment les différents modules du système fonctionnent ensemble, interagissent avec les bases de données, les services réseau et les systèmes de fichiers. Docker devient dans ce contexte un outil indispensable : il fournit un environnement isolé et reproductible, éliminant les problèmes du type "ça marche sur ma machine". Dans cet article, nous allons parcourir le cycle complet de configuration des tests d'intégration C++ avec Docker, des concepts de base aux pratiques avancées.
\n\n1. Pourquoi Docker pour les tests d'intégration C++ ?
\n\nLes tests d'intégration C++ traditionnels souffrent souvent de problèmes d'environnement : différentes versions de bibliothèques, compilateurs incompatibles, paramètres OS spécifiques. Docker résout ces problèmes une fois pour toutes. Les principaux avantages :
\n\n- \n
- Reproductibilité : chaque test s'exécute dans un environnement identique, indépendamment du système hôte. \n
- Isolation : les conteneurs n'affectent ni les autres conteneurs ni le système hôte. \n
- Scalabilité : il est facile d'exécuter des centaines de tests en parallèle. \n
- Intégration CI/CD : les conteneurs s'intègrent parfaitement dans les pipelines Jenkins, GitLab CI, GitHub Actions. \n
Prenons un exemple simple : votre application C++ utilise PostgreSQL. Sans Docker, vous devriez installer et configurer PostgreSQL sur chaque serveur de test. Avec Docker, c'est une seule ligne de configuration.
\n\n2. Configuration de l'environnement Docker pour un projet C++
\n\nCommençons par créer un Dockerfile pour notre application C++. Supposons que le projet utilise CMake et Google Test pour les tests unitaires, mais que nous ayons besoin de tests d'intégration avec une vraie base de données.
\n\nDockerfile de base pour la compilation et les tests :
\n\n# Dockerfile\nFROM ubuntu:22.04 AS builder\n\nRUN apt-get update && apt-get install -y \\\n build-essential \\\n cmake \\\n git \\\n libpq-dev \\\n libgtest-dev \\\n && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\nCOPY . .\n\nRUN cmake -B build -DCMAKE_BUILD_TYPE=Release \\\n && cmake --build build --parallel\n\n# Étape pour les tests\nFROM builder AS tester\nCMD ["./build/integration_tests"]\n\nDocker Compose pour lancer l'infrastructure :
\n\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n db:\n image: postgres:15\n environment:\n POSTGRES_DB: testdb\n POSTGRES_USER: testuser\n POSTGRES_PASSWORD: testpass\n healthcheck:\n test: ["CMD-SHELL", "pg_isready -U testuser -d testdb"]\n interval: 5s\n timeout: 5s\n retries: 5\n\n app:\n build: .\n depends_on:\n db:\n condition: service_healthy\n environment:\n DB_HOST: db\n DB_PORT: 5432\n DB_NAME: testdb\n DB_USER: testuser\n DB_PASSWORD: testpass\n command: ["./build/integration_tests"]\n\n3. Rédaction de tests d'intégration en C++
\n\nPrenons un exemple de test d'intégration qui vérifie l'interaction avec PostgreSQL via la bibliothèque libpqxx. Supposons que nous ayons un module pour la gestion des utilisateurs.
\n\nExemple de test d'intégration :
\n\n// integration_tests.cpp\n#include <gtest/gtest.h>\n#include <pqxx/pqxx>\n#include <string>\n#include <vector>\n\nclass DatabaseIntegrationTest : public ::testing::Test {\nprotected:\n void SetUp() override {\n conn = new pqxx::connection(\n "host=" + std::getenv("DB_HOST") +\n " port=" + std::getenv("DB_PORT") +\n " dbname=" + std::getenv("DB_NAME") +\n " user=" + std::getenv("DB_USER") +\n " password=" + std::getenv("DB_PASSWORD")\n );\n \n // Création de la table de test\n pqxx::work txn(*conn);\n txn.exec("CREATE TABLE IF NOT EXISTS use