#!/bin/bash TDD迭代控制器 - 自动化测试驱动开发迭代机制 功能: - 执行测试命令 - 分析测试结果 - 自动重试失败测试 - 智能退出机制 - 生成迭代报告 使用方法: ./tdd-iteration-controller.sh [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 "$@"