Add connectivity error simulation tests for TP4 validation
This commit is contained in:
@@ -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
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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.
|
||||
@@ -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."
|
||||
Reference in New Issue
Block a user