| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #!/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
|