#!/bin/bash # 区域管理 E2E 测试稳定性验证脚本 # Story 8.9: 连续运行 10 次测试验证稳定性 # 获取脚本所在目录并切换 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # 初始化变量 PASSED=0 FAILED=0 TIMES=() RESULTS=() START_TIME=$(date +%s) # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志目录 - 使用绝对路径 LOG_DIR="$SCRIPT_DIR/test-results/stability" mkdir -p "$LOG_DIR" # 测试文件列表 TEST_FILES=( "tests/e2e/specs/admin/region-list.spec.ts" "tests/e2e/specs/admin/region-add.spec.ts" "tests/e2e/specs/admin/region-edit.spec.ts" "tests/e2e/specs/admin/region-delete.spec.ts" "tests/e2e/specs/admin/region-cascade.spec.ts" ) echo -e "${BLUE}=== 区域管理 E2E 测试稳定性验证 ===${NC}" echo "开始时间: $(date)" echo "工作目录: $SCRIPT_DIR" echo "日志目录: $LOG_DIR" echo "测试文件: ${TEST_FILES[*]}" echo "运行次数: 10" echo "" # 清理函数:杀死残留的浏览器进程 cleanup_processes() { echo -e " ${YELLOW}清理残留进程...${NC}" # 杀死所有 chromium 进程(Playwright 使用的浏览器) pkill -9 chromium 2>/dev/null || true pkill -9 chrome 2>/dev/null || true # 等待进程完全退出 sleep 2 echo " 清理完成" } # 运行稳定性测试 for i in {1..10}; do echo -e "${BLUE}=== 运行 #$i ===${NC}" # 每次运行前清理残留进程(防止卡住) cleanup_processes START=$(date +%s) # 运行测试并保存日志 LOG_FILE="$LOG_DIR/run-$i.log" # 导入环境变量并运行测试 # 使用 E2E_BASE_URL 指向已运行的开发服务器(8080端口) # 添加 timeout 防止测试卡住(5分钟超时) ( export E2E_BASE_URL=http://localhost:8080 timeout 300 pnpm test:e2e:chromium "${TEST_FILES[@]}" > "$LOG_FILE" 2>&1 ) EXIT_CODE=$? # 检查结果 if [ $EXIT_CODE -eq 0 ]; then RESULT=0 PASSED=$((PASSED + 1)) STATUS="${GREEN}通过${NC}" elif [ $EXIT_CODE -eq 124 ]; then RESULT=1 FAILED=$((FAILED + 1)) STATUS="${RED}超时${NC}" echo -e " ${RED}⚠️ 测试超时(300秒),可能已卡住${NC}" else RESULT=1 FAILED=$((FAILED + 1)) STATUS="${RED}失败${NC}" fi # 每次运行后也要清理残留进程 cleanup_processes END=$(date +%s) DURATION=$((END - START)) TIMES+=($DURATION) RESULTS+=($RESULT) echo -e " 结果: $STATUS (耗时: ${DURATION}s)" # 提取测试统计信息 if [ -f "$LOG_FILE" ]; then # 查找最终的测试结果摘要行 if grep -q "passed" "$LOG_FILE"; then # 尝试多种方式提取测试结果 PASSED_TESTS=$(grep -oP '\d+(?= passed)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "N/A") FAILED_TESTS=$(grep -oP '\d+(?= failed)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "0") SKIPPED_TESTS=$(grep -oP '\d+(?= skipped)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "0") echo " 测试结果: 通过 $PASSED_TESTS, 失败 $FAILED_TESTS, 跳过 $SKIPPED_TESTS" else # 如果没有找到标准格式,尝试其他方式 echo " 日志文件已创建,但无法解析标准测试结果格式" fi # 如果测试失败,显示错误摘要 if [ $RESULT -ne 0 ]; then echo -e " ${YELLOW}错误摘要:${NC}" grep -iE "error|failed|timeout|fatal" "$LOG_FILE" 2>/dev/null | head -5 | sed 's/^/ /' || echo " 无法提取错误信息" fi else echo " ${YELLOW}警告: 日志文件未创建${NC}" fi echo "" done # 计算总时间 TOTAL_TIME=$(($(date +%s) - START_TIME)) # 计算统计信息 if [ $PASSED -gt 0 ]; then AVG_TIME=$(awk '{sum+=$1} END {print sum/NR}' <<< "${TIMES[@]}") MIN_TIME=$(printf "%s\n" "${TIMES[@]}" | sort -n | head -1) MAX_TIME=$(printf "%s\n" "${TIMES[@]}" | sort -n | tail -1) fi PASS_RATE=$((PASSED * 10)) # 输出总结 echo -e "${BLUE}=== 稳定性测试结果 ===${NC}" echo -e "通过率: ${PASSED}/10 (${PASS_RATE}%)" echo "失败次数: $FAILED" if [ $PASSED -gt 0 ]; then echo "平均耗时: ${AVG_TIME}s" echo "最快耗时: ${MIN_TIME}s" echo "最慢耗时: ${MAX_TIME}s" fi echo "总耗时: ${TOTAL_TIME}s" # 判断稳定性 echo "" if [ $PASSED -eq 10 ]; then echo -e "${GREEN}✅ 100% 稳定性通过!Epic 8 完成!${NC}" exit 0 elif [ $PASSED -ge 9 ]; then echo -e "${YELLOW}⚠️ 90% 稳定性,建议分析失败原因${NC}" exit 1 else echo -e "${RED}❌ 稳定性不足 (<90%),需要修复问题${NC}" exit 1 fi