Tests d'intégration Swift avec Docker : de A à Z

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 : pourquoi Docker et Swift sont-ils le duo idéal pour les tests d'intégration ?

\n\n

Le développement moderne sous iOS et macOS nécessite non seulement des tests unitaires, mais aussi des tests d'intégration complets. Lorsque votre application interagit avec une base de données, des API externes ou le système de fichiers, tester chaque composant de manière isolée ne suffit plus. C'est là que Docker entre en jeu.

\n\n

Docker permet de créer des environnements identiques pour les tests, éliminant ainsi le problème « ça marche sur ma machine ». Pour les développeurs Swift, c'est particulièrement pertinent : la conteneurisation permet de tester les applications Swift côté serveur (Vapor, Kitura), ainsi que d'émuler l'infrastructure pour les applications iOS (bases de données, caches, files de messages).

\n\n

Dans cet article, nous allons parcourir le cycle complet de configuration des tests d'intégration Swift avec Docker : de la création de l'environnement de test à l'exécution dans le CI/CD.

\n\n

1. Préparation de l'environnement : Docker et Swift

\n\n

1.1. Installation de Docker et de la chaîne d'outils Swift

\n\n

Avant tout, assurez-vous d'avoir installé :

\n
    \n
  • Docker Desktop (pour macOS) ou Docker Engine (pour Linux)
  • \n
  • Swift Toolchain version 5.7+ (téléchargeable sur swift.org)
  • \n
  • Xcode 14+ (si vous testez des composants iOS)
  • \n
\n\n

1.2. Création du Dockerfile pour Swift

\n\n

Commençons par créer une image Docker de base pour notre application Swift. Créez un fichier Dockerfile à la racine du projet :

\n\n
# Dockerfile\nFROM swift:5.9-focal AS base\n\n# Définit le répertoire de travail\nWORKDIR /app\n\n# Copie les fichiers du manifeste Package.swift\nCOPY Package.swift ./\nCOPY Sources/ ./Sources/\nCOPY Tests/ ./Tests/\n\n# Compilation du projet\nRUN swift build -c debug\n\n# Image finale pour les tests\nFROM base AS test\nCMD ["swift", "test", "--parallel"]\n
\n\n

Cette image compile le projet et exécute les tests. Pour les tests d'intégration, nous aurons besoin de services supplémentaires.

\n\n

2. Tests d'intégration avec Docker Compose

\n\n

Docker Compose permet d'exécuter plusieurs conteneurs simultanément. Pour un scénario typique, nous aurons besoin de :

\n
    \n
  • Un conteneur avec notre application Swift
  • \n
  • Un conteneur avec PostgreSQL (ou autre base de données)
  • \n
  • Un conteneur avec Redis (pour la mise en cache)
  • \n
\n\n

2.1. Exemple de docker-compose.yml

\n\n
# docker-compose.yml\nversion: '3.8'\n\nservices:\n  postgres:\n    image: postgres:15\n    environment:\n      POSTGRES_USER: test_user\n      POSTGRES_PASSWORD: test_pass\n      POSTGRES_DB: test_db\n    ports:\n      - "5432:5432"\n    healthcheck:\n      test: ["CMD-SHELL", "pg_isready -U test_user -d test_db"]\n      interval: 5s\n      timeout: 5s\n      retries: 5\n\n  redis:\n    image: redis:7-alpine\n    ports:\n      - "6379:6379"\n\n  swift-tests:\n    build:\n      context: .\n      dockerfile: Dockerfile.test\n    depends_on:\n      postgres:\n        condition: service_healthy\n      redis:\n        condition: service_started\n    environment:\n      DATABASE_URL: "postgres://test_user:test_pass@postgres:5432/test_db"\n      REDIS_URL: "redis://redis:6379"\n    volumes:\n      - .:/app\n
\n\n

2.2. Dockerfile spécial pour les tests

\n\n

Créons un Dockerfile.test qui attendra que les dépendances soient prêtes :

\n\n
# Dockerfile.test\nFROM swift:5.9-focal\n\nWORKDIR /app\n\n# Installation de netcat pour vérifier les connexions\nRUN apt-get update && apt-get install -y netcat-openbsd && rm -rf /var/lib/apt/lists/*\n\nCOPY Package.swift ./\nRUN swift package resolve\n\nCOPY . .\n\n# Attente de PostgreSQL et Redis\nCOPY wait-for-services.sh /usr/local/bin/\nRUN chmod +x /usr/local/bin/wait-for-services.sh\n\nCMD ["wait-for-services.sh"]\n
\n\n

Script wait-for-services.sh :

\n\n
#!/bin/bash\n# wait-for-services.sh\n\necho "Attente de PostgreSQL..."\nwhile ! nc -z postgres                

Blogs

Book Recommendations