36 KiB
36 KiB
中介黑名单双表迁移测试验证计划
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
目标: 验证中介黑名单从单表迁移到双表(个人中介→ccdi_biz_intermediary,实体中介→ccdi_enterprise_base_info)后的所有接口功能正确性
架构: 使用 curl 脚本进行 HTTP API 测试,验证数据库表数据正确性,自动生成测试报告
技术栈:
- HTTP 测试工具:curl(命令行)
- 数据库验证:MySQL 命令行
- 报告生成:Bash 脚本
- 后端框架:Spring Boot 3.5.8 + MyBatis Plus 3.5.10
- 数据库:MySQL 8.2.0
测试环境准备
Task 1: 创建测试工具脚本
Files:
- Create:
doc/test/scripts/test_utils.sh - Create:
doc/test/scripts/test_report.sh
Step 1: 创建测试工具函数库
# file: doc/test/scripts/test_utils.sh
#!/bin/bash
# ============================================================
# 测试工具函数库
# ============================================================
# 配置
BASE_URL="http://localhost:8080"
LOGIN_URL="${BASE_URL}/login"
TOKEN=""
OUTPUT_DIR="doc/test/output"
REPORT_FILE="${OUTPUT_DIR}/test_report.md"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 初始化输出目录
init_output() {
mkdir -p "${OUTPUT_DIR}"
echo "# 中介黑名单双表迁移测试报告" > "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
echo "**测试时间:** $(date '+%Y-%m-%d %H:%M:%S')" >> "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
echo "---" >> "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
}
# 登录获取 token
login() {
echo -e "${YELLOW}正在登录...${NC}"
response=$(curl -s -X POST "${LOGIN_URL}" \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "admin123"
}')
TOKEN=$(echo "${response}" | grep -o '"token":"[^"]*"' | cut -d'"' -f4)
if [ -z "${TOKEN}" ]; then
echo -e "${RED}登录失败${NC}"
echo "响应: ${response}"
exit 1
fi
echo -e "${GREEN}登录成功,Token: ${TOKEN:0:20}...${NC}"
echo "" >> "${REPORT_FILE}"
echo "## 1. 登录验证" >> "${REPORT_FILE}"
echo "- 状态: ✅ 成功" >> "${REPORT_FILE}"
echo "- Token: \`${TOKEN:0:20}...\`" >> "${REPORT_FILE}"
}
# 通用 HTTP 请求函数
http_request() {
local method=$1
local url=$2
local data=$3
local description=$4
echo -e "${YELLOW}测试: ${description}${NC}"
if [ "${method}" = "GET" ]; then
response=$(curl -s -X GET "${BASE_URL}${url}" \
-H "Authorization: Bearer ${TOKEN}")
else
response=$(curl -s -X "${method}" "${BASE_URL}${url}" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d "${data}")
fi
# 保存响应
echo "${response}" | jq '.' > "${OUTPUT_DIR}/temp_response.json" 2>/dev/null || echo "${response}" > "${OUTPUT_DIR}/temp_response.json"
# 检查是否成功
code=$(echo "${response}" | grep -o '"code":[0-9]*' | cut -d':' -f2)
if [ "${code}" = "200" ]; then
echo -e "${GREEN}✓ 通过${NC}"
echo "响应: $(echo ${response} | jq -c '.msg' 2>/dev/null || echo ${response})"
return 0
else
echo -e "${RED}✗ 失败${NC}"
echo "响应: ${response}"
return 1
fi
}
# 断言响应包含特定字段
assert_field() {
local field=$1
local expected=$2
local response_file="${OUTPUT_DIR}/temp_response.json"
actual=$(jq -r ".${field}" "${response_file}" 2>/dev/null)
if [ "${actual}" = "${expected}" ]; then
echo -e "${GREEN} ✓ 字段 ${field} = ${actual}${NC}"
return 0
else
echo -e "${RED} ✗ 字段 ${field}: 期望 ${expected}, 实际 ${actual}${NC}"
return 1
fi
}
# 记录测试结果
log_test_result() {
local test_name=$1
local status=$2
local details=$3
echo "### ${test_name}" >> "${REPORT_FILE}"
echo "- 状态: ${status}" >> "${REPORT_FILE}"
if [ -n "${details}" ]; then
echo "- 详情: ${details}" >> "${REPORT_FILE}"
fi
echo "" >> "${REPORT_FILE}"
}
# 保存 API 响应快照
save_snapshot() {
local test_name=$1
local snapshot_file="${OUTPUT_DIR}/$(echo ${test_name} | tr ' ' '_').json"
cp "${OUTPUT_DIR}/temp_response.json" "${snapshot_file}"
echo "- 响应快照: \`${snapshot_file}\`" >> "${REPORT_FILE}"
}
Step 2: 创建测试报告生成器
# file: doc/test/scripts/test_report.sh
#!/bin/bash
# ============================================================
# 测试报告生成器
# ============================================================
OUTPUT_DIR="doc/test/output"
REPORT_FILE="${OUTPUT_DIR}/test_report.md"
# 生成统计摘要
generate_summary() {
local total=$1
local passed=$2
local failed=$3
echo "" >> "${REPORT_FILE}"
echo "---" >> "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
echo "## 测试统计" >> "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
echo "| 指标 | 数量 |" >> "${REPORT_FILE}"
echo "|------|------|" >> "${REPORT_FILE}"
echo "| 总测试数 | ${total} |" >> "${REPORT_FILE}"
echo "| 通过数 | ${passed} |" >> "${REPORT_FILE}"
echo "| 失败数 | ${failed} |" >> "${REPORT_FILE}"
echo "| 通过率 | $(awk "BEGIN {printf \"%.1f\", ${passed}/${total}*100}")% |" >> "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
# 生成最终状态
if [ ${failed} -eq 0 ]; then
echo "## ✅ 所有测试通过" >> "${REPORT_FILE}"
else
echo "## ❌ 存在失败测试" >> "${REPORT_FILE}"
fi
}
# 生成 HTML 报告
generate_html_report() {
local html_file="${OUTPUT_DIR}/test_report.html"
cat > "${html_file}" << 'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>中介黑名单双表迁移测试报告</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.6; margin: 40px; background: #f5f5f5; }
.container { max-width: 1200px; margin: 0 auto; background: white; padding: 40px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
h1 { color: #2c3e50; border-bottom: 3px solid #3498db; padding-bottom: 10px; }
h2 { color: #34495e; margin-top: 30px; }
table { width: 100%; border-collapse: collapse; margin: 20px 0; }
th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; }
th { background-color: #3498db; color: white; }
tr:hover { background-color: #f5f5f5; }
.pass { color: #27ae60; font-weight: bold; }
.fail { color: #e74c3c; font-weight: bold; }
.status-pass { background-color: #d5f4e6; }
.status-fail { background-color: #fadbd8; }
</style>
</head>
<body>
<div class="container">
<h1>中介黑名单双表迁移测试报告</h1>
<div id="content">
EOF
# 转换 Markdown 为简单 HTML
grep -E '^#{1,3}|^-|^\||^\* ' "${REPORT_FILE}" | sed 's/^### /<h2>/g; s/^## /<h2>/g; s/^# /<h1>/g; s/$/<\/h>/g' >> "${html_file}"
cat >> "${html_file}" << 'EOF'
</div>
</div>
</body>
</html>
EOF
echo "HTML 报告已生成: ${html_file}"
}
Step 3: 设置执行权限
chmod +x doc/test/scripts/test_utils.sh
chmod +x doc/test/scripts/test_report.sh
功能测试用例
Task 2: 测试个人中介 CRUD 操作
Files:
- Create:
doc/test/scripts/test_person_intermediary.sh
Step 1: 编写个人中介测试脚本
# file: doc/test/scripts/test_person_intermediary.sh
#!/bin/bash
# 加载工具函数
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/test_utils.sh"
# 初始化
init_output
login
# 测试计数器
TEST_COUNT=0
PASS_COUNT=0
FAIL_COUNT=0
# ============================================================
# Test 1: 新增个人中介
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 新增个人中介 ===${NC}"
person_data='{
"name": "测试个人中介01",
"certificateNo": "110101199001011234",
"intermediaryType": "1",
"status": "0",
"dataSource": "MANUAL",
"remark": "测试数据",
"indivType": "中介",
"indivSubType": "本人",
"indivGender": "M",
"indivCertType": "身份证",
"indivPhone": "13800138000",
"indivWechat": "test_wx_001",
"indivAddress": "北京市朝阳区测试路123号",
"indivCompany": "测试公司",
"indivPosition": "测试员"
}'
if http_request "POST" "/ccdi/intermediary/person" "${person_data}" "新增个人中介"; then
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 新增个人中介" "✅ 通过" "" "成功"
# 验证响应字段
assert_field "msg" "操作成功"
save_snapshot "01_add_person"
else
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 新增个人中介" "❌ 失败" ""
fi
# ============================================================
# Test 2: 查询个人中介详情
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 查询个人中介详情 ===${NC}"
# 获取新增的中介ID
person_id=$(jq -r '.data // empty' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null)
if [ -n "${person_id}" ] && [ "${person_id}" != "null" ]; then
if http_request "GET" "/ccdi/intermediary/${person_id}" "" "查询个人中介详情"; then
PASS_COUNT=$((PASS_COUNT + 1))
# 验证字段
assert_field "data.indivGender" "M"
assert_field "data.indivCertType" "身份证"
assert_field "data.dataSource" "MANUAL"
log_test_result "Test ${TEST_COUNT}: 查询个人中介详情" "✅ 通过" "返回完整个人信息"
save_snapshot "02_get_person_detail"
else
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 查询个人中介详情" "❌ 失败" ""
fi
else
echo -e "${RED}无法获取中介ID,跳过详情查询${NC}"
fi
# ============================================================
# Test 3: 修改个人中介
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 修改个人中介 ===${NC}"
person_edit_data='{
"bizId": '${person_id}',
"name": "测试个人中介01-已修改",
"certificateNo": "110101199001011234",
"indivPhone": "13900139000",
"remark": "修改后的备注"
}'
if http_request "PUT" "/ccdi/intermediary/person" "${person_edit_data}" "修改个人中介"; then
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 修改个人中介" "✅ 通过" "手机号已更新"
save_snapshot "03_update_person"
else
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 修改个人中介" "❌ 失败" ""
fi
# ============================================================
# Test 4: 验证数据库表数据(个人中介)
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 验证 ccdi_biz_intermediary 表数据 ===${NC}"
db_result=$(echo "SELECT biz_id, name, person_id, gender, mobile, date_source
FROM ccdi_biz_intermediary
WHERE person_id = '110101199001011234';" | mysql -u root -p123456 ccdi_db -N 2>/dev/null)
if [ -n "${db_result}" ]; then
echo -e "${GREEN}✓ 数据库验证通过${NC}"
echo "查询结果: ${db_result}"
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 验证数据库表数据" "✅ 通过" "ccdi_biz_intermediary 表中存在该记录"
else
echo -e "${RED}✗ 数据库验证失败${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 验证数据库表数据" "❌ 失败" "ccdi_biz_intermediary 表中未找到记录"
fi
# 输出统计
echo -e "\n${YELLOW}=== 个人中介测试统计 ===${NC}"
echo "总测试: ${TEST_COUNT}"
echo -e "通过: ${GREEN}${PASS_COUNT}${NC}"
echo -e "失败: ${RED}${FAIL_COUNT}${NC}"
Step 2: 设置执行权限
chmod +x doc/test/scripts/test_person_intermediary.sh
Task 3: 测试实体中介 CRUD 操作
Files:
- Create:
doc/test/scripts/test_entity_intermediary.sh
Step 1: 编写实体中介测试脚本
# file: doc/test/scripts/test_entity_intermediary.sh
#!/bin/bash
# 加载工具函数
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/test_utils.sh"
# 初始化
init_output
login
# 测试计数器
TEST_COUNT=0
PASS_COUNT=0
FAIL_COUNT=0
# ============================================================
# Test 1: 新增实体中介
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 新增实体中介 ===${NC}"
entity_data='{
"name": "测试实体中介有限公司",
"certificateNo": "91110000123456789X",
"intermediaryType": "2",
"status": "0",
"dataSource": "MANUAL",
"remark": "实体中介测试数据",
"corpCreditCode": "91110000123456789X",
"corpType": "有限责任公司",
"corpNature": "民营企业",
"corpIndustryCategory": "制造业",
"corpIndustry": "通用设备制造业",
"corpEstablishDate": "2020-01-01",
"corpAddress": "北京市海淀区测试大街456号",
"corpLegalRep": "李四",
"corpLegalCertType": "身份证",
"corpLegalCertNo": "110101198001011234",
"corpShareholder1": "股东A",
"corpShareholder2": "股东B"
}'
if http_request "POST" "/ccdi/intermediary/entity" "${entity_data}" "新增实体中介"; then
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 新增实体中介" "✅ 通过" ""
save_snapshot "01_add_entity"
# 验证响应
assert_field "msg" "操作成功"
else
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 新增实体中介" "❌ 失败" ""
fi
# ============================================================
# Test 2: 查询实体中介详情
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 查询实体中介详情 ===${NC}"
# 实体中介的主键是统一社会信用代码
entity_id="91110000123456789X"
if http_request "GET" "/ccdi/intermediary/0" "" "查询实体中介详情(使用ID=0)"; then
PASS_COUNT=$((PASS_COUNT + 1))
# 验证字段
assert_field "data.corpCreditCode" "91110000123456789X"
assert_field "data.corpNature" "民营企业"
log_test_result "Test ${TEST_COUNT}: 查询实体中介详情" "✅ 通过" "返回完整实体信息"
save_snapshot "02_get_entity_detail"
else
# 如果ID=0查询失败,尝试通过列表查询验证
echo -e "${YELLOW}尝试通过列表查询验证...${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
# ============================================================
# Test 3: 修改实体中介
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 修改实体中介 ===${NC}"
entity_edit_data='{
"socialCreditCode": "91110000123456789X",
"enterpriseName": "测试实体中介有限公司-已修改",
"corpAddress": "北京市海淀区修改后的地址999号",
"remark": "修改后的实体中介备注"
}'
if http_request "PUT" "/ccdi/intermediary/entity" "${entity_edit_data}" "修改实体中介"; then
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 修改实体中介" "✅ 通过" "地址已更新"
save_snapshot "03_update_entity"
else
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 修改实体中介" "❌ 失败" ""
fi
# ============================================================
# Test 4: 验证数据库表数据(实体中介)
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 验证 ccdi_enterprise_base_info 表数据 ===${NC}"
db_result=$(echo "SELECT social_credit_code, enterprise_name, risk_level, ent_source
FROM ccdi_enterprise_base_info
WHERE social_credit_code = '91110000123456789X'
AND ent_source = 'INTERMEDIARY';" | mysql -u root -p123456 ccdi_db -N 2>/dev/null)
if [ -n "${db_result}" ]; then
# 验证 risk_level 和 ent_source
if echo "${db_result}" | grep -q "1.*INTERMEDIARY"; then
echo -e "${GREEN}✓ 数据库验证通过(risk_level=1, ent_source=INTERMEDIARY)${NC}"
echo "查询结果: ${db_result}"
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 验证数据库表数据" "✅ 通过" "实体中介已正确设置风险等级和来源"
else
echo -e "${RED}✗ risk_level 或 ent_source 不正确${NC}"
echo "查询结果: ${db_result}"
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 验证数据库表数据" "❌ 失败" "risk_level 或 ent_source 值不正确"
fi
else
echo -e "${RED}✗ 数据库验证失败${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 验证数据库表数据" "❌ 失败" "ccdi_enterprise_base_info 表中未找到记录"
fi
# 输出统计
echo -e "\n${YELLOW}=== 实体中介测试统计 ===${NC}"
echo "总测试: ${TEST_COUNT}"
echo -e "通过: ${GREEN}${PASS_COUNT}${NC}"
echo -e "失败: ${RED}${FAIL_COUNT}${NC}"
Step 2: 设置执行权限
chmod +x doc/test/scripts/test_entity_intermediary.sh
Task 4: 测试分页查询和类型过滤
Files:
- Create:
doc/test/scripts/test_list_query.sh
Step 1: 编写列表查询测试脚本
# file: doc/test/scripts/test_list_query.sh
#!/bin/bash
# 加载工具函数
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/test_utils.sh"
# 初始化
init_output
login
# 测试计数器
TEST_COUNT=0
PASS_COUNT=0
FAIL_COUNT=0
# ============================================================
# Test 1: 查询全部中介(UNION查询)
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 查询全部中介列表 ===${NC}"
if http_request "GET" "/ccdi/intermediary/list?pageNum=1&pageSize=10" "" "查询全部中介"; then
PASS_COUNT=$((PASS_COUNT + 1))
# 验证返回数据结构
total=$(jq -r '.total' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null)
rows_count=$(jq -r '.rows | length' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null)
echo "总记录数: ${total}"
echo "当前页记录数: ${rows_count}"
log_test_result "Test ${TEST_COUNT}: 查询全部中介列表" "✅ 通过" "UNION查询成功,共 ${total} 条记录"
save_snapshot "01_list_all"
else
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 查询全部中介列表" "❌ 失败" ""
fi
# ============================================================
# Test 2: 仅查询个人中介
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 仅查询个人中介 ===${NC}"
if http_request "GET" "/ccdi/intermediary/list?pageNum=1&pageSize=10&intermediaryType=1" "" "查询个人中介"; then
PASS_COUNT=$((PASS_COUNT + 1))
# 验证所有返回的中介类型都是"1"(个人)
all_person=$(jq -r '.rows[] | .intermediaryType' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null | grep -c "1" || echo "0")
total_rows=$(jq -r '.rows | length' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null)
if [ "${all_person}" -eq "${total_rows}" ]; then
echo -e "${GREEN}✓ 类型过滤验证通过(全部为个人中介)${NC}"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo -e "${RED}✗ 类型过滤验证失败${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
log_test_result "Test ${TEST_COUNT}: 仅查询个人中介" "✅ 通过" "类型过滤正确"
save_snapshot "02_list_person_only"
else
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 仅查询个人中介" "❌ 失败" ""
fi
# ============================================================
# Test 3: 仅查询实体中介
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 仅查询实体中介 ===${NC}"
if http_request "GET" "/ccdi/intermediary/list?pageNum=1&pageSize=10&intermediaryType=2" "" "查询实体中介"; then
PASS_COUNT=$((PASS_COUNT + 1))
# 验证所有返回的中介类型都是"2"(实体)
all_entity=$(jq -r '.rows[] | .intermediaryType' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null | grep -c "2" || echo "0")
total_rows=$(jq -r '.rows | length' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null)
if [ "${all_entity}" -eq "${total_rows}" ]; then
echo -e "${GREEN}✓ 类型过滤验证通过(全部为实体中介)${NC}"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo -e "${RED}✗ 类型过滤验证失败${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
log_test_result "Test ${TEST_COUNT}: 仅查询实体中介" "✅ 通过" "类型过滤正确"
save_snapshot "03_list_entity_only"
else
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 仅查询实体中介" "❌ 失败" ""
fi
# ============================================================
# Test 4: 测试分页功能
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 测试分页功能 ===${NC}"
# 请求第一页
if http_request "GET" "/ccdi/intermediary/list?pageNum=1&pageSize=5" "" "请求第1页(每页5条)"; then
rows_page1=$(jq -r '.rows | length' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null)
# 请求第二页
if http_request "GET" "/ccdi/intermediary/list?pageNum=2&pageSize=5" "" "请求第2页(每页5条)"; then
rows_page2=$(jq -r '.rows | length' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null)
if [ "${rows_page1}" -le 5 ] && [ "${rows_page2}" -le 5 ]; then
echo -e "${GREEN}✓ 分页验证通过(第1页: ${rows_page1}条, 第2页: ${rows_page2}条)${NC}"
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 测试分页功能" "✅ 通过" "分页正确"
else
echo -e "${RED}✗ 分页验证失败${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 测试分页功能" "❌ 失败" "分页数量不正确"
fi
fi
else
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
# ============================================================
# Test 5: 验证枚举字段只返回代码值
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 验证枚举字段只返回代码值 ===${NC}"
# 检查响应中是否包含枚举名称字段(应该不存在)
has_person_type_name=$(jq -r '.rows[] | has("intermediaryTypeName")' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null | grep -c "true" || echo "0")
has_status_name=$(jq -r '.rows[] | has("statusName")' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null | grep -c "true" || echo "0")
if [ "${has_person_type_name}" -eq 0 ] && [ "${has_status_name}" -eq 0 ]; then
echo -e "${GREEN}✓ 枚举字段验证通过(仅返回代码值)${NC}"
PASS_COUNT=$((PASS_COUNT + 1))
# 显示示例枚举代码值
echo "示例数据:"
jq -r '.rows[0] | {intermediaryType, status, dataSource}' "${OUTPUT_DIR}/temp_response.json" 2>/dev/null || echo "无法解析"
log_test_result "Test ${TEST_COUNT}: 验证枚举字段" "✅ 通过" "后端只返回代码值,无名称字段"
else
echo -e "${RED}✗ 枚举字段验证失败(存在名称字段)${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 验证枚举字段" "❌ 失败" "存在不应有的枚举名称字段"
fi
# 输出统计
echo -e "\n${YELLOW}=== 列表查询测试统计 ===${NC}"
echo "总测试: ${TEST_COUNT}"
echo -e "通过: ${GREEN}${PASS_COUNT}${NC}"
echo -e "失败: ${RED}${FAIL_COUNT}${NC}"
Step 2: 设置执行权限
chmod +x doc/test/scripts/test_list_query.sh
Task 5: 测试批量导入功能
Files:
- Create:
doc/test/scripts/test_import.sh - Create:
doc/test/data/person_import.xlsx - Create:
doc/test/data/entity_import.xlsx
Step 1: 准备测试数据
创建 Excel 文件需要特殊工具,我们改用 CSV 格式或直接使用 API 测试:
# file: doc/test/scripts/test_import.sh
#!/bin/bash
# 加载工具函数
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/test_utils.sh"
# 初始化
init_output
login
# 测试计数器
TEST_COUNT=0
PASS_COUNT=0
FAIL_COUNT=0
# ============================================================
# Test 1: 下载个人中介导入模板
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 下载个人中介导入模板 ===${NC}"
response=$(curl -s -X POST "${BASE_URL}/ccdi/intermediary/importPersonTemplate" \
-H "Authorization: Bearer ${TOKEN}" \
-o "${OUTPUT_DIR}/person_template.xlsx" \
-w "%{http_code}")
if [ "${response}" = "200" ]; then
if [ -f "${OUTPUT_DIR}/person_template.xlsx" ]; then
echo -e "${GREEN}✓ 模板下载成功${NC}"
echo "文件大小: $(du -h "${OUTPUT_DIR}/person_template.xlsx" | cut -f1)"
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 下载个人中介模板" "✅ 通过" "文件已保存"
else
echo -e "${RED}✗ 文件未生成${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
else
echo -e "${RED}✗ HTTP 状态码: ${response}${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 下载个人中介模板" "❌ 失败" "HTTP ${response}"
fi
# ============================================================
# Test 2: 下载实体中介导入模板
# ============================================================
TEST_COUNT=$((TEST_COUNT + 1))
echo -e "\n${YELLOW}=== Test ${TEST_COUNT}: 下载实体中介导入模板 ===${NC}"
response=$(curl -s -X POST "${BASE_URL}/ccdi/intermediary/importEntityTemplate" \
-H "Authorization: Bearer ${TOKEN}" \
-o "${OUTPUT_DIR}/entity_template.xlsx" \
-w "%{http_code}")
if [ "${response}" = "200" ]; then
if [ -f "${OUTPUT_DIR}/entity_template.xlsx" ]; then
echo -e "${GREEN}✓ 模板下载成功${NC}"
echo "文件大小: $(du -h "${OUTPUT_DIR}/entity_template.xlsx" | cut -f1)"
PASS_COUNT=$((PASS_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 下载实体中介模板" "✅ 通过" "文件已保存"
else
echo -e "${RED}✗ 文件未生成${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
else
echo -e "${RED}✗ HTTP 状态码: ${response}${NC}"
FAIL_COUNT=$((FAIL_COUNT + 1))
log_test_result "Test ${TEST_COUNT}: 下载实体中介模板" "❌ 失败" "HTTP ${response}"
fi
# ============================================================
# 注意:实际导入测试需要准备有效的 Excel 文件
# 此处仅测试接口可访问性
# ============================================================
echo -e "\n${YELLOW}=== 批量导入测试统计 ===${NC}"
echo "总测试: ${TEST_COUNT}"
echo -e "通过: ${GREEN}${PASS_COUNT}${NC}"
echo -e "失败: ${RED}${FAIL_COUNT}${NC}"
echo -e "\n${YELLOW}注意: 完整的导入测试需要手动准备 Excel 文件${NC}"
Step 2: 设置执行权限
chmod +x doc/test/scripts/test_import.sh
综合测试执行
Task 6: 创建主测试执行脚本
Files:
- Create:
doc/test/run_all_tests.sh
Step 1: 编写主执行脚本
# file: doc/test/run_all_tests.sh
#!/bin/bash
# ============================================================
# 中介黑名单双表迁移测试主执行脚本
# ============================================================
set -e # 遇到错误立即退出
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
OUTPUT_DIR="${SCRIPT_DIR}/output"
echo "=========================================="
echo "中介黑名单双表迁移测试"
echo "=========================================="
echo "开始时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
# 清理旧的输出
rm -rf "${OUTPUT_DIR}"
mkdir -p "${OUTPUT_DIR}"
# 总计数据
TOTAL_TESTS=0
TOTAL_PASSED=0
TOTAL_FAILED=0
# ============================================================
# 1. 运行个人中介测试
# ============================================================
echo -e "\n=========================================="
echo "第1部分: 个人中介测试"
echo "=========================================="
if bash "${SCRIPT_DIR}/scripts/test_person_intermediary.sh"; then
echo "个人中介测试完成"
else
echo "个人中介测试失败"
fi
# ============================================================
# 2. 运行实体中介测试
# ============================================================
echo -e "\n=========================================="
echo "第2部分: 实体中介测试"
echo "=========================================="
if bash "${SCRIPT_DIR}/scripts/test_entity_intermediary.sh"; then
echo "实体中介测试完成"
else
echo "实体中介测试失败"
fi
# ============================================================
# 3. 运行列表查询测试
# ============================================================
echo -e "\n=========================================="
echo "第3部分: 列表查询测试"
echo "=========================================="
if bash "${SCRIPT_DIR}/scripts/test_list_query.sh"; then
echo "列表查询测试完成"
else
echo "列表查询测试失败"
fi
# ============================================================
# 4. 运行导入测试
# ============================================================
echo -e "\n=========================================="
echo "第4部分: 导入功能测试"
echo "=========================================="
if bash "${SCRIPT_DIR}/scripts/test_import.sh"; then
echo "导入功能测试完成"
else
echo "导入功能测试失败"
fi
# ============================================================
# 5. 生成最终报告
# ============================================================
echo -e "\n=========================================="
echo "生成测试报告"
echo "=========================================="
bash "${SCRIPT_DIR}/scripts/test_report.sh"
echo ""
echo "=========================================="
echo "测试完成"
echo "=========================================="
echo "结束时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
echo "报告位置:"
echo " Markdown: ${OUTPUT_DIR}/test_report.md"
echo " HTML: ${OUTPUT_DIR}/test_report.html"
echo " 响应快照: ${OUTPUT_DIR}/"
echo ""
# 显示报告摘要
if [ -f "${OUTPUT_DIR}/test_report.md" ]; then
echo "=========================================="
echo "测试摘要"
echo "=========================================="
grep -A 5 "## 测试统计" "${OUTPUT_DIR}/test_report.md" || echo "无法读取统计信息"
fi
Step 2: 设置执行权限
chmod +x doc/test/run_all_tests.sh
执行测试
Task 7: 执行完整测试套件
Step 1: 确保后端服务运行
# 检查后端服务状态
curl -s http://localhost:8080/actuator/health || echo "后端服务未启动,请先启动"
Step 2: 运行完整测试
cd /d/ccdi/ccdi
bash doc/test/run_all_tests.sh
Step 3: 查看测试报告
# Markdown 报告
cat doc/test/output/test_report.md
# 或在浏览器中查看 HTML 报告
start doc/test/output/test_report.html # Windows
# open doc/test/output/test_report.html # macOS
# xdg-open doc/test/output/test_report.html # Linux
预期测试结果
成功标准
所有测试应该通过,验证以下功能:
-
个人中介 CRUD
- ✅ 个人中介数据插入到
ccdi_biz_intermediary表 - ✅ 新增、查询、修改功能正常
- ✅ 数据来源正确设置为 "MANUAL"
- ✅ 个人中介数据插入到
-
实体中介 CRUD
- ✅ 实体中介数据插入到
ccdi_enterprise_base_info表 - ✅ 新增、查询、修改功能正常
- ✅
risk_level自动设置为 "1" - ✅
ent_source自动设置为 "INTERMEDIARY"
- ✅ 实体中介数据插入到
-
分页查询
- ✅ UNION ALL 查询正确合并两张表数据
- ✅ 分页功能正常(pageNum, pageSize)
- ✅ 类型过滤正确(intermediaryType=1/2)
- ✅ 枚举字段只返回代码值,无名称字段
-
导入功能
- ✅ 模板下载接口可访问
- ✅ Excel 文件正确生成
失败场景处理
如果测试失败:
- HTTP 401: Token 过期,检查登录接口
- HTTP 403: 权限不足,检查用户权限配置
- 数据库查询失败: 检查数据库连接和表结构
- 断言失败: 检查业务逻辑实现
清理测试数据
Task 8: 数据清理脚本
Files:
- Create:
doc/test/cleanup_test_data.sh
Step 1: 编写数据清理脚本
# file: doc/test/cleanup_test_data.sh
#!/bin/bash
# ============================================================
# 清理测试数据
# ============================================================
echo "正在清理测试数据..."
# 清理个人中介测试数据
echo "清理 ccdi_biz_intermediary 表测试数据..."
mysql -u root -p123456 ccdi_db << 'EOF'
DELETE FROM ccdi_biz_intermediary
WHERE person_id IN ('110101199001011234');
EOF
echo "✓ 个人中介测试数据已清理"
# 清理实体中介测试数据
echo "清理 ccdi_enterprise_base_info 表测试数据..."
mysql -u root -p123456 ccdi_db << 'EOF'
DELETE FROM ccdi_enterprise_base_info
WHERE social_credit_code IN ('91110000123456789X')
AND ent_source = 'INTERMEDIARY';
EOF
echo "✓ 实体中介测试数据已清理"
echo ""
echo "测试数据清理完成"
Step 2: 设置执行权限
chmod +x doc/test/cleanup_test_data.sh
Step 3: 执行清理
bash doc/test/cleanup_test_data.sh
附录
A. 测试数据示例
个人中介测试数据:
{
"name": "测试个人中介01",
"certificateNo": "110101199001011234",
"intermediaryType": "1",
"status": "0",
"dataSource": "MANUAL",
"indivGender": "M",
"indivPhone": "13800138000"
}
实体中介测试数据:
{
"name": "测试实体中介有限公司",
"certificateNo": "91110000123456789X",
"intermediaryType": "2",
"corpCreditCode": "91110000123456789X",
"corpNature": "民营企业",
"corpLegalRep": "李四"
}
B. 数据库验证查询
-- 验证个人中介数据
SELECT biz_id, name, person_id, gender, mobile, date_source
FROM ccdi_biz_intermediary
WHERE person_id = '110101199001011234';
-- 验证实体中介数据
SELECT social_credit_code, enterprise_name, risk_level, ent_source
FROM ccdi_enterprise_base_info
WHERE social_credit_code = '91110000123456789X';
-- 验证 UNION 查询结果
SELECT '1' AS type, COUNT(*) AS count
FROM ccdi_biz_intermediary
UNION ALL
SELECT '2' AS type, COUNT(*) AS count
FROM ccdi_enterprise_base_info
WHERE ent_source = 'INTERMEDIARY';
C. 常见问题排查
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 401 Unauthorized | Token过期 | 重新登录获取新Token |
| 403 Forbidden | 权限不足 | 检查用户角色和权限配置 |
| 500 Internal Server Error | 后端代码错误 | 查看后端日志,检查异常栈 |
| 数据库连接失败 | 数据库未启动 | 检查MySQL服务状态 |
| UNION查询结果为空 | 表中无数据 | 先执行插入操作 |
文档版本: v1.0 创建日期: 2026-02-04 最后更新: 2026-02-04 维护者: CCDI 开发团队