Teste de Integração C++ com Docker: Nível Avançado
\n\nO teste de integração é uma etapa criticamente importante no desenvolvimento em C++, especialmente em arquiteturas modernas de microsserviços. Abordagens tradicionais, onde os testes são executados no ambiente do desenvolvedor, frequentemente levam a erros devido a diferenças no ambiente, versões de bibliotecas e configurações. O Docker oferece uma solução elegante: isolamento completo, reprodutibilidade e automação. Neste artigo, exploraremos técnicas avançadas de teste de integração de aplicações C++ usando Docker, incluindo gerenciamento de dependências, execução paralela de testes e integração com CI/CD.
\n\n1. Arquitetura do Ambiente de Teste com Docker
\n\nO primeiro passo para um teste de integração confiável é a arquitetura correta do ambiente Docker. Em vez de um único contêiner monolítico, criamos uma composição de serviços, cada um responsável por sua tarefa: o próprio serviço em teste, banco de dados, cache, filas de mensagens, etc.
\n\nConsidere o exemplo de um microsserviço C++ que usa PostgreSQL e Redis. Arquivo docker-compose.test.yml:
version: '3.8'\n\nservices:\n postgres_test:\n image: postgres:15-alpine\n environment:\n POSTGRES_USER: test_user\n POSTGRES_PASSWORD: test_pass\n POSTGRES_DB: test_db\n healthcheck:\n test: ["CMD-SHELL", "pg_isready -U test_user -d test_db"]\n interval: 2s\n timeout: 5s\n retries: 10\n\n redis_test:\n image: redis:7-alpine\n healthcheck:\n test: ["CMD", "redis-cli", "ping"]\n interval: 2s\n timeout: 5s\n retries: 10\n\n cpp_service_test:\n build:\n context: .\n dockerfile: Dockerfile.test\n depends_on:\n postgres_test:\n condition: service_healthy\n redis_test:\n condition: service_healthy\n environment:\n - DB_HOST=postgres_test\n - DB_PORT=5432\n - REDIS_HOST=redis_test\n - REDIS_PORT=6379\n - TEST_MODE=1\n volumes:\n - ./test_results:/app/test_results\n command: ["./run_integration_tests"]\n\nPontos-chave:
\n- \n
- Healthchecks garantem que os testes sejam executados somente após as dependências estarem prontas. \n
- Rede separada (criada automaticamente) isola o ambiente de teste da produção. \n
- Volume para resultados permite recuperar relatórios de teste após a conclusão. \n
2. Escrevendo Testes de Integração em C++ Considerando o Docker
\n\nSeus testes devem estar prontos para funcionar em um ambiente containerizado. Isso significa que a configuração de conexão com serviços externos deve ser definida através de variáveis de ambiente, e não codificada diretamente.
\n\nExemplo de teste usando Google Test e libpqxx para PostgreSQL:
\n\n#include <gtest/gtest.h>\n#include <pqxx/pqxx>\n#include <cstdlib>\n\nclass DatabaseIntegrationTest : public ::testing::Test {\nprotected:\n std::unique_ptr<pqxx::connection> conn;\n\n void SetUp() override {\n const char* db_host = std::getenv("DB_HOST");\n const char* db_port = std::getenv("DB_PORT");\n const char* db_user = std::getenv("POSTGRES_USER");\n const char* db_pass = std::getenv("POSTGRES_PASSWORD");\n const char* db_name = std::getenv("POSTGRES_DB");\n\n ASSERT_NE(db_host, nullptr) << "DB_HOST not set";\n ASSERT_NE(db_port, nullptr) << "DB_PORT not set";\n\n std::string conn_str = "host=" + std::string(db_host) +\n " port=" + std::string(db_port) +\n " user=" + std::string(db_user ? db_user : "test_user") +\n " password=" + std::string(db_pass ? db_pass : "test_pass") +\n " dbname=" + std::string(db_name ? db_name : "test_db");\n\n try {\n conn = std::make_unique<pqxx::connect