Pruebas de integración de C++ con Docker: nivel avanzado

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Pruebas de integración de C++ con Docker: nivel avanzado



El desarrollo de aplicaciones C++ modernas está migrando cada vez más hacia el paradigma de microservicios y contenerización. Las pruebas de integración (Integration Testing) se convierten en una etapa crítica, permitiendo verificar la interacción de los componentes del sistema en condiciones lo más cercanas posible a las de producción. Docker proporciona un entorno ideal para pruebas aisladas y reproducibles. En este artículo, exploraremos técnicas avanzadas de pruebas de integración de C++ utilizando Docker, incluyendo la configuración de contenedores, la escritura de pruebas con Google Test y la integración en pipelines de CI/CD.



1. ¿Por qué Docker es la herramienta ideal para las pruebas de integración de C++?



Las pruebas unitarias tradicionales verifican funciones o clases individuales, pero no garantizan el correcto funcionamiento del sistema en su conjunto. Las pruebas de integración verifican las conexiones: bases de datos, protocolos de red, sistema de archivos, API externas. Aquí Docker se vuelve indispensable:



  • Reproducibilidad: La imagen de Docker contiene una copia exacta del entorno (compilador, bibliotecas, variables de entorno). Una prueba que pasa localmente, pasará en el servidor de CI y en la máquina de otro desarrollador.
  • Aislamiento: Cada prueba se ejecuta en un contenedor limpio. No hay "contaminación" por configuraciones globales del sistema operativo ni datos residuales de pruebas anteriores.
  • Paralelismo: Se pueden ejecutar múltiples contenedores de prueba simultáneamente, ahorrando tiempo en CI/CD.
  • Gestión de dependencias: Docker Compose permite levantar una infraestructura completa: PostgreSQL, Redis, Kafka — en cuestión de segundos.


2. Configuración del entorno de prueba con Docker Compose



Consideremos un escenario típico: un servicio C++ que lee datos de PostgreSQL y los envía a RabbitMQ. Necesitamos probar la integración de estos tres componentes.



Crearemos un 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


El punto clave es el healthcheck. No ejecutamos las pruebas hasta que la base de datos y el broker de mensajes estén listos para funcionar. Esto evita condiciones de carrera en las pruebas.



3. Escritura de pruebas de integración en C++ con Google Test



Para la demostración, usaremos Google Test (gtest) — el estándar de facto para pruebas en C++. Escribiremos una prueba que verifica la inserción de datos en PostgreSQL y su lectura a través de RabbitMQ.



Primero, crearemos un wrapper simple para trabajar con RabbitMQ (simplificado):



// 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

Book Recommendations