#!/bin/bash # Script pour exécuter les tests par groupes et calculer la couverture totale set -e BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$BASE_DIR" # Nombre de packages par groupe (réduit pour éviter les problèmes de RAM) GROUP_SIZE=3 COVERAGE_DIR="coverage_groups" TOTAL_COVERAGE="coverage_total.out" # Créer le dossier pour les fichiers de couverture par groupe mkdir -p "$COVERAGE_DIR" rm -f "$COVERAGE_DIR"/*.out echo "📦 Récupération de la liste des packages..." PACKAGES=$(go list ./internal/...) TOTAL=$(echo "$PACKAGES" | wc -l) echo " Total: $TOTAL packages" # Diviser en groupes GROUP_NUM=1 CURRENT_GROUP=0 CURRENT_PACKAGES="" echo "" echo "🧪 Exécution des tests par groupes de $GROUP_SIZE packages..." for pkg in $PACKAGES; do CURRENT_PACKAGES="$CURRENT_PACKAGES $pkg" CURRENT_GROUP=$((CURRENT_GROUP + 1)) if [ $CURRENT_GROUP -ge $GROUP_SIZE ]; then echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📦 Groupe $GROUP_NUM ($CURRENT_GROUP packages)" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" COVERAGE_FILE="$COVERAGE_DIR/group_${GROUP_NUM}.out" # Exécuter les tests pour ce groupe (avec timeout et limite mémoire) if timeout 60 go test -coverprofile="$COVERAGE_FILE" -short $CURRENT_PACKAGES 2>&1; then echo "✅ Groupe $GROUP_NUM terminé" if [ -f "$COVERAGE_FILE" ]; then LINES=$(wc -l < "$COVERAGE_FILE") echo " Couverture: $LINES lignes" fi else echo "⚠️ Groupe $GROUP_NUM a des échecs (continuons...)" fi GROUP_NUM=$((GROUP_NUM + 1)) CURRENT_GROUP=0 CURRENT_PACKAGES="" # Pause plus longue pour libérer la mémoire sleep 2 # Nettoyer la mémoire Go si possible go clean -cache -testcache 2>/dev/null || true fi done # Traiter le dernier groupe s'il reste des packages if [ $CURRENT_GROUP -gt 0 ]; then echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📦 Groupe $GROUP_NUM ($CURRENT_GROUP packages)" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" COVERAGE_FILE="$COVERAGE_DIR/group_${GROUP_NUM}.out" if timeout 60 go test -coverprofile="$COVERAGE_FILE" -short $CURRENT_PACKAGES 2>&1; then echo "✅ Groupe $GROUP_NUM terminé" if [ -f "$COVERAGE_FILE" ]; then LINES=$(wc -l < "$COVERAGE_FILE") echo " Couverture: $LINES lignes" fi else echo "⚠️ Groupe $GROUP_NUM a des échecs" fi fi echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📊 Combinaison des fichiers de couverture..." echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" # Combiner tous les fichiers de couverture echo "mode: set" > "$TOTAL_COVERAGE" for file in "$COVERAGE_DIR"/group_*.out; do if [ -f "$file" ]; then # Ignorer la première ligne (mode: set) de chaque fichier tail -n +2 "$file" >> "$TOTAL_COVERAGE" 2>/dev/null || true fi done echo "✅ Couverture totale générée: $TOTAL_COVERAGE" # Calculer le pourcentage de couverture echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📈 Statistiques de couverture" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" if [ -f "$TOTAL_COVERAGE" ]; then go tool cover -func="$TOTAL_COVERAGE" | tail -1 echo "" echo "Pour voir le rapport HTML:" echo " go tool cover -html=$TOTAL_COVERAGE" else echo "❌ Aucun fichier de couverture généré" fi