# 中介黑名单双表迁移测试验证计划 > **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: 创建测试工具函数库** ```bash # 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: 创建测试报告生成器** ```bash # 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' 中介黑名单双表迁移测试报告

中介黑名单双表迁移测试报告

EOF # 转换 Markdown 为简单 HTML grep -E '^#{1,3}|^-|^\||^\* ' "${REPORT_FILE}" | sed 's/^### /

/g; s/^## /

/g; s/^# /

/g; s/$/<\/h>/g' >> "${html_file}" cat >> "${html_file}" << 'EOF'

EOF echo "HTML 报告已生成: ${html_file}" } ``` **Step 3: 设置执行权限** ```bash 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: 编写个人中介测试脚本** ```bash # 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: 设置执行权限** ```bash chmod +x doc/test/scripts/test_person_intermediary.sh ``` --- ### Task 3: 测试实体中介 CRUD 操作 **Files:** - Create: `doc/test/scripts/test_entity_intermediary.sh` **Step 1: 编写实体中介测试脚本** ```bash # 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: 设置执行权限** ```bash chmod +x doc/test/scripts/test_entity_intermediary.sh ``` --- ### Task 4: 测试分页查询和类型过滤 **Files:** - Create: `doc/test/scripts/test_list_query.sh` **Step 1: 编写列表查询测试脚本** ```bash # 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: 设置执行权限** ```bash 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 测试: ```bash # 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: 设置执行权限** ```bash chmod +x doc/test/scripts/test_import.sh ``` --- ## 综合测试执行 ### Task 6: 创建主测试执行脚本 **Files:** - Create: `doc/test/run_all_tests.sh` **Step 1: 编写主执行脚本** ```bash # 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: 设置执行权限** ```bash chmod +x doc/test/run_all_tests.sh ``` --- ## 执行测试 ### Task 7: 执行完整测试套件 **Step 1: 确保后端服务运行** ```bash # 检查后端服务状态 curl -s http://localhost:8080/actuator/health || echo "后端服务未启动,请先启动" ``` **Step 2: 运行完整测试** ```bash cd /d/ccdi/ccdi bash doc/test/run_all_tests.sh ``` **Step 3: 查看测试报告** ```bash # 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 ``` --- ## 预期测试结果 ### 成功标准 所有测试应该通过,验证以下功能: 1. **个人中介 CRUD** - ✅ 个人中介数据插入到 `ccdi_biz_intermediary` 表 - ✅ 新增、查询、修改功能正常 - ✅ 数据来源正确设置为 "MANUAL" 2. **实体中介 CRUD** - ✅ 实体中介数据插入到 `ccdi_enterprise_base_info` 表 - ✅ 新增、查询、修改功能正常 - ✅ `risk_level` 自动设置为 "1" - ✅ `ent_source` 自动设置为 "INTERMEDIARY" 3. **分页查询** - ✅ UNION ALL 查询正确合并两张表数据 - ✅ 分页功能正常(pageNum, pageSize) - ✅ 类型过滤正确(intermediaryType=1/2) - ✅ 枚举字段只返回代码值,无名称字段 4. **导入功能** - ✅ 模板下载接口可访问 - ✅ Excel 文件正确生成 ### 失败场景处理 如果测试失败: 1. **HTTP 401**: Token 过期,检查登录接口 2. **HTTP 403**: 权限不足,检查用户权限配置 3. **数据库查询失败**: 检查数据库连接和表结构 4. **断言失败**: 检查业务逻辑实现 --- ## 清理测试数据 ### Task 8: 数据清理脚本 **Files:** - Create: `doc/test/cleanup_test_data.sh` **Step 1: 编写数据清理脚本** ```bash # 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: 设置执行权限** ```bash chmod +x doc/test/cleanup_test_data.sh ``` **Step 3: 执行清理** ```bash bash doc/test/cleanup_test_data.sh ``` --- ## 附录 ### A. 测试数据示例 **个人中介测试数据:** ```json { "name": "测试个人中介01", "certificateNo": "110101199001011234", "intermediaryType": "1", "status": "0", "dataSource": "MANUAL", "indivGender": "M", "indivPhone": "13800138000" } ``` **实体中介测试数据:** ```json { "name": "测试实体中介有限公司", "certificateNo": "91110000123456789X", "intermediaryType": "2", "corpCreditCode": "91110000123456789X", "corpNature": "民营企业", "corpLegalRep": "李四" } ``` ### B. 数据库验证查询 ```sql -- 验证个人中介数据 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 开发团队