Add connectivity error simulation tests for TP4 validation

This commit is contained in:
Rassaby Ludovic
2025-10-14 13:28:43 +04:00
parent 300040b354
commit 6729080571
5 changed files with 295 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
name: 🔍 Tests de Connectivité - Simulation d'Erreurs
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
workflow_dispatch: # Permet de déclencher manuellement
jobs:
connectivity-test:
runs-on: ubuntu-latest
steps:
- name: 📥 Checkout code
uses: actions/checkout@v4
- name: 🐳 Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: 🚀 Start services (DB + Backend)
run: |
echo "Démarrage des services..."
docker compose up -d db backend
sleep 15
- name: 🔍 Test 1: Backend accessible
run: |
echo "Test de connectivité au backend..."
docker compose run --rm test python -c "
import requests
try:
response = requests.get('http://backend:8000/health', timeout=5)
print('✅ Backend accessible - Status:', response.status_code)
except Exception as e:
print('❌ Backend inaccessible:', e)
exit(1)
"
- name: ❌ Test 2: Simulation d'erreur (doit échouer)
run: |
echo "Simulation d'erreur de connectivité..."
docker compose run --rm test python -c "
import requests
print('🔍 Test de connectivité à un port inexistant...')
try:
response = requests.get('http://backend:9999/health', timeout=2)
print('❌ Connexion inattendue - ce test devrait échouer')
exit(1)
except Exception as e:
print('❌ Erreur de connectivité simulée détectée:', e)
print('✅ La détection automatique d erreur fonctionne!')
exit(1) # Force l'échec pour démontrer la détection
"
continue-on-error: true
- name: 🧪 Test 3: Tests pytest avec erreurs intentionnelles
run: |
echo "Lancement des tests de connectivité avec pytest..."
docker compose run --rm test pytest test_connectivity.py -v
continue-on-error: true
- name: 📊 Show test results
if: always()
run: |
echo "📋 Résultats des tests de connectivité:"
docker compose logs backend | tail -20
- name: 🧹 Cleanup
if: always()
run: |
docker compose down -v
docker system prune -f
+103
View File
@@ -0,0 +1,103 @@
import pytest
import requests
import os
import time
# Configuration
BASE_URL = os.getenv("API_BASE_URL", "http://localhost:8000")
class TestConnectivity:
"""Tests de connectivité pour valider la détection automatique d'erreurs"""
def test_backend_health_with_retry(self):
"""Test de santé du backend avec retry - devrait passer"""
max_retries = 3
for attempt in range(max_retries):
try:
response = requests.get(f"{BASE_URL}/health", timeout=5)
assert response.status_code == 200
assert response.json()["status"] == "healthy"
print(f"✅ Backend accessible (tentative {attempt + 1})")
return
except requests.exceptions.RequestException as e:
print(f"⚠️ Tentative {attempt + 1} échouée: {e}")
if attempt < max_retries - 1:
time.sleep(2)
else:
raise
def test_backend_connection_timeout(self):
"""Test de timeout de connexion - simule une erreur de connectivité"""
# Ce test va échouer intentionnellement pour démontrer la détection d'erreur
try:
# Tentative de connexion à un port inexistant pour simuler une erreur
response = requests.get("http://localhost:9999/health", timeout=2)
assert False, "Cette ligne ne devrait jamais être atteinte"
except requests.exceptions.ConnectionError:
# C'est l'erreur attendue - on la laisse passer pour démontrer la détection
print("❌ Erreur de connectivité détectée (comportement attendu)")
raise Exception("Erreur de connectivité simulée pour tester la CI")
def test_database_connectivity(self):
"""Test de connectivité à la base de données via l'API"""
try:
response = requests.get(f"{BASE_URL}/rooms", timeout=5)
assert response.status_code == 200
assert isinstance(response.json(), list)
print("✅ Base de données accessible via l'API")
except requests.exceptions.RequestException as e:
print(f"❌ Erreur de connectivité base de données: {e}")
raise
def test_api_response_time_under_load(self):
"""Test de performance sous charge - simule une surcharge"""
start_time = time.time()
# Faire plusieurs requêtes simultanées pour simuler une charge
responses = []
for i in range(5):
try:
response = requests.get(f"{BASE_URL}/health", timeout=10)
responses.append(response)
except requests.exceptions.RequestException as e:
print(f"❌ Requête {i+1} échouée: {e}")
raise
end_time = time.time()
total_time = end_time - start_time
# Si le temps de réponse est trop long, on considère cela comme une erreur
if total_time > 10:
print(f"❌ Temps de réponse trop long: {total_time:.2f}s")
raise Exception(f"Performance dégradée détectée: {total_time:.2f}s")
print(f"✅ Performance acceptable: {total_time:.2f}s")
assert total_time < 10
# Test pour simuler une erreur de configuration
def test_misconfigured_endpoint():
"""Test d'un endpoint mal configuré - simule une erreur de configuration"""
# Ce test va échouer pour démontrer la détection d'erreur
try:
response = requests.get(f"{BASE_URL}/nonexistent-endpoint", timeout=5)
if response.status_code == 404:
print("❌ Endpoint inexistant détecté (comportement attendu)")
raise Exception("Endpoint mal configuré détecté pour tester la CI")
except requests.exceptions.RequestException as e:
print(f"❌ Erreur de requête: {e}")
raise Exception("Erreur de configuration détectée pour tester la CI")
# Test de simulation d'erreur réseau
def test_network_simulation():
"""Test de simulation d'erreur réseau - démontre la détection automatique"""
# Simulation d'une panne réseau temporaire
print("🔍 Simulation d'une panne réseau...")
# Ce test va échouer intentionnellement
try:
# Tentative de connexion à un serveur inexistant
response = requests.get("http://192.168.999.999:8000/health", timeout=1)
assert False, "Connexion impossible - erreur réseau simulée"
except requests.exceptions.RequestException:
print("❌ Panne réseau simulée détectée (comportement attendu)")
raise Exception("Erreur réseau simulée pour valider la détection automatique")
+37
View File
@@ -0,0 +1,37 @@
import pytest
import requests
import os
# Configuration
BASE_URL = os.getenv("API_BASE_URL", "http://localhost:8000")
def test_backend_accessible():
"""Test que le backend est accessible - devrait passer"""
response = requests.get(f"{BASE_URL}/health", timeout=5)
assert response.status_code == 200
assert response.json()["status"] == "healthy"
print("✅ Backend accessible")
def test_simulated_connectivity_error():
"""Test qui simule une erreur de connectivité - va échouer intentionnellement"""
# Ce test va échouer pour démontrer la détection automatique d'erreur
try:
# Tentative de connexion à un port inexistant
response = requests.get("http://backend:9999/health", timeout=2)
assert False, "Cette connexion ne devrait pas réussir"
except requests.exceptions.ConnectionError as e:
print("❌ Erreur de connectivité simulée détectée")
# On force l'échec pour démontrer la détection automatique
raise Exception("Erreur de connectivité simulée pour valider la détection automatique")
def test_nonexistent_endpoint():
"""Test d'un endpoint inexistant - va échouer intentionnellement"""
try:
response = requests.get(f"{BASE_URL}/nonexistent-endpoint", timeout=5)
if response.status_code == 404:
print("❌ Endpoint inexistant détecté")
# On force l'échec pour démontrer la détection automatique
raise Exception("Endpoint inexistant détecté pour valider la détection automatique")
except requests.exceptions.RequestException as e:
print(f"❌ Erreur de requête: {e}")
raise Exception("Erreur de requête détectée pour valider la détection automatique")
+41
View File
@@ -0,0 +1,41 @@
@echo off
chcp 65001 >nul
echo Test de connectivite - Simulation d'erreurs
echo ==========================================
echo Verification de l'etat des services...
docker compose ps
echo.
echo Demarrage des tests de connectivite...
echo (Ces tests vont simuler des erreurs pour valider la detection automatique)
echo.
echo Test 1: Backend accessible
docker compose run --rm test python -c "
import requests
try:
response = requests.get('http://backend:8000/health', timeout=5)
print('✅ Backend accessible')
except Exception as e:
print('❌ Backend inaccessible:', e)
"
echo.
echo Test 2: Simulation d'erreur de connectivite
docker compose run --rm test python -c "
import requests
try:
response = requests.get('http://backend:8000/nonexistent', timeout=5)
print('❌ Erreur attendue: endpoint inexistant')
except Exception as e:
print('❌ Erreur de connectivite simulee:', e)
"
echo.
echo Test 3: Test avec pytest (avec erreurs intentionnelles)
docker compose run --rm test pytest test_connectivity.py -v
echo.
echo Tests de connectivite termines !
echo Les erreurs ci-dessus sont intentionnelles pour valider la detection automatique.
+41
View File
@@ -0,0 +1,41 @@
#!/bin/bash
echo "🔍 Test de connectivité - Simulation d'erreurs"
echo "=============================================="
echo "📊 Vérification de l'état des services..."
docker compose ps
echo ""
echo "🚀 Démarrage des tests de connectivité..."
echo "(Ces tests vont simuler des erreurs pour valider la détection automatique)"
echo ""
echo "🧪 Test 1: Backend accessible"
docker compose run --rm test python -c "
import requests
try:
response = requests.get('http://backend:8000/health', timeout=5)
print('✅ Backend accessible')
except Exception as e:
print('❌ Backend inaccessible:', e)
"
echo ""
echo "🧪 Test 2: Simulation d'erreur de connectivité"
docker compose run --rm test python -c "
import requests
try:
response = requests.get('http://backend:8000/nonexistent', timeout=5)
print('❌ Erreur attendue: endpoint inexistant')
except Exception as e:
print('❌ Erreur de connectivité simulée:', e)
"
echo ""
echo "🧪 Test 3: Test avec pytest (avec erreurs intentionnelles)"
docker compose run --rm test pytest test_connectivity.py -v
echo ""
echo "✅ Tests de connectivité terminés !"
echo "Les erreurs ci-dessus sont intentionnelles pour valider la détection automatique."