#!/bin/bash # Скрипт для анализа покрытия тестами # Использование: ./scripts/coverage.sh [--html] [--threshold=80] set -e # Параметры по умолчанию GENERATE_HTML=false COVERAGE_THRESHOLD=80 # Парсим аргументы while [[ $# -gt 0 ]]; do case $1 in --html) GENERATE_HTML=true shift ;; --threshold=*) COVERAGE_THRESHOLD="${1#*=}" shift ;; *) echo "Неизвестный параметр: $1" echo "Использование: $0 [--html] [--threshold=80]" exit 1 ;; esac done echo "🧪 Анализ покрытия тестами..." echo "" # Запускаем тесты с покрытием go test ./... -coverprofile=coverage.out # Получаем общую статистику покрытия TOTAL_COVERAGE=$(go tool cover -func=coverage.out | tail -1 | awk '{print $3}' | sed 's/%//') echo "" echo "📊 Общая статистика покрытия:" echo "┌─────────────────────────────────────────────────────────────┐" echo "│ Пакет │ Покрытие │ Статус │" echo "├─────────────────────────────────────────────────────────────┤" # Анализируем покрытие по пакетам go test ./... -cover | while read -r line; do if [[ $line =~ coverage:\ ([0-9.]+)% ]]; then PACKAGE=$(echo "$line" | awk '{print $1}') COVERAGE=$(echo "$line" | grep -o '[0-9.]*%' | head -1) COVERAGE_NUM=$(echo "$COVERAGE" | sed 's/%//') if (( $(echo "$COVERAGE_NUM >= $COVERAGE_THRESHOLD" | bc -l) )); then STATUS="✅ Хорошо" elif (( $(echo "$COVERAGE_NUM > 0" | bc -l) )); then STATUS="⚠️ Низкое" else STATUS="❌ Нет тестов" fi printf "│ %-25s │ %8s │ %-20s │\n" "$PACKAGE" "$COVERAGE" "$STATUS" fi done echo "└─────────────────────────────────────────────────────────────┘" echo "" # Проверяем общее покрытие if (( $(echo "$TOTAL_COVERAGE >= $COVERAGE_THRESHOLD" | bc -l) )); then echo "🎉 Общее покрытие: ${TOTAL_COVERAGE}% (>= ${COVERAGE_THRESHOLD}%)" COVERAGE_STATUS=0 else echo "⚠️ Общее покрытие: ${TOTAL_COVERAGE}% (< ${COVERAGE_THRESHOLD}%)" echo "💡 Рекомендуется увеличить покрытие тестами" COVERAGE_STATUS=1 fi # Генерируем HTML отчет если запрошено if [ "$GENERATE_HTML" = true ]; then echo "" echo "📄 Генерация HTML отчета..." go tool cover -html=coverage.out -o coverage.html echo "✅ HTML отчет сохранен в coverage.html" echo "🌐 Откройте coverage.html в браузере для детального просмотра" fi # Показываем функции с низким покрытием echo "" echo "🔍 Функции с низким покрытием (< 50%):" go tool cover -func=coverage.out | grep -E "0\.0%|^[0-9]+\.[0-9]+%" | head -10 # Очищаем временные файлы rm -f coverage.out echo "" echo "📈 Рекомендации по улучшению покрытия:" echo "1. Добавьте unit тесты для handlers (сейчас 0% покрытия)" echo "2. Добавьте unit тесты для service layer (сейчас 0% покрытия)" echo "3. Добавьте unit тесты для middleware (сейчас 0% покрытия)" echo "4. Добавьте unit тесты для config и database (сейчас 0% покрытия)" echo "5. Улучшите покрытие repository layer (сейчас 24.5%)" exit $COVERAGE_STATUS