#!/bin/bash # 回归测试脚本 # 用途:每次大规模代码移除后,自动运行回归测试,确保流程通畅 # 使用方法:./test-regression.sh set -e # 遇到错误立即退出 echo "🧪 ========================================" echo "🧪 开始回归测试" echo "🧪 ========================================" echo "" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 测试结果统计 PASSED=0 FAILED=0 SKIPPED=0 # 测试函数 test_check() { local test_name="$1" local command="$2" echo -n " ⏳ $test_name... " if eval "$command" > /dev/null 2>&1; then echo -e "${GREEN}✅ 通过${NC}" ((PASSED++)) return 0 else echo -e "${RED}❌ 失败${NC}" ((FAILED++)) return 1 fi } test_check_with_output() { local test_name="$1" local command="$2" echo " ⏳ $test_name..." echo " 执行: $command" if eval "$command" 2>&1; then echo -e " ${GREEN}✅ 通过${NC}" ((PASSED++)) return 0 else echo -e " ${RED}❌ 失败${NC}" ((FAILED++)) return 1 fi } # ======================================== # 1. 编译检查 # ======================================== echo "📦 阶段 1: 编译检查" echo "----------------------------------------" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # 检查是否在 iOS 项目目录 if [ ! -d "$PROJECT_ROOT/ios/WildGrowth" ]; then echo -e "${RED}❌ 错误: 未找到 iOS 项目目录${NC}" exit 1 fi cd "$PROJECT_ROOT/ios/WildGrowth" # 检查 Xcode 项目文件 if [ ! -f "WildGrowth.xcodeproj/project.pbxproj" ]; then echo -e "${YELLOW}⚠️ 警告: 未找到 Xcode 项目文件,跳过编译检查${NC}" SKIPPED=$((SKIPPED + 1)) else # 尝试编译(如果 xcodebuild 可用) if command -v xcodebuild &> /dev/null; then echo " ⏳ 编译项目..." if xcodebuild -project WildGrowth.xcodeproj -scheme WildGrowth -destination 'platform=iOS Simulator,name=iPhone 15' clean build > /tmp/xcode_build.log 2>&1; then echo -e " ${GREEN}✅ 编译成功${NC}" PASSED=$((PASSED + 1)) else echo -e " ${RED}❌ 编译失败${NC}" echo " 查看日志: tail -50 /tmp/xcode_build.log" FAILED=$((FAILED + 1)) fi else echo -e " ${YELLOW}⚠️ xcodebuild 不可用,跳过编译检查${NC}" SKIPPED=$((SKIPPED + 1)) fi fi echo "" # ======================================== # 2. 文件存在性检查 # ======================================== echo "📁 阶段 2: 文件存在性检查" echo "----------------------------------------" cd "$PROJECT_ROOT/ios/WildGrowth/WildGrowth" # 检查应该存在的文件 REQUIRED_FILES=( "VerticalScreenPlayerView.swift" "MapView.swift" "HomeView.swift" "Views/GrowthView.swift" "ProfileView.swift" "CourseModels.swift" ) for file in "${REQUIRED_FILES[@]}"; do if [ -f "$file" ]; then echo -e " ${GREEN}✅ $file 存在${NC}" PASSED=$((PASSED + 1)) else echo -e " ${RED}❌ $file 不存在${NC}" FAILED=$((FAILED + 1)) fi done echo "" # 检查应该删除的文件(不应该存在) DELETED_FILES=( "SummaryView.swift" "GuestSummaryView.swift" "FlatNodeButton.swift" "ThreeDButton.swift" "LessonPlayerView.swift" "SlideImageView.swift" ) for file in "${DELETED_FILES[@]}"; do if [ -f "$file" ]; then echo -e " ${YELLOW}⚠️ $file 仍然存在(应该已删除)${NC}" SKIPPED=$((SKIPPED + 1)) else echo -e " ${GREEN}✅ $file 已删除${NC}" PASSED=$((PASSED + 1)) fi done echo "" # ======================================== # 3. 代码引用检查 # ======================================== echo "🔍 阶段 3: 代码引用检查" echo "----------------------------------------" cd "$PROJECT_ROOT/ios/WildGrowth/WildGrowth" # 检查是否还有对已删除组件的引用 check_no_reference() { local component="$1" local pattern="$2" echo -n " ⏳ 检查 $component 引用... " if grep -r "$pattern" . --include="*.swift" > /dev/null 2>&1; then echo -e "${RED}❌ 发现引用${NC}" echo " 引用位置:" grep -rn "$pattern" . --include="*.swift" | head -5 | sed 's/^/ /' FAILED=$((FAILED + 1)) return 1 else echo -e "${GREEN}✅ 无引用${NC}" PASSED=$((PASSED + 1)) return 0 fi } # 检查已删除组件的引用 check_no_reference "SummaryView" "SummaryView" check_no_reference "GuestSummaryView" "GuestSummaryView" check_no_reference "FlatNodeButton" "FlatNodeButton" check_no_reference "ThreeDButton" "ThreeDButton" check_no_reference "LessonPlayerView" "LessonPlayerView\(" check_no_reference "SlideImageView" "SlideImageView" echo "" # ======================================== # 4. 关键逻辑检查 # ======================================== echo "🔧 阶段 4: 关键逻辑检查" echo "----------------------------------------" cd "$PROJECT_ROOT/ios/WildGrowth/WildGrowth" # 检查 MapView 是否只使用 VerticalListLayout echo -n " ⏳ 检查 MapView 布局... " if grep -q "WindingPathLayout\|WindingNodeUnit" MapView.swift 2>/dev/null; then echo -e "${RED}❌ 发现横版布局代码${NC}" FAILED=$((FAILED + 1)) else if grep -q "VerticalListLayout" MapView.swift 2>/dev/null; then echo -e "${GREEN}✅ 只使用竖屏布局${NC}" PASSED=$((PASSED + 1)) else echo -e "${YELLOW}⚠️ 未找到 VerticalListLayout${NC}" SKIPPED=$((SKIPPED + 1)) fi fi # 检查 HomeView 是否只使用 VerticalScreenPlayerView echo -n " ⏳ 检查 HomeView 播放器... " if grep -q "LessonPlayerView" HomeView.swift 2>/dev/null; then echo -e "${RED}❌ 发现 LessonPlayerView 引用${NC}" FAILED=$((FAILED + 1)) else if grep -q "VerticalScreenPlayerView" HomeView.swift 2>/dev/null; then echo -e "${GREEN}✅ 只使用竖屏播放器${NC}" PASSED=$((PASSED + 1)) else echo -e "${YELLOW}⚠️ 未找到 VerticalScreenPlayerView${NC}" SKIPPED=$((SKIPPED + 1)) fi fi # 检查 CourseNavigation 是否还有 .player case echo -n " ⏳ 检查 CourseNavigation 枚举... " if grep -q "case.*player" HomeView.swift 2>/dev/null; then echo -e "${YELLOW}⚠️ 发现 .player case(可能需要移除)${NC}" SKIPPED=$((SKIPPED + 1)) else echo -e "${GREEN}✅ 无 .player case${NC}" PASSED=$((PASSED + 1)) fi echo "" # ======================================== # 5. 代码统计 # ======================================== echo "📊 阶段 5: 代码统计" echo "----------------------------------------" cd "$PROJECT_ROOT/ios/WildGrowth/WildGrowth" # 统计 Swift 文件数量 SWIFT_FILES=$(find . -name "*.swift" -type f | wc -l | tr -d ' ') echo " 📄 Swift 文件数量: $SWIFT_FILES" # 统计代码行数(排除空行和注释) CODE_LINES=$(find . -name "*.swift" -type f -exec cat {} \; | grep -v '^\s*$' | grep -v '^\s*//' | wc -l | tr -d ' ') echo " 📝 代码行数(估算): $CODE_LINES" echo "" # ======================================== # 6. 测试总结 # ======================================== echo "📋 测试总结" echo "========================================" echo -e " ${GREEN}✅ 通过: $PASSED${NC}" echo -e " ${RED}❌ 失败: $FAILED${NC}" echo -e " ${YELLOW}⚠️ 跳过: $SKIPPED${NC}" echo "" if [ $FAILED -eq 0 ]; then echo -e "${GREEN}🎉 所有测试通过!${NC}" exit 0 else echo -e "${RED}❌ 有测试失败,请检查${NC}" exit 1 fi