Testes de Integração PHP com Docker: do Início ao Fim
\n\nO desenvolvimento PHP moderno é impensável sem testes de qualidade. Enquanto os testes unitários verificam partes isoladas do código, os testes de integração garantem que todos os componentes do sistema funcionem juntos: banco de dados, Redis, APIs externas e sistema de arquivos. O Docker torna esse processo reproduzível, rápido e independente do ambiente do desenvolvedor. Neste artigo, vamos detalhar como configurar testes de integração para uma aplicação PHP usando Docker do zero.
\n\nPor que o Docker é a ferramenta ideal para testes de integração?
\n\nProblemas tradicionais dos testes de integração:
\n- \n
- Dependência do ambiente — cada desenvolvedor tem sua versão do MySQL, PHP, Redis. \n
- Poluição de dados — os testes deixam resíduos no banco de dados real. \n
- Dificuldade de execução paralela — os testes entram em conflito entre si. \n
O Docker resolve esses problemas:
\n- \n
- Cada teste é executado em um contêiner limpo com versões conhecidas das dependências. \n
- Os contêineres são isolados e removidos após a execução. \n
- O Docker Compose permite levantar toda a infraestrutura com um único comando. \n
Passo 1: Estrutura do Projeto e Docker Compose
\n\nVamos começar com uma aplicação PHP típica em Symfony. Criaremos o arquivo docker-compose.test.yml para o ambiente de teste:
version: '3.8'\nservices:\n php:\n build:\n context: .\n dockerfile: Dockerfile.test\n environment:\n DATABASE_URL: "mysql://test:test@mysql:3306/test_db?serverVersion=8.0"\n REDIS_URL: "redis://redis:6379"\n depends_on:\n - mysql\n - redis\n\n mysql:\n image: mysql:8.0\n environment:\n MYSQL_ROOT_PASSWORD: root\n MYSQL_DATABASE: test_db\n MYSQL_USER: test\n MYSQL_PASSWORD: test\n tmpfs: /var/lib/mysql # Dados na memória — mais rápido\n\n redis:\n image: redis:7-alpine\n tmpfs: /data\n\nArquivo Dockerfile.test:
FROM php:8.2-cli\n\nRUN docker-php-ext-install pdo_mysql\nRUN pecl install redis && docker-php-ext-enable redis\n\nCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer\n\nWORKDIR /app\nCOPY . .\n\nRUN composer install --no-interaction --prefer-dist\n\nCMD ["vendor/bin/phpunit", "--configuration", "phpunit.xml.dist"]\n\nObserve o tmpfs — é uma montagem do sistema de arquivos temporário na memória. O banco de dados e o Redis funcionarão muito mais rápido do que no disco, o que é crítico para testes rápidos.
Passo 2: Configuração do PHPUnit para Testes de Integração
\n\nCriaremos uma configuração separada phpunit.integration.xml.dist:
<?xml version="1.0" encoding="UTF-8"?>\n<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"\n bootstrap="tests/bootstrap.php"\n colors="true">\n <testsuites>\n <testsuite name="Integration">\n <directory>tests/Integration</directory>\n </testsuite>\n </testsuites>\n <php>\n <env name="APP_ENV" value="test"/>\n <env name="KERNEL_CLASS" value="App\\Kernel"/>\n </php>\n</phpunit>\n\nArquivo tests/bootstrap.php para inicialização do ambiente de teste:
<?php\n\nrequire dirname(__DIR__) . '/vendor/autoload.php';\n\n// Aguarda até que MySQL e Redis estejam prontos\n$maxAttempts = 30;\n$connected = false;\n\nfor ($i = 0; $i < $maxAttempts; $i++) {\n try {\n $pdo = new PDO(\n $_ENV['DATABASE_URL'],\n null, null,\n [PDO::ATTR_TIMEOUT => 1]\n );\n $connected = true;\n break;\n } catch (PDOException $e) {\n sleep(1);\n }\n}\n\