Testes de Integração PHP com Docker: Guia Completo

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

Testes de Integração PHP com Docker: do Início ao Fim

\n\n

O 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\n

Por que o Docker é a ferramenta ideal para testes de integração?

\n\n

Problemas 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
\n\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
\n\n

Passo 1: Estrutura do Projeto e Docker Compose

\n\n

Vamos começar com uma aplicação PHP típica em Symfony. Criaremos o arquivo docker-compose.test.yml para o ambiente de teste:

\n\n
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\n

Arquivo Dockerfile.test:

\n\n
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\n

Observe 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.

\n\n

Passo 2: Configuração do PHPUnit para Testes de Integração

\n\n

Criaremos uma configuração separada phpunit.integration.xml.dist:

\n\n
<?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\n

Arquivo tests/bootstrap.php para inicialização do ambiente de teste:

\n\n
<?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\                

Blogs

Book Recommendations