Tests d'intégration Swift avec Docker : niveau avancé

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction

\n

Les tests d'intégration sont une étape critique du développement, qui vérifie l'interaction des composants de votre application Swift avec les dépendances externes : bases de données, API, systèmes de fichiers et services réseau. Cependant, les approches traditionnelles des tests d'intégration sur macOS/iOS souffrent souvent du "problème d'environnement" — les tests qui fonctionnent sur la machine du développeur peuvent échouer sur le serveur CI en raison de différences dans les versions des bibliothèques, les paramètres réseau ou la configuration de la base de données.

\n

Docker résout ce problème de manière radicale : vous empaquetez toutes les dépendances (PostgreSQL, Redis, serveurs Mock) dans des conteneurs isolés qui s'exécutent à l'identique sur n'importe quelle plateforme. Dans cet article, nous aborderons les techniques avancées de tests d'intégration Swift avec Docker : de la configuration de l'environnement de test à l'exécution parallèle et à l'intégration avec CI/CD.

\n\n

1. Préparation de l'environnement de test avec Docker Compose

\n

Commençons par créer un environnement isolé pour les tests. Au lieu de lancer chaque service manuellement, utilisons docker-compose.yml pour décrire de manière déclarative toutes les dépendances.

\n\n

Exemple de docker-compose.yml pour un projet 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"  # Utilisation d'un port non standard pour éviter les conflits avec la base de données locale\n    tmpfs: /var/lib/postgresql/data  # Données en mémoire — nettoyage rapide\n\n  redis_test:\n    image: redis:7-alpine\n    ports:\n      - "6380:6379"\n\n  mock_server:\n    build: ./mock-server  # Serveur Mock personnalisé sur Vapor\n    ports:\n      - "8081:8080"\n    environment:\n      LOG_LEVEL: debug
\n\n

Code Swift pour la configuration dynamique des tests

\n

Pour que les tests se connectent aux conteneurs Docker plutôt qu'aux services locaux, utilisons des variables d'environnement :

\n
import XCTest\n\nfinal class IntegrationTests: XCTestCase {\n    var app: XCTestApplication?\n\n    override func setUp() async throws {\n        // Obtention de la configuration à partir des variables d'environnement (définies dans CI ou 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        // Configuration de l'application de test (par exemple, Vapor ou 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. Configuration avancée : exécution parallèle et isolation des tests

\n

L'un des principaux problèmes des tests d'intégration est leur temps d'exécution. Docker permet de lancer plusieurs copies de l'environnement de test en parallèle, ce qui accélère considérablement l'exécution.

\n\n

Stratégie d'isolation : un conteneur par classe de test

\n

Utilisons docker-compose --project-name pour créer des instances uniques :

\n
#!/bin/bash\n# Lancement des tests avec un project-name unique pour l'exécution parallèle\nTEST_SUITE=$1\nPROJECT_NAME="swift_test_${TEST_SUITE}_$(date +%s)"\n\ndocker-compose -p $PROJECT_NAME up -d --force-recreate\nsleep 5  # Attente de l'initialisation des conteneurs\n\n# Lancement d'une classe de test spécifique\nxcodebuild test -scheme MyApp -destina                

Blogs

Book Recommendations