Testes de Integração PHP com Docker: dos cenários básicos às soluções industriais
\n\nTestes de integração são uma etapa criticamente importante do desenvolvimento, que verifica a interação entre diferentes componentes do sistema: banco de dados, cache, APIs externas e a própria lógica de negócio. No mundo PHP, onde as aplicações frequentemente trabalham em conjunto com MySQL/PostgreSQL, Redis e servidores web, o Docker se torna uma ferramenta indispensável para criar ambientes de teste isolados e reproduzíveis. Neste artigo, abordaremos técnicas avançadas de testes de integração de aplicações PHP usando Docker, que ajudarão você a elevar a qualidade do código a um novo patamar.
\n\nPor que o Docker é o companheiro ideal para testes de integração PHP?
\n\nAs abordagens tradicionais para testes de integração frequentemente sofrem com problemas de ambiente: bancos de dados podem ser diferentes na máquina local e no servidor CI, portas estão ocupadas e dependências não coincidem. O Docker resolve esses problemas de forma radical:
\n\n- \n
- Isolamento: cada cenário de teste é executado em um contêiner limpo, eliminando efeitos colaterais de testes anteriores. \n
- Reprodutibilidade: imagens com versões fixas de PHP, extensões e serviços garantem que os testes sejam executados da mesma forma em qualquer máquina. \n
- Paralelismo: você pode executar vários conjuntos de testes simultaneamente, cada um em seu próprio contêiner com um banco de dados único. \n
- Velocidade: ferramentas modernas, como Testcontainers ou Docker Compose, permitem criar e destruir ambientes em segundos. \n
Para PHP, isso é especialmente relevante, pois uma aplicação típica interage com vários recursos externos — desde filas (RabbitMQ) até mecanismos de busca (Elasticsearch).
\n\nConfiguração de um ambiente de teste em múltiplas camadas com Docker Compose
\n\nO primeiro passo para testes avançados é criar um docker-compose.yml flexível, que inclua não apenas PHP, mas todos os serviços necessários. Considere um exemplo para uma aplicação em Laravel/Symfony que usa MySQL, Redis e uma API REST externa:
version: '3.8'\n\nservices:\n php-test:\n image: php:8.2-cli\n volumes:\n - ./:/app\n working_dir: /app\n environment:\n - DB_HOST=mysql-test\n - DB_DATABASE=test_db\n - REDIS_HOST=redis-test\n - API_BASE_URL=http://mock-api:8080\n depends_on:\n mysql-test:\n condition: service_healthy\n redis-test:\n condition: service_started\n mock-api:\n condition: service_started\n\n mysql-test:\n image: mysql:8.0\n environment:\n MYSQL_ROOT_PASSWORD: root\n MYSQL_DATABASE: test_db\n healthcheck:\n test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]\n interval: 5s\n timeout: 3s\n retries: 5\n\n redis-test:\n image: redis:7-alpine\n\n mock-api:\n image: wiremock/wiremock:latest\n volumes:\n - ./tests/mock-api:/home/wiremock\n\n\nO ponto-chave é o uso do WireMock para simular APIs externas. Isso permite testar a integração com serviços que podem estar indisponíveis ou instáveis no ambiente de teste. O WireMock é executado em um contêiner separado e retorna respostas predefinidas com base em arquivos de configuração JSON.
\n\nPara executar os testes dentro deste ambiente, use o script:
\n\n#!/bin/bash\ndocker-compose -f docker-compose.test.yml up -d\ndocker-compose -f docker-compose.test.yml exec php-test vendor/bin/phpunit --testsuite=Integration\ndocker-compose -f docker-compose.test.yml down\n\nTécnicas avançadas: criação dinâmica de contêineres e execução paralela
\n\nQuando o projeto cresce, um docker-compose.yml estático pode se tornar um gargalo. É aí que entra a biblioteca Testcontainers (disponível para PHP através do pacote testc