Pruebas de integración PHP con Docker: técnicas avanzadas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Pruebas de integración PHP con Docker: nivel avanzado

Las pruebas de integración son una etapa crítica del desarrollo, especialmente para aplicaciones PHP complejas que interactúan con bases de datos, colas, API externas y otros servicios. Docker permite levantar un entorno aislado, lo más cercano posible a producción, y ejecutar pruebas en condiciones reproducibles. En este artículo analizaremos técnicas avanzadas: organización de contenedores de prueba, simulación de dependencias externas, ejecución paralela e integración con CI/CD.



1. Arquitectura del entorno de pruebas con docker-compose

Para las pruebas de integración utilizamos un docker-compose.test.yml separado, que levanta solo los servicios necesarios: PHP-FPM con el código de prueba, base de datos (por ejemplo, PostgreSQL), Redis y, opcionalmente, un servidor mock para API externas.

version: '3.8'services:  php-test:    build:      context: .      dockerfile: Dockerfile.test    volumes:      - .:/var/www/html    environment:      DATABASE_URL: "pgsql://test:test@db-test:5432/testdb"      REDIS_URL: "redis://redis-test:6379"      EXTERNAL_API_URL: "http://mock-server:1080"    depends_on:      - db-test      - redis-test      - mock-server

db-test: image: postgres:15-alpine environment: POSTGRES_DB: testdb POSTGRES_USER: test POSTGRES_PASSWORD: test ports: - "5433:5432" # Evitamos conflicto con la BD principal

redis-test: image: redis:7-alpine ports: - "6380:6379"

mock-server: image: mockserver/mockserver:latest environment: MOCKSERVER_PROPERTY_FILE: /config/mockserver.properties volumes: - ./tests/mockserver:/config ports: - "1080:1080"

Tenga en cuenta: usamos puertos separados para los servicios de prueba, para que no interfieran con el desarrollo local.



2. Preparación de PHPUnit e inicialización de la BD de prueba

Configuración de phpunit.xml para pruebas de integración:

<phpunit bootstrap="tests/bootstrap.php">    <testsuites>        <testsuite name="Integration">            <directory>tests/Integration</directory>        </testsuite>    </testsuites>    <php>        <env name="APP_ENV" value="test"/>        <env name="KERNEL_CLASS" value="App\\Kernel"/>    </php></phpunit>

El archivo tests/bootstrap.php se encarga de inicializar el esquema de la BD y cargar datos de prueba:

require __DIR__ . '/../vendor/autoload.php';

// Creamos el esquema de la BD$pdo = new PDO('pgsql:host=db-test;port=5432;dbname=testdb', 'test', 'test');$pdo->exec(file_get_contents(__DIR__ . '/../migrations/schema.sql'));

// Cargamos las fixturesrequire __DIR__ . '/Fixtures/LoadFixtures.php';

Este enfoque garantiza que cada ejecución de pruebas comience con un estado limpio y predecible.



3. Pruebas con API externas: MockServer y WireMock

Para simular servicios HTTP externos utilizamos MockServer (o WireMock). Creamos una configuración de expectativas en un archivo JSON:

// tests/mockserver/expectations/payment.json{  "httpRequest": {    "method": "POST",    "path": "/api/v1/charge"  },  "httpResponse": {    "statusCode": 200,    "body": "{\\"status\\": \\"success\\", \\"transaction_id\\": \\"txn_123\\"}",    "headers": {      "Content-Type": "application/json"    }  }}

En el código PHP de la prueba enviamos una solicitud a la URL real, que a través de una variable de entorno apunta al mock-server:

class PaymentIntegrationTest extends TestCase{    private PaymentService $paymentService;

protected function setUp(): void { $this->paymentService = new PaymentService( new HttpClient(['base_uri' => $_ENV['EXTERNAL_API_URL']])

Blogs

Book Recommendations