2
0

run-stability-test.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #!/bin/bash
  2. # 区域管理 E2E 测试稳定性验证脚本
  3. # Story 8.9: 连续运行 10 次测试验证稳定性
  4. # 获取脚本所在目录并切换
  5. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  6. cd "$SCRIPT_DIR"
  7. # 初始化变量
  8. PASSED=0
  9. FAILED=0
  10. TIMES=()
  11. RESULTS=()
  12. START_TIME=$(date +%s)
  13. # 颜色输出
  14. RED='\033[0;31m'
  15. GREEN='\033[0;32m'
  16. YELLOW='\033[1;33m'
  17. BLUE='\033[0;34m'
  18. NC='\033[0m' # No Color
  19. # 日志目录 - 使用绝对路径
  20. LOG_DIR="$SCRIPT_DIR/test-results/stability"
  21. mkdir -p "$LOG_DIR"
  22. # 测试文件列表
  23. TEST_FILES=(
  24. "tests/e2e/specs/admin/region-list.spec.ts"
  25. "tests/e2e/specs/admin/region-add.spec.ts"
  26. "tests/e2e/specs/admin/region-edit.spec.ts"
  27. "tests/e2e/specs/admin/region-delete.spec.ts"
  28. "tests/e2e/specs/admin/region-cascade.spec.ts"
  29. )
  30. echo -e "${BLUE}=== 区域管理 E2E 测试稳定性验证 ===${NC}"
  31. echo "开始时间: $(date)"
  32. echo "工作目录: $SCRIPT_DIR"
  33. echo "日志目录: $LOG_DIR"
  34. echo "测试文件: ${TEST_FILES[*]}"
  35. echo "运行次数: 10"
  36. echo ""
  37. # 清理函数:杀死残留的浏览器进程
  38. cleanup_processes() {
  39. echo -e " ${YELLOW}清理残留进程...${NC}"
  40. # 杀死所有 chromium 进程(Playwright 使用的浏览器)
  41. pkill -9 chromium 2>/dev/null || true
  42. pkill -9 chrome 2>/dev/null || true
  43. # 等待进程完全退出
  44. sleep 2
  45. echo " 清理完成"
  46. }
  47. # 运行稳定性测试
  48. for i in {1..10}; do
  49. echo -e "${BLUE}=== 运行 #$i ===${NC}"
  50. # 每次运行前清理残留进程(防止卡住)
  51. cleanup_processes
  52. START=$(date +%s)
  53. # 运行测试并保存日志
  54. LOG_FILE="$LOG_DIR/run-$i.log"
  55. # 导入环境变量并运行测试
  56. # 使用 E2E_BASE_URL 指向已运行的开发服务器(8080端口)
  57. # 添加 timeout 防止测试卡住(5分钟超时)
  58. (
  59. export E2E_BASE_URL=http://localhost:8080
  60. timeout 300 pnpm test:e2e:chromium "${TEST_FILES[@]}" > "$LOG_FILE" 2>&1
  61. )
  62. EXIT_CODE=$?
  63. # 检查结果
  64. if [ $EXIT_CODE -eq 0 ]; then
  65. RESULT=0
  66. PASSED=$((PASSED + 1))
  67. STATUS="${GREEN}通过${NC}"
  68. elif [ $EXIT_CODE -eq 124 ]; then
  69. RESULT=1
  70. FAILED=$((FAILED + 1))
  71. STATUS="${RED}超时${NC}"
  72. echo -e " ${RED}⚠️ 测试超时(300秒),可能已卡住${NC}"
  73. else
  74. RESULT=1
  75. FAILED=$((FAILED + 1))
  76. STATUS="${RED}失败${NC}"
  77. fi
  78. # 每次运行后也要清理残留进程
  79. cleanup_processes
  80. END=$(date +%s)
  81. DURATION=$((END - START))
  82. TIMES+=($DURATION)
  83. RESULTS+=($RESULT)
  84. echo -e " 结果: $STATUS (耗时: ${DURATION}s)"
  85. # 提取测试统计信息
  86. if [ -f "$LOG_FILE" ]; then
  87. # 查找最终的测试结果摘要行
  88. if grep -q "passed" "$LOG_FILE"; then
  89. # 尝试多种方式提取测试结果
  90. PASSED_TESTS=$(grep -oP '\d+(?= passed)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "N/A")
  91. FAILED_TESTS=$(grep -oP '\d+(?= failed)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "0")
  92. SKIPPED_TESTS=$(grep -oP '\d+(?= skipped)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "0")
  93. echo " 测试结果: 通过 $PASSED_TESTS, 失败 $FAILED_TESTS, 跳过 $SKIPPED_TESTS"
  94. else
  95. # 如果没有找到标准格式,尝试其他方式
  96. echo " 日志文件已创建,但无法解析标准测试结果格式"
  97. fi
  98. # 如果测试失败,显示错误摘要
  99. if [ $RESULT -ne 0 ]; then
  100. echo -e " ${YELLOW}错误摘要:${NC}"
  101. grep -iE "error|failed|timeout|fatal" "$LOG_FILE" 2>/dev/null | head -5 | sed 's/^/ /' || echo " 无法提取错误信息"
  102. fi
  103. else
  104. echo " ${YELLOW}警告: 日志文件未创建${NC}"
  105. fi
  106. echo ""
  107. done
  108. # 计算总时间
  109. TOTAL_TIME=$(($(date +%s) - START_TIME))
  110. # 计算统计信息
  111. if [ $PASSED -gt 0 ]; then
  112. AVG_TIME=$(awk '{sum+=$1} END {print sum/NR}' <<< "${TIMES[@]}")
  113. MIN_TIME=$(printf "%s\n" "${TIMES[@]}" | sort -n | head -1)
  114. MAX_TIME=$(printf "%s\n" "${TIMES[@]}" | sort -n | tail -1)
  115. fi
  116. PASS_RATE=$((PASSED * 10))
  117. # 输出总结
  118. echo -e "${BLUE}=== 稳定性测试结果 ===${NC}"
  119. echo -e "通过率: ${PASSED}/10 (${PASS_RATE}%)"
  120. echo "失败次数: $FAILED"
  121. if [ $PASSED -gt 0 ]; then
  122. echo "平均耗时: ${AVG_TIME}s"
  123. echo "最快耗时: ${MIN_TIME}s"
  124. echo "最慢耗时: ${MAX_TIME}s"
  125. fi
  126. echo "总耗时: ${TOTAL_TIME}s"
  127. # 判断稳定性
  128. echo ""
  129. if [ $PASSED -eq 10 ]; then
  130. echo -e "${GREEN}✅ 100% 稳定性通过!Epic 8 完成!${NC}"
  131. exit 0
  132. elif [ $PASSED -ge 9 ]; then
  133. echo -e "${YELLOW}⚠️ 90% 稳定性,建议分析失败原因${NC}"
  134. exit 1
  135. else
  136. echo -e "${RED}❌ 稳定性不足 (<90%),需要修复问题${NC}"
  137. exit 1
  138. fi