diff --git a/docs/test-scripts/README.md b/docs/test-scripts/README.md new file mode 100644 index 0000000..ff8ffaf --- /dev/null +++ b/docs/test-scripts/README.md @@ -0,0 +1,258 @@ +# 项目创建功能测试说明 + +## 概述 + +本文档说明如何使用测试脚本测试"创建项目时集成流水分析平台"功能。 + +## 测试场景 + +### 1. 创建项目成功 +- **目标**: 验证创建项目时成功调用流水分析平台并保存 `lsfxProjectId` +- **步骤**: + 1. 准备项目数据(项目名称、描述、配置方式) + 2. 调用创建项目接口 + 3. 验证响应中包含 `lsfxProjectId` + 4. 验证数据库中 `lsfx_project_id` 字段已保存 + +### 2. 创建项目失败(项目名称为空) +- **目标**: 验证参数校验功能 +- **预期**: 接口应拒绝空项目名称,返回错误信息 + +### 3. 查询项目列表 +- **目标**: 验证项目列表中正确显示 `lsfxProjectId` +- **步骤**: + 1. 调用项目列表查询接口 + 2. 验证返回数据包含 `lsfxProjectId` 字段 + +### 4. 流水分析平台不可用(可选) +- **目标**: 验证异常处理和事务回滚 +- **步骤**: + 1. 停止 Mock Server + 2. 尝试创建项目 + 3. 验证返回错误信息 + 4. 验证数据库无脏数据(事务已回滚) + +## 前置条件 + +### 必须条件 +1. **后端服务已启动** + ```bash + cd ruoyi-admin + mvn spring-boot:run + ``` + 访问地址: http://localhost:8080 + +2. **Mock Server 已启动**(测试场景1-3) + ```bash + cd lsfx-mock-server + python app.py + ``` + 访问地址: http://localhost:8000 + +3. **数据库连接正常** + - 主机: 116.62.17.81 + - 数据库: ccdi + - 用户: root + +### 可选条件 +- **MySQL客户端**: 用于验证数据库(bash脚本需要) +- **PowerShell 5.1+**: 用于运行 PowerShell 脚本 +- **Git Bash**: 用于运行 bash 脚本(Windows 环境) + +## 测试脚本 + +提供了三个版本的测试脚本: + +### 1. Bash 脚本(推荐) + +**适用环境**: Linux、MacOS、Git Bash (Windows) + +**执行方式**: +```bash +# 进入测试脚本目录 +cd docs/test-scripts + +# 赋予执行权限 +chmod +x test-project-creation.sh + +# 执行测试 +./test-project-creation.sh +``` + +**优点**: +- 功能最完整 +- 支持数据库验证 +- 彩色输出 + +### 2. PowerShell 脚本 + +**适用环境**: Windows (PowerShell 5.1+) + +**执行方式**: +```powershell +# 进入测试脚本目录 +cd docs\test-scripts + +# 执行测试 +.\test-project-creation.ps1 +``` + +**优点**: +- Windows 原生支持 +- 交互式提示 +- 无需额外工具 + +### 3. 批处理脚本 + +**适用环境**: Windows (CMD) + +**执行方式**: +```cmd +cd docs\test-scripts +test-project-creation.bat +``` + +**优点**: +- 简单易用 +- 无需额外工具 + +## 预期结果 + +### 成功指标 + +1. **创建项目成功** + - 响应 `code: 200` + - 响应包含 `lsfxProjectId` 字段(如:77) + - 数据库 `ccdi_project` 表中 `lsfx_project_id` 不为空 + +2. **参数校验** + - 空项目名称被拒绝 + - 返回错误信息 + +3. **查询列表** + - 响应 `code: 200` + - 列表数据包含 `lsfxProjectId` 字段 + +4. **异常处理**(可选) + - Mock Server 不可用时返回错误 + - 数据库无脏数据(事务回滚) + +### 测试输出示例 + +``` +========================================== +开始执行项目创建功能测试 +========================================== +[INFO] 检查后端服务状态... +[INFO] ✓ 后端服务运行正常 +[INFO] 获取访问令牌... +[INFO] ✓ 成功获取令牌 +========================================== +测试场景1:创建项目成功 +========================================== +[INFO] 请求数据: {"projectName":"集成测试项目_20260304_105500","description":"测试集成流水分析平台","configType":"default"} +[INFO] 响应内容: {"code":200,"msg":"项目创建成功","data":{...}} +[INFO] ✓ 项目创建成功 +[INFO] ✓ 流水分析平台项目ID: 77 +[INFO] 验证数据库... +[INFO] ✓ 数据库验证通过:lsfx_project_id 已正确保存 +... +========================================== +测试结果汇总 +========================================== +[INFO] 通过: 3 +[ERROR] 失败: 0 +[INFO] 总计: 3 +[INFO] ✓ 所有测试通过! +``` + +## 手动测试(Swagger UI) + +如果需要手动测试,可以使用 Swagger UI: + +1. **访问 Swagger UI** + ``` + http://localhost:8080/swagger-ui/index.html + ``` + +2. **获取 Token** + - 找到 `/login/test` 接口 + - 点击 "Try it out" + - 输入 username: `admin`, password: `admin123` + - 点击 "Execute" + - 复制返回的 token + +3. **设置认证** + - 点击页面顶部 "Authorize" 按钮 + - 输入 `Bearer ` + - 点击 "Authorize" + +4. **创建项目** + - 找到 `POST /ccdi/project` 接口 + - 点击 "Try it out" + - 输入请求体: + ```json + { + "projectName": "手动测试项目", + "description": "通过Swagger测试", + "configType": "default" + } + ``` + - 点击 "Execute" + - 查看响应,验证 `lsfxProjectId` 存在 + +5. **查询项目** + - 找到 `GET /ccdi/project/list` 接口 + - 点击 "Try it out" + - 点击 "Execute" + - 验证返回数据包含 `lsfxProjectId` + +## 故障排查 + +### 问题1: 后端服务连接失败 +**原因**: 后端未启动或端口被占用 +**解决**: +- 检查端口 8080 是否被占用 +- 重启后端服务 + +### 问题2: Mock Server 连接失败 +**原因**: Mock Server 未启动 +**解决**: +```bash +cd lsfx-mock-server +python app.py +``` + +### 问题3: 获取 Token 失败 +**原因**: 用户名或密码错误 +**解决**: +- 确认使用 admin/admin123 +- 检查后端日志 + +### 问题4: lsfxProjectId 为空 +**原因**: 流水分析平台调用失败 +**解决**: +- 检查 Mock Server 是否运行 +- 查看后端日志中的错误信息 +- 确认 `LsfxAnalysisClient` 配置正确 + +### 问题5: 数据库验证失败 +**原因**: 数据库连接问题或字段未保存 +**解决**: +- 检查数据库连接配置 +- 确认 `lsfx_project_id` 字段已添加到表 +- 查看后端日志 + +## 注意事项 + +1. **测试顺序**: 按照场景1→2→3→4的顺序执行 +2. **数据清理**: 测试会创建临时项目数据,建议定期清理 +3. **Mock Server**: 场景4需要停止 Mock Server,其他场景需要运行 +4. **事务回滚**: 异常场景验证事务是否正确回滚 +5. **权限**: 测试账号需要有项目创建权限 + +## 相关文档 + +- [设计文档](../design/2026-03-04-create-project-integrate-lsfx-design.md) +- [实施计划](../plans/2026-03-04-create-project-integrate-lsfx.md) +- [流水分析对接文档](../../assets/对接流水分析/兰溪-流水分析对接-新版.md) diff --git a/docs/test-scripts/test-project-creation.bat b/docs/test-scripts/test-project-creation.bat new file mode 100644 index 0000000..1f63701 --- /dev/null +++ b/docs/test-scripts/test-project-creation.bat @@ -0,0 +1,226 @@ +@echo off +REM ==================================== +REM 项目创建功能测试脚本 (Windows版本) +REM 功能:测试创建项目时集成流水分析平台 +REM 作者:Claude Code +REM 日期:2026-03-04 +REM ==================================== + +setlocal enabledelayedexpansion + +REM 配置 +set BASE_URL=http://localhost:8080 +set USERNAME=admin +set PASSWORD=admin123 +set TOKEN= + +REM 颜色设置(Windows 10+) +set "GREEN=[92m" +set "RED=[91m" +set "YELLOW=[93m" +set "NC=[0m" + +REM 计数器 +set PASS_COUNT=0 +set FAIL_COUNT=0 + +REM 日志函数 +goto :main + +:log_info +echo %GREEN%[INFO]%NC% %~1 +goto :eof + +:log_error +echo %RED%[ERROR]%NC% %~1 +goto :eof + +:log_warning +echo %YELLOW%[WARNING]%NC% %~1 +goto :eof + +REM 检查curl是否存在 +:check_curl +where curl >nul 2>&1 +if %ERRORLEVEL% neq 0 ( + call :log_error "curl 未安装,请先安装 curl 或使用 Git Bash 运行 test-project-creation.sh" + exit /b 1 +) +exit /b 0 + +REM 检查后端服务 +:check_backend_service +call :log_info "检查后端服务状态..." +curl -s --connect-timeout 5 "%BASE_URL%/actuator/health" >nul 2>&1 +if %ERRORLEVEL% equ 0 ( + call :log_info "✓ 后端服务运行正常" + exit /b 0 +) else ( + call :log_error "✗ 后端服务未运行,请先启动后端服务" + call :log_info "启动命令: cd ruoyi-admin && mvn spring-boot:run" + exit /b 1 +) + +REM 获取访问令牌 +:get_token +call :log_info "获取访问令牌..." +for /f "delims=" %%i in ('curl -s -X POST "%BASE_URL%/login/test?username=%USERNAME%&password=%PASSWORD%"') do set TOKEN_RESPONSE=%%i + +REM 提取token(简单解析) +for /f "tokens=2 delims=:," %%a in ('echo %TOKEN_RESPONSE% ^| findstr /r "token"') do ( + set TOKEN=%%a + set TOKEN=!TOKEN:"=! + goto :token_extracted +) + +:token_extracted +if "%TOKEN%"=="" ( + call :log_error "获取令牌失败:无法从响应中提取 token" + call :log_info "响应内容: %TOKEN_RESPONSE%" + exit /b 1 +) + +call :log_info "✓ 成功获取令牌" +exit /b 0 + +REM 测试场景1:创建项目成功 +:test_create_project_success +call :log_info "==========================================" +call :log_info "测试场景1:创建项目成功" +call :log_info "==========================================" + +REM 生成时间戳 +for /f "tokens=1-6 delims=/:. " %%a in ("%date% %time%") do ( + set TIMESTAMP=%%a%%b%%c_%%d%%e%%f +) +set PROJECT_NAME=集成测试项目_%TIMESTAMP% + +REM 准备JSON数据(需要转义) +set REQUEST_DATA={"projectName":"%PROJECT_NAME%","description":"测试集成流水分析平台","configType":"default"} + +call :log_info "请求数据: %REQUEST_DATA%" + +REM 发送请求并保存响应到文件 +curl -s -X POST "%BASE_URL%/ccdi/project" ^ + -H "Content-Type: application/json" ^ + -H "Authorization: Bearer %TOKEN%" ^ + -d "%REQUEST_DATA%" > response.json + +type response.json +echo. + +REM 检查是否成功 +findstr /c:"code":200 response.json >nul +if %ERRORLEVEL% equ 0 ( + call :log_info "✓ 项目创建成功" + + REM 检查lsfxProjectId + findstr /c:"lsfxProjectId" response.json >nul + if %ERRORLEVEL% equ 0 ( + call :log_info "✓ 流水分析平台项目ID存在" + set /a PASS_COUNT+=1 + ) else ( + call :log_error "✗ 流水分析平台项目ID为空" + set /a FAIL_COUNT+=1 + ) +) else ( + call :log_error "✗ 项目创建失败" + set /a FAIL_COUNT+=1 +) + +del response.json +exit /b 0 + +REM 测试场景2:创建项目失败(项目名称为空) +:test_create_project_empty_name +call :log_info "==========================================" +call :log_info "测试场景2:创建项目失败(项目名称为空)" +call :log_info "==========================================" + +set REQUEST_DATA={"projectName":"","description":"测试异常场景","configType":"default"} + +call :log_info "请求数据: %REQUEST_DATA%" + +curl -s -X POST "%BASE_URL%/ccdi/project" ^ + -H "Content-Type: application/json" ^ + -H "Authorization: Bearer %TOKEN%" ^ + -d "%REQUEST_DATA%" > response.json + +REM 检查是否失败 +findstr /c:"code":200 response.json >nul +if %ERRORLEVEL% neq 0 ( + call :log_info "✓ 正确拒绝了空项目名称" + set /a PASS_COUNT+=1 +) else ( + call :log_error "✗ 未正确验证项目名称" + set /a FAIL_COUNT+=1 +) + +del response.json +exit /b 0 + +REM 测试场景3:查询项目列表 +:test_query_project_list +call :log_info "==========================================" +call :log_info "测试场景3:查询项目列表" +call :log_info "==========================================" + +curl -s -X GET "%BASE_URL%/ccdi/project/list?pageNum=1&pageSize=10" ^ + -H "Authorization: Bearer %TOKEN%" > response.json + +REM 检查是否成功 +findstr /c:"code":200 response.json >nul +if %ERRORLEVEL% equ 0 ( + call :log_info "✓ 查询项目列表成功" + + REM 检查lsfxProjectId + findstr /c:"lsfxProjectId" response.json >nul + if %ERRORLEVEL% equ 0 ( + call :log_info "✓ 项目列表包含 lsfxProjectId 字段" + ) else ( + call :log_warning "! 项目列表可能缺少 lsfxProjectId 字段" + ) + set /a PASS_COUNT+=1 +) else ( + call :log_error "✗ 查询项目列表失败" + set /a FAIL_COUNT+=1 +) + +del response.json +exit /b 0 + +REM 主函数 +:main +call :log_info "==========================================" +call :log_info "开始执行项目创建功能测试" +call :log_info "==========================================" + +REM 检查curl +call :check_curl || exit /b 1 + +REM 检查后端服务 +call :check_backend_service || exit /b 1 + +REM 获取令牌 +call :get_token || exit /b 1 + +REM 执行测试 +call :test_create_project_success +call :test_create_project_empty_name +call :test_query_project_list + +REM 输出测试结果 +call :log_info "==========================================" +call :log_info "测试结果汇总" +call :log_info "==========================================" +call :log_info "通过: %PASS_COUNT%" +call :log_error "失败: %FAIL_COUNT%" +call :log_info "总计: %PASS_COUNT%" + +if %FAIL_COUNT% equ 0 ( + call :log_info "✓ 所有测试通过!" + exit /b 0 +) else ( + call :log_error "✗ 存在失败的测试" + exit /b 1 +) diff --git a/docs/test-scripts/test-project-creation.ps1 b/docs/test-scripts/test-project-creation.ps1 new file mode 100644 index 0000000..0982119 --- /dev/null +++ b/docs/test-scripts/test-project-creation.ps1 @@ -0,0 +1,300 @@ +# ==================================== +# 项目创建功能测试脚本 (PowerShell版本) +# 功能:测试创建项目时集成流水分析平台 +# 作者:Claude Code +# 日期:2026-03-04 +# ==================================== + +# 配置 +$BaseUrl = "http://localhost:8080" +$Username = "admin" +$Password = "admin123" +$Token = $null + +# 计数器 +$PassCount = 0 +$FailCount = 0 + +# 日志函数 +function Write-LogInfo { + param([string]$Message) + Write-Host "[INFO] " -ForegroundColor Green -NoNewline + Write-Host $Message +} + +function Write-LogError { + param([string]$Message) + Write-Host "[ERROR] " -ForegroundColor Red -NoNewline + Write-Host $Message +} + +function Write-LogWarning { + param([string]$Message) + Write-Host "[WARNING] " -ForegroundColor Yellow -NoNewline + Write-Host $Message +} + +# 检查后端服务 +function Test-BackendService { + Write-LogInfo "检查后端服务状态..." + try { + $response = Invoke-WebRequest -Uri "$BaseUrl/actuator/health" -TimeoutSec 5 -ErrorAction Stop + Write-LogInfo "✓ 后端服务运行正常" + return $true + } catch { + Write-LogError "✗ 后端服务未运行,请先启动后端服务" + Write-LogInfo "启动命令: cd ruoyi-admin; mvn spring-boot:run" + return $false + } +} + +# 获取访问令牌 +function Get-AccessToken { + Write-LogInfo "获取访问令牌..." + try { + $response = Invoke-RestMethod -Uri "$BaseUrl/login/test?username=$Username&password=$Password" -Method POST + + if ($response.code -eq 200 -and $response.token) { + $script:Token = $response.token + Write-LogInfo "✓ 成功获取令牌" + return $true + } else { + Write-LogError "获取令牌失败:响应格式不正确" + Write-LogInfo "响应内容: $($response | ConvertTo-Json)" + return $false + } + } catch { + Write-LogError "获取令牌失败: $($_.Exception.Message)" + return $false + } +} + +# 测试场景1:创建项目成功 +function Test-CreateProjectSuccess { + Write-LogInfo "==========================================" + Write-LogInfo "测试场景1:创建项目成功" + Write-LogInfo "==========================================" + + $timestamp = Get-Date -Format "yyyyMMdd_HHmmss" + $projectName = "集成测试项目_$timestamp" + + $requestData = @{ + projectName = $projectName + description = "测试集成流水分析平台" + configType = "default" + } | ConvertTo-Json + + Write-LogInfo "请求数据: $requestData" + + try { + $headers = @{ + "Content-Type" = "application/json" + "Authorization" = "Bearer $Token" + } + + $response = Invoke-RestMethod -Uri "$BaseUrl/ccdi/project" -Method POST -Headers $headers -Body $requestData + + Write-LogInfo "响应内容: $($response | ConvertTo-Json -Depth 5)" + + if ($response.code -eq 200) { + Write-LogInfo "✓ 项目创建成功" + + if ($response.data.lsfxProjectId) { + Write-LogInfo "✓ 流水分析平台项目ID: $($response.data.lsfxProjectId)" + $script:PassCount++ + return $true + } else { + Write-LogError "✗ 流水分析平台项目ID为空" + $script:FailCount++ + return $false + } + } else { + Write-LogError "✗ 项目创建失败: $($response.msg)" + $script:FailCount++ + return $false + } + } catch { + Write-LogError "请求失败: $($_.Exception.Message)" + $script:FailCount++ + return $false + } +} + +# 测试场景2:创建项目失败(项目名称为空) +function Test-CreateProjectEmptyName { + Write-LogInfo "==========================================" + Write-LogInfo "测试场景2:创建项目失败(项目名称为空)" + Write-LogInfo "==========================================" + + $requestData = @{ + projectName = "" + description = "测试异常场景" + configType = "default" + } | ConvertTo-Json + + Write-LogInfo "请求数据: $requestData" + + try { + $headers = @{ + "Content-Type" = "application/json" + "Authorization" = "Bearer $Token" + } + + $response = Invoke-RestMethod -Uri "$BaseUrl/ccdi/project" -Method POST -Headers $headers -Body $requestData + + if ($response.code -ne 200) { + Write-LogInfo "✓ 正确拒绝了空项目名称" + $script:PassCount++ + return $true + } else { + Write-LogError "✗ 未正确验证项目名称" + $script:FailCount++ + return $false + } + } catch { + Write-LogInfo "✓ 正确拒绝了空项目名称(请求失败)" + $script:PassCount++ + return $true + } +} + +# 测试场景3:查询项目列表 +function Test-QueryProjectList { + Write-LogInfo "==========================================" + Write-LogInfo "测试场景3:查询项目列表" + Write-LogInfo "==========================================" + + try { + $headers = @{ + "Authorization" = "Bearer $Token" + } + + $response = Invoke-RestMethod -Uri "$BaseUrl/ccdi/project/list?pageNum=1&pageSize=10" -Method GET -Headers $headers + + Write-LogInfo "响应内容(前500字符): $($response | ConvertTo-Json -Depth 3 | Select-Object -First 500)" + + if ($response.code -eq 200) { + Write-LogInfo "✓ 查询项目列表成功" + + if ($response.rows -and $response.rows[0].lsfxProjectId) { + Write-LogInfo "✓ 项目列表包含 lsfxProjectId 字段" + } else { + Write-LogWarning "! 项目列表可能缺少 lsfxProjectId 字段" + } + $script:PassCount++ + return $true + } else { + Write-LogError "✗ 查询项目列表失败" + $script:FailCount++ + return $false + } + } catch { + Write-LogError "请求失败: $($_.Exception.Message)" + $script:FailCount++ + return $false + } +} + +# 测试场景4:流水分析平台不可用 +function Test-LsfxUnavailable { + Write-LogInfo "==========================================" + Write-LogInfo "测试场景4:流水分析平台不可用" + Write-LogInfo "==========================================" + Write-LogWarning "注意:此测试需要停止 Mock Server" + Write-LogInfo "请手动停止 lsfx-mock-server 并重新运行此测试" + + $confirm = Read-Host "是否已停止 Mock Server?(y/n)" + if ($confirm -ne "y") { + Write-LogInfo "跳过此测试" + return + } + + $timestamp = Get-Date -Format "yyyyMMdd_HHmmss" + $projectName = "异常测试项目_$timestamp" + + $requestData = @{ + projectName = $projectName + description = "测试流水分析平台不可用" + configType = "default" + } | ConvertTo-Json + + Write-LogInfo "请求数据: $requestData" + + try { + $headers = @{ + "Content-Type" = "application/json" + "Authorization" = "Bearer $Token" + } + + $response = Invoke-RestMethod -Uri "$BaseUrl/ccdi/project" -Method POST -Headers $headers -Body $requestData + + if ($response.code -eq 500) { + Write-LogInfo "✓ 正确处理了流水分析平台不可用的情况" + Write-LogInfo "错误信息: $($response.msg)" + + # 注意:PowerShell版本无法直接验证数据库,需要MySQL工具 + Write-LogWarning "请手动验证数据库无脏数据" + + $script:PassCount++ + return $true + } else { + Write-LogError "✗ 未正确处理异常情况" + $script:FailCount++ + return $false + } + } catch { + Write-LogError "请求失败: $($_.Exception.Message)" + $script:FailCount++ + return $false + } +} + +# 主函数 +function Main { + Write-LogInfo "==========================================" + Write-LogInfo "开始执行项目创建功能测试" + Write-LogInfo "==========================================" + + # 检查后端服务 + if (-not (Test-BackendService)) { + exit 1 + } + + # 获取令牌 + if (-not (Get-AccessToken)) { + exit 1 + } + + # 执行测试 + Test-CreateProjectSuccess + Test-CreateProjectEmptyName + Test-QueryProjectList + + # 可选测试 + Write-LogInfo "==========================================" + Write-LogInfo "可选测试:流水分析平台不可用场景" + Write-LogInfo "==========================================" + $runUnavailableTest = Read-Host "是否执行流水分析平台不可用测试?(y/n)" + if ($runUnavailableTest -eq "y") { + Test-LsfxUnavailable + } + + # 输出测试结果 + Write-LogInfo "==========================================" + Write-LogInfo "测试结果汇总" + Write-LogInfo "==========================================" + Write-LogInfo "通过: $PassCount" + Write-LogError "失败: $FailCount" + Write-LogInfo "总计: $($PassCount + $FailCount)" + + if ($FailCount -eq 0) { + Write-LogInfo "✓ 所有测试通过!" + exit 0 + } else { + Write-LogError "✗ 存在失败的测试" + exit 1 + } +} + +# 执行主函数 +Main diff --git a/docs/test-scripts/test-project-creation.sh b/docs/test-scripts/test-project-creation.sh new file mode 100644 index 0000000..e1ea5d6 --- /dev/null +++ b/docs/test-scripts/test-project-creation.sh @@ -0,0 +1,335 @@ +#!/bin/bash + +# ==================================== +# 项目创建功能测试脚本 +# 功能:测试创建项目时集成流水分析平台 +# 作者:Claude Code +# 日期:2026-03-04 +# ==================================== + +# 配置 +BASE_URL="http://localhost:8080" +USERNAME="admin" +PASSWORD="admin123" + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 日志函数 +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +# 检查命令是否存在 +check_command() { + if ! command -v $1 &> /dev/null; then + log_error "$1 未安装,请先安装 $1" + exit 1 + fi +} + +# 检查后端服务是否运行 +check_backend_service() { + log_info "检查后端服务状态..." + if curl -s --connect-timeout 5 "$BASE_URL/actuator/health" > /dev/null 2>&1; then + log_info "✓ 后端服务运行正常" + return 0 + else + log_error "✗ 后端服务未运行,请先启动后端服务" + log_info "启动命令: cd ruoyi-admin && mvn spring-boot:run" + return 1 + fi +} + +# 获取访问令牌 +get_token() { + log_info "获取访问令牌..." + TOKEN_RESPONSE=$(curl -s -X POST "$BASE_URL/login/test?username=$USERNAME&password=$PASSWORD") + + # 检查响应是否为空 + if [ -z "$TOKEN_RESPONSE" ]; then + log_error "获取令牌失败:响应为空" + return 1 + fi + + # 提取 token(假设返回格式为 {"code":200,"msg":"操作成功","data":"token"}) + TOKEN=$(echo "$TOKEN_RESPONSE" | grep -o '"token":"[^"]*"' | sed 's/"token":"//;s/"//') + + if [ -z "$TOKEN" ]; then + log_error "获取令牌失败:无法从响应中提取 token" + log_info "响应内容: $TOKEN_RESPONSE" + return 1 + fi + + log_info "✓ 成功获取令牌" + return 0 +} + +# 测试场景1:创建项目成功 +test_create_project_success() { + log_info "==========================================" + log_info "测试场景1:创建项目成功" + log_info "==========================================" + + # 准备测试数据 + PROJECT_NAME="集成测试项目_$(date +%Y%m%d_%H%M%S)" + REQUEST_DATA=$(cat </dev/null) + + if [ "$DB_CHECK" == "1" ]; then + log_info "✓ 数据库验证通过:lsfx_project_id 已正确保存" + else + log_error "✗ 数据库验证失败:lsfx_project_id 未保存" + return 1 + fi + + return 0 + else + log_error "✗ 项目创建失败: $MSG" + return 1 + fi +} + +# 测试场景2:创建项目失败(项目名称为空) +test_create_project_empty_name() { + log_info "==========================================" + log_info "测试场景2:创建项目失败(项目名称为空)" + log_info "==========================================" + + REQUEST_DATA=$(cat </dev/null) + + if [ "$DB_CHECK" == "0" ]; then + log_info "✓ 事务已回滚,数据库无脏数据" + else + log_error "✗ 事务未回滚,存在脏数据" + return 1 + fi + + return 0 + else + log_error "✗ 未正确处理异常情况" + return 1 + fi +} + +# 测试场景4:查询项目列表 +test_query_project_list() { + log_info "==========================================" + log_info "测试场景4:查询项目列表" + log_info "==========================================" + + RESPONSE=$(curl -s -X GET "$BASE_URL/ccdi/project/list?pageNum=1&pageSize=10" \ + -H "Authorization: Bearer $TOKEN") + + log_info "响应内容(前500字符): ${RESPONSE:0:500}" + + CODE=$(echo "$RESPONSE" | grep -o '"code":[0-9]*' | sed 's/"code"://') + + if [ "$CODE" == "200" ]; then + log_info "✓ 查询项目列表成功" + + # 检查是否包含 lsfxProjectId + if echo "$RESPONSE" | grep -q "lsfxProjectId"; then + log_info "✓ 项目列表包含 lsfxProjectId 字段" + else + log_warning "! 项目列表可能缺少 lsfxProjectId 字段" + fi + + return 0 + else + log_error "✗ 查询项目列表失败" + return 1 + fi +} + +# 主测试流程 +main() { + log_info "==========================================" + log_info "开始执行项目创建功能测试" + log_info "==========================================" + + # 检查依赖 + check_command curl + check_command mysql + + # 检查后端服务 + check_backend_service || exit 1 + + # 获取令牌 + get_token || exit 1 + + # 执行测试 + PASS_COUNT=0 + FAIL_COUNT=0 + + if test_create_project_success; then + ((PASS_COUNT++)) + else + ((FAIL_COUNT++)) + fi + + if test_create_project_empty_name; then + ((PASS_COUNT++)) + else + ((FAIL_COUNT++)) + fi + + if test_query_project_list; then + ((PASS_COUNT++)) + else + ((FAIL_COUNT++)) + fi + + # 可选测试 + log_info "==========================================" + log_info "可选测试:流水分析平台不可用场景" + log_info "==========================================" + read -p "是否执行流水分析平台不可用测试?(y/n): " run_unavailable_test + if [ "$run_unavailable_test" == "y" ]; then + if test_lsfx_unavailable; then + ((PASS_COUNT++)) + else + ((FAIL_COUNT++)) + fi + fi + + # 输出测试结果 + log_info "==========================================" + log_info "测试结果汇总" + log_info "==========================================" + log_info "通过: $PASS_COUNT" + log_info "失败: $FAIL_COUNT" + log_info "总计: $((PASS_COUNT + FAIL_COUNT))" + + if [ $FAIL_COUNT -eq 0 ]; then + log_info "✓ 所有测试通过!" + exit 0 + else + log_error "✗ 存在失败的测试" + exit 1 + fi +} + +# 执行主函数 +main