Files
ccdi/docs/test-scripts/test-project-creation.sh
wkc 206754adb4 test: 添加项目创建功能测试脚本和文档
- 添加 Bash 测试脚本 (test-project-creation.sh)
- 添加 PowerShell 测试脚本 (test-project-creation.ps1)
- 添加批处理测试脚本 (test-project-creation.bat)
- 添加测试说明文档 (README.md)
- 支持4个测试场景:成功、参数校验、查询列表、异常处理
- 包含数据库验证和事务回滚验证
2026-03-04 11:04:16 +08:00

336 lines
9.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 <<EOF
{
"projectName": "$PROJECT_NAME",
"description": "测试集成流水分析平台",
"configType": "default"
}
EOF
)
log_info "请求数据: $REQUEST_DATA"
# 发送请求
RESPONSE=$(curl -s -X POST "$BASE_URL/ccdi/project" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d "$REQUEST_DATA")
log_info "响应内容: $RESPONSE"
# 验证响应
CODE=$(echo "$RESPONSE" | grep -o '"code":[0-9]*' | sed 's/"code"://')
MSG=$(echo "$RESPONSE" | grep -o '"msg":"[^"]*"' | sed 's/"msg":"//;s/"//')
if [ "$CODE" == "200" ]; then
log_info "✓ 项目创建成功"
# 验证 lsfxProjectId 是否存在
LSFX_PROJECT_ID=$(echo "$RESPONSE" | grep -o '"lsfxProjectId":[0-9]*' | sed 's/"lsfxProjectId"://')
if [ -n "$LSFX_PROJECT_ID" ]; then
log_info "✓ 流水分析平台项目ID: $LSFX_PROJECT_ID"
else
log_error "✗ 流水分析平台项目ID为空"
return 1
fi
# 验证数据库
log_info "验证数据库..."
DB_CHECK=$(mysql -h 116.62.17.81 -u root -pKfcx@1234 ccdi -N -B -e \
"SELECT COUNT(*) FROM ccdi_project WHERE project_name='$PROJECT_NAME' AND lsfx_project_id IS NOT NULL;" 2>/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 <<EOF
{
"projectName": "",
"description": "测试异常场景",
"configType": "default"
}
EOF
)
log_info "请求数据: $REQUEST_DATA"
RESPONSE=$(curl -s -X POST "$BASE_URL/ccdi/project" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d "$REQUEST_DATA")
log_info "响应内容: $RESPONSE"
CODE=$(echo "$RESPONSE" | grep -o '"code":[0-9]*' | sed 's/"code"://')
if [ "$CODE" != "200" ]; then
log_info "✓ 正确拒绝了空项目名称"
return 0
else
log_error "✗ 未正确验证项目名称"
return 1
fi
}
# 测试场景3流水分析平台不可用
test_lsfx_unavailable() {
log_info "=========================================="
log_info "测试场景3流水分析平台不可用"
log_info "=========================================="
log_warning "注意:此测试需要停止 Mock Server"
log_info "请手动停止 lsfx-mock-server 并重新运行此测试"
log_info "提示:在 lsfx-mock-server 目录按 Ctrl+C 停止"
# 询问用户是否继续
read -p "是否已停止 Mock Server(y/n): " confirm
if [ "$confirm" != "y" ]; then
log_info "跳过此测试"
return 0
fi
REQUEST_DATA=$(cat <<EOF
{
"projectName": "异常测试项目_$(date +%Y%m%d_%H%M%S)",
"description": "测试流水分析平台不可用",
"configType": "default"
}
EOF
)
log_info "请求数据: $REQUEST_DATA"
RESPONSE=$(curl -s -X POST "$BASE_URL/ccdi/project" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d "$REQUEST_DATA")
log_info "响应内容: $RESPONSE"
CODE=$(echo "$RESPONSE" | grep -o '"code":[0-9]*' | sed 's/"code"://')
MSG=$(echo "$RESPONSE" | grep -o '"msg":"[^"]*"' | sed 's/"msg":"//;s/"//')
if [ "$CODE" == "500" ]; then
log_info "✓ 正确处理了流水分析平台不可用的情况"
log_info "错误信息: $MSG"
# 验证数据库没有脏数据
PROJECT_NAME=$(echo "$REQUEST_DATA" | grep -o '"projectName":"[^"]*"' | sed 's/"projectName":"//;s/"//')
DB_CHECK=$(mysql -h 116.62.17.81 -u root -pKfcx@1234 ccdi -N -B -e \
"SELECT COUNT(*) FROM ccdi_project WHERE project_name='$PROJECT_NAME';" 2>/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