veza/scripts/test-performance.sh
2025-12-03 22:56:50 +01:00

102 lines
3.2 KiB
Bash

#!/bin/bash
# Détecte les tests lents (T0050)
set -e
THRESHOLD="${TEST_PERFORMANCE_THRESHOLD:-5s}"
PACKAGE="${1:-./...}"
echo "🔍 Analyzing test performance for: $PACKAGE"
echo "⏱️ Threshold: $THRESHOLD"
echo ""
# Fonction pour convertir durée en secondes (gère format go test: 1.234s, 0.123s, etc.)
duration_to_seconds() {
local duration="$1"
# Enlever le 's' à la fin et convertir en float
echo "$duration" | sed 's/s$//'
}
# Fonction pour comparer deux durées
compare_durations() {
local duration1=$(duration_to_seconds "$1")
local threshold=$(duration_to_seconds "$2")
# Utiliser awk pour comparer les floats
awk -v d1="$duration1" -v th="$threshold" 'BEGIN { if (d1 > th) exit 0; else exit 1 }'
}
# Compteurs
slow_tests=0
total_tests=0
total_duration=0
# Exécuter les tests et analyser les résultats
go test "$PACKAGE" -json 2>/dev/null | while IFS= read -r line; do
# Parser la sortie JSON avec grep et sed (fallback si jq n'est pas disponible)
if command -v jq >/dev/null 2>&1; then
action=$(echo "$line" | jq -r '.Action // empty' 2>/dev/null || true)
test_name=$(echo "$line" | jq -r '.Test // empty' 2>/dev/null || true)
elapsed=$(echo "$line" | jq -r '.Elapsed // empty' 2>/dev/null || true)
package_name=$(echo "$line" | jq -r '.Package // empty' 2>/dev/null || true)
else
# Fallback: parser manuellement avec grep/sed
if echo "$line" | grep -q '"Action"'; then
action=$(echo "$line" | grep -o '"Action":"[^"]*"' | sed 's/"Action":"\([^"]*\)"/\1/')
test_name=$(echo "$line" | grep -o '"Test":"[^"]*"' | sed 's/"Test":"\([^"]*\)"/\1/' || echo "")
elapsed=$(echo "$line" | grep -o '"Elapsed":[0-9.]*' | sed 's/"Elapsed":\([0-9.]*\)/\1/' || echo "")
package_name=$(echo "$line" | grep -o '"Package":"[^"]*"' | sed 's/"Package":"\([^"]*\)"/\1/' || echo "")
else
continue
fi
fi
if [ -z "$action" ]; then
continue
fi
# Compter les tests passés/échoués
if [ "$action" = "pass" ] || [ "$action" = "fail" ]; then
if [ -n "$test_name" ] && [ -n "$elapsed" ]; then
total_tests=$((total_tests + 1))
# Ajouter 's' si manquant
if ! echo "$elapsed" | grep -q 's$'; then
elapsed="${elapsed}s"
fi
# Vérifier si le test est lent
if compare_durations "$elapsed" "$THRESHOLD"; then
echo "⚠️ SLOW TEST: ${package_name}/${test_name} took ${elapsed}"
slow_tests=$((slow_tests + 1))
fi
# Accumuler la durée totale (en secondes)
duration_sec=$(duration_to_seconds "$elapsed")
total_duration=$(awk -v d1="$total_duration" -v d2="$duration_sec" 'BEGIN { printf "%.3f", d1 + d2 }')
fi
fi
done
# Afficher le résumé
echo ""
echo "📊 Summary:"
echo " Total tests: $total_tests"
echo " Slow tests (>$THRESHOLD): $slow_tests"
if [ "$total_tests" -gt 0 ]; then
avg_duration=$(awk -v total="$total_duration" -v count="$total_tests" 'BEGIN { printf "%.3f", total / count }')
echo " Average duration: ${avg_duration}s"
echo " Total duration: ${total_duration}s"
fi
# Retourner code d'erreur si des tests lents ont été détectés
if [ "$slow_tests" -gt 0 ]; then
echo ""
echo "❌ Found $slow_tests slow test(s) exceeding threshold of $THRESHOLD"
exit 1
else
echo ""
echo "✅ All tests completed within threshold of $THRESHOLD"
exit 0
fi