Teste de Integração C++ com Docker: Nível Avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Teste de Integração C++ com Docker: Nível Avançado



O desenvolvimento de aplicações C++ modernas está cada vez mais migrando para o paradigma de microsserviços e containerização. O teste de integração (Integration Testing) torna-se uma etapa crítica, permitindo verificar a interação dos componentes do sistema em condições o mais próximas possível do ambiente de produção. O Docker fornece um ambiente ideal para testes isolados e reproduzíveis. Neste artigo, exploraremos técnicas avançadas de teste de integração C++ usando Docker, incluindo configuração de contêineres, escrita de testes com Google Test e integração em pipelines CI/CD.



1. Por que o Docker é a ferramenta ideal para teste de integração C++?



O teste unitário tradicional verifica funções ou classes individuais, mas não garante o funcionamento correto do sistema como um todo. Os testes de integração verificam as conexões: bancos de dados, protocolos de rede, sistema de arquivos, APIs externas. É aqui que o Docker se torna indispensável:



  • Reprodutibilidade: A imagem Docker contém uma cópia exata do ambiente (compilador, bibliotecas, variáveis de ambiente). Um teste aprovado localmente será aprovado no servidor CI e por outro desenvolvedor.
  • Isolamento: Cada teste é executado em um contêiner limpo. Não há "contaminação" por configurações globais do SO ou dados residuais de testes anteriores.
  • Paralelismo: É possível executar vários contêineres de teste simultaneamente, economizando tempo no CI/CD.
  • Gerenciamento de dependências: O Docker Compose permite levantar toda uma infraestrutura: PostgreSQL, Redis, Kafka — em segundos.


2. Configuração do ambiente de teste com Docker Compose



Vamos considerar um cenário típico: um serviço C++ que lê dados do PostgreSQL e os envia para o RabbitMQ. Precisamos testar a integração desses três componentes.



Criaremos o 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


O ponto-chave é o healthcheck. Não executamos os testes até que o banco de dados e o broker de mensagens estejam prontos para uso. Isso evita "race condition" nos testes.



3. Escrevendo testes de integração em C++ com Google Test



Para demonstração, usaremos o Google Test (gtest) — o padrão de facto para testes C++. Escreveremos um teste que verifica a inserção de dados no PostgreSQL e sua leitura através do RabbitMQ.



Primeiro, criaremos um wrapper simples para trabalhar com 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