Files
张翔 08ea5fbe98 feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
2026-03-28 14:37:29 +08:00

237 lines
6.8 KiB
Bash
Executable File

#!/bin/bash
TDD迭代控制器 - 自动化测试驱动开发迭代机制
功能:
- 执行测试命令
- 分析测试结果
- 自动重试失败测试
- 智能退出机制
- 生成迭代报告
使用方法:
./tdd-iteration-controller.sh <test-command> [max-iterations]
示例:
./tdd-iteration-controller.sh "mvn test" 5
./tdd-iteration-controller.sh "npx playwright test" 3
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
LOG_DIR="$PROJECT_ROOT/test-automation/logs"
REPORT_DIR="$PROJECT_ROOT/test-automation/test-reports"
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
CURRENT_REPORT_DIR="$REPORT_DIR/tdd-iteration-$TIMESTAMP"
mkdir -p "$LOG_DIR"
mkdir -p "$CURRENT_REPORT_DIR"
TEST_COMMAND=${1:-"mvn test"}
MAX_ITERATIONS=${2:-5}
ITERATION_COUNT=0
FAILED_TESTS=()
PASSED_TESTS=()
ITERATION_LOG="$CURRENT_REPORT_DIR/iteration.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$ITERATION_LOG"
}
log_iteration_start() {
log "========================================="
log "迭代 $ITERATION_COUNT/$MAX_ITERATIONS 开始"
log "========================================="
log "测试命令: $TEST_COMMAND"
log "开始时间: $(date '+%Y-%m-%d %H:%M:%S')"
}
log_iteration_result() {
local exit_code=$1
local duration=$2
log "迭代结果: $exit_code"
log "耗时: ${duration}"
if [ $exit_code -eq 0 ]; then
log "✅ 所有测试通过"
PASSED_TESTS+=($ITERATION_COUNT)
return 0
else
log "❌ 测试失败"
FAILED_TESTS+=($ITERATION_COUNT)
return 1
fi
}
analyze_failures() {
log "========================================="
log "失败分析"
log "========================================="
local test_results_dir="$PROJECT_ROOT/everything-is-suitable-api/everything-is-suitable-app/target/surefire-reports"
if [ -d "$test_results_dir" ]; then
log "分析测试报告目录: $test_results_dir"
find "$test_results_dir" -name "*.xml" -type f | while read -r xml_file; do
if grep -q "failures=\"[1-9]" "$xml_file"; then
local test_name=$(basename "$xml_file" .xml)
log "失败测试: $test_name"
local failure_count=$(grep -o 'failures="[0-9]*"' "$xml_file" | grep -o '[0-9]*')
log "失败数量: $failure_count"
fi
done
fi
local allure_results_dir="$PROJECT_ROOT/everything-is-suitable-api/everything-is-suitable-app/target/allure-results"
if [ -d "$allure_results_dir" ]; then
log "分析Allure报告目录: $allure_results_dir"
local failed_count=$(find "$allure_results_dir" -name "*-result.json" -type f | wc -l | tr -d ' ')
log "Allure结果文件数: $failed_count"
fi
}
generate_iteration_report() {
local report_file="$CURRENT_REPORT_DIR/iteration-summary.md"
cat > "$report_file" << EOF
# TDD迭代报告
**生成时间**: $(date '+%Y-%m-%d %H:%M:%S')
**总迭代次数**: $MAX_ITERATIONS
**实际迭代次数**: $ITERATION_COUNT
## 迭代结果
| 迭代 | 状态 | 说明 |
|------|------|------|
EOF
for i in $(seq 1 $ITERATION_COUNT); do
if [[ " ${PASSED_TESTS[@]} " =~ " $i " ]]; then
echo "| $i | ✅ 通过 | 所有测试通过 |" >> "$report_file"
else
echo "| $i | ❌ 失败 | 部分测试失败 |" >> "$report_file"
fi
done
cat >> "$report_file" << EOF
## 统计信息
- **通过迭代**: ${#PASSED_TESTS[@]}/$ITERATION_COUNT
- **失败迭代**: ${#FAILED_TESTS[@]}/$ITERATION_COUNT
- **成功率**: $(echo "scale=1; ${#PASSED_TESTS[@]} * 100 / $ITERATION_COUNT" | bc)%
## 测试命令
\`\`\`bash
$TEST_COMMAND
\`\`\`
## 建议
EOF
if [ $ITERATION_COUNT -eq $MAX_ITERATIONS ] && [ ${#PASSED_TESTS[@]} -gt 0 ]; then
cat >> "$report_file" << EOF
✅ **测试通过!** 可以继续开发或部署。
EOF
elif [ $ITERATION_COUNT -eq $MAX_ITERATIONS ]; then
cat >> "$report_file" << EOF
❌ **达到最大迭代次数**,建议:
1. 检查测试失败原因
2. 修复失败的测试用例
3. 重新运行TDD迭代
4. 考虑调整测试策略
EOF
fi
log "迭代报告已生成: $report_file"
}
cleanup() {
log "========================================="
log "清理环境"
log "========================================="
if [ -f "$SCRIPT_DIR/stop-services.sh" ]; then
bash "$SCRIPT_DIR/stop-services.sh"
fi
log "环境清理完成"
}
trap cleanup EXIT INT TERM
main() {
log "========================================="
log "TDD迭代控制器启动"
log "========================================="
log "最大迭代次数: $MAX_ITERATIONS"
log "测试命令: $TEST_COMMAND"
log "报告目录: $CURRENT_REPORT_DIR"
log "========================================="
while [ $ITERATION_COUNT -lt $MAX_ITERATIONS ]; do
ITERATION_COUNT=$((ITERATION_COUNT + 1))
log_iteration_start
local start_time=$(date +%s)
cd "$PROJECT_ROOT"
if eval "$TEST_COMMAND" > "$CURRENT_REPORT_DIR/iteration-$ITERATION_COUNT.log" 2>&1; then
local end_time=$(date +%s)
local duration=$((end_time - start_time))
log_iteration_result 0 $duration
generate_iteration_report
log "========================================="
log "✅ 迭代 $ITERATION_COUNT 成功完成"
log "========================================="
exit 0
else
local end_time=$(date +%s)
local duration=$((end_time - start_time))
log_iteration_result 1 $duration
analyze_failures
if [ $ITERATION_COUNT -lt $MAX_ITERATIONS ]; then
log "========================================="
log "⚠️ 准备下一次迭代"
log "========================================="
log "等待5秒后重试..."
sleep 5
fi
fi
done
generate_iteration_report
log "========================================="
log "⚠️ 达到最大迭代次数 ($MAX_ITERATIONS)"
log "========================================="
log "最终状态:"
log " - 通过迭代: ${#PASSED_TESTS[@]}"
log " - 失败迭代: ${#FAILED_TESTS[@]}"
log " - 成功率: $(echo "scale=1; ${#PASSED_TESTS[@]} * 100 / $MAX_ITERATIONS" | bc)%"
if [ ${#PASSED_TESTS[@]} -gt 0 ]; then
log "✅ 至少有一次迭代成功,可以继续"
exit 0
else
log "❌ 所有迭代均失败,需要手动干预"
exit 1
fi
}
main "$@"