308 lines
7.7 KiB
Bash
308 lines
7.7 KiB
Bash
#!/bin/bash
|
|
|
|
# 利率定价流程 API 完整测试脚本 (修复编码问题)
|
|
# 自动登录获取 token 并执行所有测试用例
|
|
|
|
BASE_URL="http://localhost:8080"
|
|
TOKEN=""
|
|
|
|
# 颜色定义
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 测试结果统计
|
|
TOTAL_TESTS=0
|
|
PASSED_TESTS=0
|
|
FAILED_TESTS=0
|
|
|
|
# 测试结果记录
|
|
declare -a TEST_RESULTS
|
|
|
|
echo -e "${BLUE}====================================${NC}"
|
|
echo -e "${BLUE} 利率定价流程 API 测试套件${NC}"
|
|
echo -e "${BLUE}====================================${NC}"
|
|
echo ""
|
|
|
|
# 步骤 1: 获取 Token
|
|
echo -e "${YELLOW}[步骤 1] 获取测试 Token${NC}"
|
|
echo "-----------------------------------"
|
|
LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/login/test" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"username":"admin","password":"admin123"}')
|
|
|
|
# 解析 token
|
|
TOKEN=$(echo "$LOGIN_RESPONSE" | grep -o '"token":"[^"]*"' | cut -d'"' -f4)
|
|
|
|
if [ -z "$TOKEN" ]; then
|
|
echo -e "${RED}✗ 登录失败,无法获取 token${NC}"
|
|
echo "响应: $LOGIN_RESPONSE"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}✓ 登录成功${NC}"
|
|
echo "Token: ${TOKEN:0:50}..."
|
|
echo ""
|
|
|
|
# 测试函数
|
|
test_api() {
|
|
local method=$1
|
|
local url=$2
|
|
local data=$3
|
|
local description=$4
|
|
local expected_code=${5:-200}
|
|
|
|
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
|
echo -n "[$TOTAL_TESTS] 测试: $description ... "
|
|
|
|
if [ "$method" = "GET" ]; then
|
|
response=$(curl -s -X GET "$BASE_URL$url" \
|
|
-H "Authorization: Bearer $TOKEN" \
|
|
-H "Content-Type: application/json")
|
|
else
|
|
# 使用 --data-urlencode 或直接从文件读取来避免编码问题
|
|
response=$(curl -s -X "$method" "$BASE_URL$url" \
|
|
-H "Authorization: Bearer $TOKEN" \
|
|
-H "Content-Type: application/json; charset=utf-8" \
|
|
--data-raw "$data")
|
|
fi
|
|
|
|
# 检查响应
|
|
actual_code=$(echo "$response" | grep -o '"code":[0-9]*' | cut -d':' -f2)
|
|
|
|
if [ "$actual_code" = "$expected_code" ]; then
|
|
echo -e "${GREEN}✓ 通过${NC}"
|
|
PASSED_TESTS=$((PASSED_TESTS + 1))
|
|
TEST_RESULTS+=("✓ $description")
|
|
else
|
|
echo -e "${RED}✗ 失败 (期望: $expected_code, 实际: $actual_code)${NC}"
|
|
FAILED_TESTS=$((FAILED_TESTS + 1))
|
|
TEST_RESULTS+=("✗ $description - 期望码: $expected_code, 实际: $actual_code")
|
|
echo " 响应: $response"
|
|
fi
|
|
}
|
|
|
|
# 步骤 2: 执行测试用例
|
|
echo -e "${YELLOW}[步骤 2] 执行测试用例${NC}"
|
|
echo "-----------------------------------"
|
|
echo ""
|
|
|
|
# ====== 功能测试 ======
|
|
echo -e "${BLUE}【功能测试】${NC}"
|
|
|
|
# 测试 1: 发起利率定价流程 - 个人客户信用贷款
|
|
# 使用 printf 来确保 UTF-8 编码
|
|
JSON_DATA_1=$(cat << 'EOF'
|
|
{
|
|
"orgCode": "931000",
|
|
"runType": "1",
|
|
"custIsn": "CUST20250119001",
|
|
"custType": "个人",
|
|
"guarType": "信用",
|
|
"midPerQuickPay": "true",
|
|
"midPerEleDdc": "false",
|
|
"midEntEleDdc": "false",
|
|
"midEntWaterDdc": "false",
|
|
"applyAmt": "50000",
|
|
"isCleanEnt": "false",
|
|
"hasSettleAcct": "true",
|
|
"isManufacturing": "false",
|
|
"isAgriGuar": "false",
|
|
"isTaxA": "false",
|
|
"isAgriLeading": "false",
|
|
"loanPurpose": "consumer",
|
|
"bizProof": "true",
|
|
"collType": "一类",
|
|
"collThirdParty": "false",
|
|
"loanRate": "4.35",
|
|
"custName": "张三",
|
|
"idType": "身份证",
|
|
"isInclusiveFinance": "true"
|
|
}
|
|
EOF
|
|
)
|
|
|
|
test_api "POST" "/loanPricing/workflow/create" "$JSON_DATA_1" "发起流程-个人客户信用贷款"
|
|
|
|
# 测试 2: 发起利率定价流程 - 企业客户抵押贷款
|
|
JSON_DATA_2=$(cat << 'EOF'
|
|
{
|
|
"orgCode": "931000",
|
|
"runType": "1",
|
|
"custIsn": "CUST20250119002",
|
|
"custType": "企业",
|
|
"guarType": "抵押",
|
|
"applyAmt": "500000",
|
|
"isCleanEnt": "true",
|
|
"hasSettleAcct": "true",
|
|
"isManufacturing": "true",
|
|
"isTaxA": "true",
|
|
"loanPurpose": "business",
|
|
"collType": "一线",
|
|
"collThirdParty": "false",
|
|
"loanRate": "3.85",
|
|
"custName": "测试科技有限公司",
|
|
"idType": "统一社会信用代码",
|
|
"isInclusiveFinance": "true"
|
|
}
|
|
EOF
|
|
)
|
|
|
|
test_api "POST" "/loanPricing/workflow/create" "$JSON_DATA_2" "发起流程-企业客户抵押贷款"
|
|
|
|
# 测试 3: 发起利率定价流程 - 农业担保贷款
|
|
JSON_DATA_3=$(cat << 'EOF'
|
|
{
|
|
"orgCode": "931000",
|
|
"runType": "1",
|
|
"custIsn": "CUST20250119003",
|
|
"custType": "企业",
|
|
"guarType": "保证",
|
|
"applyAmt": "300000",
|
|
"isAgriGuar": "true",
|
|
"isAgriLeading": "true",
|
|
"loanPurpose": "business",
|
|
"loanRate": "4.15",
|
|
"custName": "绿源农业合作社",
|
|
"idType": "统一社会信用代码",
|
|
"isInclusiveFinance": "true"
|
|
}
|
|
EOF
|
|
)
|
|
|
|
test_api "POST" "/loanPricing/workflow/create" "$JSON_DATA_3" "发起流程-农业担保贷款"
|
|
|
|
# 测试 4: 发起利率定价流程 - 质押贷款
|
|
JSON_DATA_4=$(cat << 'EOF'
|
|
{
|
|
"orgCode": "931000",
|
|
"runType": "1",
|
|
"custIsn": "CUST20250119004",
|
|
"custType": "个人",
|
|
"guarType": "质押",
|
|
"applyAmt": "100000",
|
|
"loanPurpose": "consumer",
|
|
"collType": "二类",
|
|
"loanRate": "4.25",
|
|
"custName": "李四",
|
|
"idType": "身份证",
|
|
"isInclusiveFinance": "false"
|
|
}
|
|
EOF
|
|
)
|
|
|
|
test_api "POST" "/loanPricing/workflow/create" "$JSON_DATA_4" "发起流程-个人客户质押贷款"
|
|
|
|
# 测试 5: 查询流程列表 - 默认分页
|
|
test_api "GET" "/loanPricing/workflow/list?pageNum=1&pageSize=10" "" "查询流程列表-默认分页"
|
|
|
|
# ====== 异常测试 ======
|
|
echo ""
|
|
echo -e "${BLUE}【异常测试】${NC}"
|
|
|
|
# 测试 11: 必填字段缺失 - 客户内码为空
|
|
JSON_DATA_ERR1=$(cat << 'EOF'
|
|
{
|
|
"custType": "个人",
|
|
"guarType": "信用",
|
|
"applyAmt": "50000",
|
|
"loanRate": "4.35"
|
|
}
|
|
EOF
|
|
)
|
|
|
|
test_api "POST" "/loanPricing/workflow/create" "$JSON_DATA_ERR1" "异常测试-客户内码为空" 500
|
|
|
|
# 测试 12: 必填字段缺失 - 贷款利率为空
|
|
JSON_DATA_ERR2=$(cat << 'EOF'
|
|
{
|
|
"custIsn": "TEST001",
|
|
"custType": "个人",
|
|
"guarType": "信用",
|
|
"applyAmt": "50000"
|
|
}
|
|
EOF
|
|
)
|
|
|
|
test_api "POST" "/loanPricing/workflow/create" "$JSON_DATA_ERR2" "异常测试-贷款利率为空" 500
|
|
|
|
# 测试 13: 查询不存在的流程
|
|
test_api "GET" "/loanPricing/workflow/NOTEXIST123" "" "异常测试-查询不存在的流程" 500
|
|
|
|
# 步骤 3: 生成测试报告
|
|
echo ""
|
|
echo -e "${YELLOW}[步骤 3] 测试结果统计${NC}"
|
|
echo "-----------------------------------"
|
|
echo ""
|
|
|
|
# 计算通过率
|
|
if [ $TOTAL_TESTS -gt 0 ]; then
|
|
PASS_RATE=$((PASSED_TESTS * 100 / TOTAL_TESTS))
|
|
else
|
|
PASS_RATE=0
|
|
fi
|
|
|
|
echo "总测试数: $TOTAL_TESTS"
|
|
echo -e "通过: ${GREEN}$PASSED_TESTS${NC}"
|
|
echo -e "失败: ${RED}$FAILED_TESTS${NC}"
|
|
echo "通过率: $PASS_RATE%"
|
|
echo ""
|
|
|
|
# 详细结果
|
|
echo "详细测试结果:"
|
|
echo "-----------------------------------"
|
|
for result in "${TEST_RESULTS[@]}"; do
|
|
if [[ $result == ✓* ]]; then
|
|
echo -e "${GREEN}$result${NC}"
|
|
else
|
|
echo -e "${RED}$result${NC}"
|
|
fi
|
|
done
|
|
echo ""
|
|
|
|
# 生成测试报告文件
|
|
REPORT_FILE="api-test-report-$(date +%Y%m%d%H%M%S).txt"
|
|
echo "生成测试报告: $REPORT_FILE"
|
|
|
|
cat > "$REPORT_FILE" << EOF
|
|
利率定价流程 API 测试报告
|
|
====================================
|
|
|
|
测试时间: $(date '+%Y-%m-%d %H:%M:%S')
|
|
测试环境: $BASE_URL
|
|
测试账号: admin
|
|
|
|
测试统计
|
|
--------
|
|
总测试数: $TOTAL_TESTS
|
|
通过数: $PASSED_TESTS
|
|
失败数: $FAILED_TESTS
|
|
通过率: $PASS_RATE%
|
|
|
|
测试用例详情
|
|
--------
|
|
EOF
|
|
|
|
for result in "${TEST_RESULTS[@]}"; do
|
|
echo "$result" >> "$REPORT_FILE"
|
|
done
|
|
|
|
echo "" >> "$REPORT_FILE"
|
|
echo "====================================" >> "$REPORT_FILE"
|
|
echo "测试结束" >> "$REPORT_FILE"
|
|
|
|
echo ""
|
|
echo -e "${BLUE}====================================${NC}"
|
|
echo -e "${BLUE} 测试完成${NC}"
|
|
echo -e "${BLUE}====================================${NC}"
|
|
echo "测试报告已保存到: $REPORT_FILE"
|
|
|
|
# 返回退出码
|
|
if [ $FAILED_TESTS -gt 0 ]; then
|
|
exit 1
|
|
else
|
|
exit 0
|
|
fi
|