From 1b1e12feedb35a649b7dc65f3790c66e727bf127 Mon Sep 17 00:00:00 2001 From: liugang Date: Fri, 19 Sep 2025 13:59:18 +0800 Subject: [PATCH] * [misc] Enhance unit test generator script with multiple run modes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .claude/scripts/unit_test_generator.sh | 81 ++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 10 deletions(-) diff --git a/.claude/scripts/unit_test_generator.sh b/.claude/scripts/unit_test_generator.sh index 02de022757..b4393bd181 100755 --- a/.claude/scripts/unit_test_generator.sh +++ b/.claude/scripts/unit_test_generator.sh @@ -5,9 +5,10 @@ # 日期: $(date +%Y-%m-%d) echo_usage() { - echo "Usage: $0 [-c] [-s START_LINE] " + echo "Usage: $0 [-c] [-m MODE] [-s START_LINE] " echo "This script generates unit test scripts based on the provided CSV file." echo " -c Continue processing on error (default is to break)." + echo " -m MODE Run mode: generate, enhance, or fix. Default is 'generate'." echo " -s START_LINE Start processing from line START_LINE. Default is 2 (the first line is header)." exit 1 } @@ -28,8 +29,11 @@ ON_ERROR_STRATEGY="break" # 默认为 break # 默认从第2行开始(跳过标题行) START_LINE=2 +# 默认模式为 generate +MODE="generate" + # 解析命令行选项 -while getopts ":cs:" opt; do # 注意 's:' 表示 s 选项需要一个参数 +while getopts ":cs:m:" opt; do # 注意 's:' 和 'm:' 表示 s 和 m 选项需要参数 case ${opt} in c ) ON_ERROR_STRATEGY="continue" @@ -42,6 +46,14 @@ while getopts ":cs:" opt; do # 注意 's:' 表示 s 选项需要一个参数 fi START_LINE="$OPTARG" ;; + m ) + # 验证 MODE 是否为有效值 + if [[ "$OPTARG" != "generate" && "$OPTARG" != "enhance" && "$OPTARG" != "fix" ]]; then + echo "Invalid mode: '$OPTARG'. Must be 'generate', 'enhance', or 'fix'." + exit 1 + fi + MODE="$OPTARG" + ;; \? ) echo "Invalid Option: -$OPTARG" 1>&2 exit 1 @@ -153,13 +165,23 @@ process_method() { # 检查测试文件是否存在 if [ -f "$test_file_path" ]; then - echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 测试文件已存在,跳过: $test_file_path" | tee -a "$LOG_FILE" - ((TOTAL_SKIPPED++)) - return 0 + if [ "$MODE" == "generate" ]; then + echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 测试文件已存在,跳过: $test_file_path" | tee -a "$LOG_FILE" + ((TOTAL_SKIPPED++)) + return 0 + else + echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 测试文件已存在,将在 $MODE 模式下处理: $test_file_path" | tee -a "$LOG_FILE" + fi + else + if [ "$MODE" == "generate" ]; then + echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 测试文件不存在,开始生成: $test_file_path" | tee -a "$LOG_FILE" + else + echo "$(date '+%Y-%m-%d %H:%M:%S') [WARN] 测试文件不存在,无法进行 $MODE 操作,跳过: $test_file_path" | tee -a "$LOG_FILE" + ((TOTAL_SKIPPED++)) + return 0 + fi fi - echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 测试文件不存在,开始生成: $test_file_path" | tee -a "$LOG_FILE" - # 创建测试目录(如果不存在) local test_dir="$BASE_PATH/module/$module/test/$class" if [ ! -d "$test_dir" ]; then @@ -167,8 +189,25 @@ process_method() { mkdir -p "$test_dir" fi - # 构建Claude命令 - local claude_prompt="根据$GUIDE_FILE文档的内容为$module模块的$class.php文件中的$method方法生成单元测试脚本。" + # 根据模式构建不同的Claude提示词 + local claude_prompt="" + case "$MODE" in + "generate") + claude_prompt="根据$GUIDE_FILE文档的内容为$module模块的$class.php文件中的$method方法生成单元测试脚本。" + ;; + "enhance") + claude_prompt="根据$GUIDE_FILE文档的内容,对$module模块的$class.php文件中$method方法对应的现有单元测试脚本($test_file_path)进行改进和优化,提升测试覆盖率和代码质量并确保测试步骤不少于5个。" + ;; + "fix") + claude_prompt="根据$GUIDE_FILE文档的内容,检查并修复$module模块的$class.php文件中$method方法对应的现有单元测试脚本($test_file_path)中的错误和问题,确保测试能够稳定通过。" + ;; + *) + # This should never happen due to validation in getopts + echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] 未知的运行模式: $MODE" | tee -a "$LOG_FILE" + return 1 + ;; + esac + local claude_command="claude -p \"$claude_prompt\" --dangerously-skip-permissions < /dev/null 2>&1" # 调用Claude生成测试脚本 @@ -181,6 +220,7 @@ process_method() { # 主处理函数 main() { echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] ========== 开始执行单元测试生成脚本 ==========" | tee -a "$LOG_FILE" + echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 运行模式: $MODE" | tee -a "$LOG_FILE" # 检查前置条件 check_prerequisites @@ -206,6 +246,27 @@ main() { continue fi + # module只能包含小写字母 + if ! [[ "$module" =~ ^[a-z]+$ ]]; then + echo "$(date '+%Y-%m-%d %H:%M:%S') [WARN] 第 $CURRENT_LINE 行模块名格式不正确,跳过: $module" | tee -a "$LOG_FILE" + ((TOTAL_SKIPPED++)) + continue + fi + + # class只能是model、tao、zen其中之一 + if ! [[ "$class" =~ ^(model|tao|zen)$ ]]; then + echo "$(date '+%Y-%m-%d %H:%M:%S') [WARN] 第 $CURRENT_LINE 行类名格式不正确,跳过: $class" | tee -a "$LOG_FILE" + ((TOTAL_SKIPPED++)) + continue + fi + + # method只能包含字母和数字且必须以小写字母开头 + if ! [[ "$method" =~ ^[a-z][a-zA-Z0-9_]*$ ]]; then + echo "$(date '+%Y-%m-%d %H:%M:%S') [WARN] 第 $CURRENT_LINE 行方法名格式不正确,跳过: $method" | tee -a "$LOG_FILE" + ((TOTAL_SKIPPED++)) + continue + fi + # 清理字段中的回车符和空白字符 module=$(echo "$module" | tr -d '\r\n' | xargs) class=$(echo "$class" | tr -d '\r\n' | xargs) @@ -244,7 +305,7 @@ main() { echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] ========== 执行完成 ==========" | tee -a "$LOG_FILE" echo "$(date '+%Y-%m-%d %H:%M:%S') [STATS] 总处理数量: $TOTAL_PROCESSED" | tee -a "$LOG_FILE" echo "$(date '+%Y-%m-%d %H:%M:%S') [STATS] 跳过数量: $TOTAL_SKIPPED" | tee -a "$LOG_FILE" - echo "$(date '+%Y-%m-%d %H:%M:%S') [STATS] 生成数量: $TOTAL_GENERATED" | tee -a "$LOG_FILE" + echo "$(date '+%Y-%m-%d %H:%M:%S') [STATS] 生成/更新数量: $TOTAL_GENERATED" | tee -a "$LOG_FILE" echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 日志文件: $LOG_FILE" | tee -a "$LOG_FILE" }