08ea5fbe98
添加用户管理视图、API和状态管理文件
237 lines
6.8 KiB
Bash
Executable File
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 "$@"
|