Pruebas de Integración de Swift con Docker: Nivel Avanzado

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

Introducción

\n

Las pruebas de integración son una etapa crítica en el desarrollo que verifica la interacción de los componentes de tu aplicación Swift con dependencias externas: bases de datos, API, sistemas de archivos y servicios de red. Sin embargo, los enfoques tradicionales para las pruebas de integración en macOS/iOS a menudo sufren del "problema del entorno": las pruebas que funcionan en la máquina del desarrollador pueden fallar en el servidor CI debido a diferencias en las versiones de las bibliotecas, configuraciones de red o configuración de la base de datos.

\n

Docker resuelve este problema de forma radical: empaquetas todas las dependencias (PostgreSQL, Redis, servidores Mock) en contenedores aislados que se ejecutan de manera idéntica en cualquier plataforma. En este artículo, exploraremos técnicas avanzadas de pruebas de integración de Swift con Docker: desde la configuración del entorno de pruebas hasta la ejecución paralela y la integración con CI/CD.

\n\n

1. Preparación del entorno de pruebas con Docker Compose

\n

Comencemos creando un entorno aislado para las pruebas. En lugar de ejecutar cada servicio manualmente, usamos docker-compose.yml para describir declarativamente todas las dependencias.

\n\n

Ejemplo de docker-compose.yml para un proyecto Swift

\n
version: '3.8'\nservices:\n  postgres_test:\n    image: postgres:15-alpine\n    environment:\n      POSTGRES_USER: test_user\n      POSTGRES_PASSWORD: test_pass\n      POSTGRES_DB: swift_test_db\n    ports:\n      - "5433:5432"  # Usamos un puerto no estándar para no conflictuar con la BD local\n    tmpfs: /var/lib/postgresql/data  # Datos en memoria — limpieza rápida\n\n  redis_test:\n    image: redis:7-alpine\n    ports:\n      - "6380:6379"\n\n  mock_server:\n    build: ./mock-server  # Servidor Mock personalizado en Vapor\n    ports:\n      - "8081:8080"\n    environment:\n      LOG_LEVEL: debug
\n\n

Código Swift para configuración dinámica de pruebas

\n

Para que las pruebas se conecten a los contenedores Docker y no a los servicios locales, usamos variables de entorno:

\n
import XCTest\n\nfinal class IntegrationTests: XCTestCase {\n    var app: XCTestApplication?\n\n    override func setUp() async throws {\n        // Obtenemos la configuración de las variables de entorno (se establecen en CI o docker-compose)\n        let dbHost = ProcessInfo.processInfo.environment["DB_HOST"] ?? "localhost"\n        let dbPort = Int(ProcessInfo.processInfo.environment["DB_PORT"] ?? "5433") ?? 5433\n        let redisHost = ProcessInfo.processInfo.environment["REDIS_HOST"] ?? "localhost"\n        let mockHost = ProcessInfo.processInfo.environment["MOCK_HOST"] ?? "http://localhost:8081"\n\n        // Configuramos la aplicación de prueba (por ejemplo, Vapor o Kitura)\n        let config = AppConfig(\n            database: DatabaseConfig(host: dbHost, port: dbPort, \n                                     username: "test_user", password: "test_pass",\n                                     database: "swift_test_db"),\n            redis: RedisConfig(host: redisHost, port: 6380),\n            mockServiceURL: mockHost\n        )\n\n        app = try await XCTestApplication.start(config: config)\n    }\n\n    override func tearDown() async throws {\n        try await app?.shutdown()\n    }\n}
\n\n

2. Configuración avanzada: ejecución paralela y aislamiento de pruebas

\n

Uno de los principales problemas de las pruebas de integración es su tiempo de ejecución. Docker permite ejecutar múltiples copias del entorno de pruebas en paralelo, lo que acelera significativamente la ejecución.

\n\n

Estrategia de aislamiento: un contenedor por clase de prueba

\n

Usamos docker-compose --project-name para crear instancias únicas:

\n
#!/bin/bash\n# Ejecución de pruebas con un project-name único para ejecución paralela\nTEST_SUITE=$1\nPROJECT_NAME="swift_test_${TEST_SUITE}_$(date +%s)"\n\ndocker-compose -p $PROJECT_NAME up -d --force-recreate\nsleep 5  # Esperamos la inicialización de los contenedores\n\n# Ejecutamos la clase de prueba específica\nxcodebuild test -scheme MyApp -destina                

Blogs

Book Recommendations