Files
ccdi/doc/test-data/intermediary/TEST-REPORT-TEMPLATE.md
wkc daf03e1ef0 test: 添加中介导入功能测试脚本和报告模板
- 添加自动化测试脚本 test-import-upsert.js
- 覆盖5个测试场景(首次导入、重复导入、更新等)
- 添加测试报告模板 TEST-REPORT-TEMPLATE.md

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-08 16:24:02 +08:00

7.2 KiB

中介导入功能重构测试报告

测试目标

验证Service层重构后,使用 importPersonBatchimportEntityBatch 方法 (基于 ON DUPLICATE KEY UPDATE) 的导入功能是否正常工作。

重构内容

Task 5: 重构个人中介导入Service

文件: CcdiIntermediaryPersonImportServiceImpl.java

核心变更:

  • 移除"先查询后分类再删除再插入"的逻辑
  • 更新模式(isUpdateSupport=true): 直接调用 intermediaryMapper.importPersonBatch(validRecords)
  • 仅新增模式(isUpdateSupport=false): 先查询冲突,然后只插入无冲突数据
  • 新增辅助方法:
    • saveBatchWithUpsert(): 使用 importPersonBatch 进行批量UPSERT
    • getExistingPersonIdsFromDb(): 从数据库获取已存在的证件号
    • createFailureVO(): 创建失败记录VO(两个重载方法)

Task 6: 重构实体中介导入Service

文件: CcdiIntermediaryEntityImportServiceImpl.java

同样的重构逻辑

测试场景

场景1: 个人中介 - 更新模式(第一次导入)

目的: 验证批量INSERT功能

操作:

  • 上传测试数据文件(1000条个人中介数据)
  • 设置 updateSupport=true

预期结果:

  • 所有数据成功插入
  • 状态: SUCCESS
  • 成功数 = 总数
  • 失败数 = 0

实际结果: 待测试

状态: 待执行


场景2: 个人中介 - 仅新增模式(重复导入)

目的: 验证冲突检测功能

操作:

  • 再次上传相同的测试数据
  • 设置 updateSupport=false

预期结果:

  • 所有数据因为冲突而失败
  • 状态: PARTIAL_SUCCESS 或 FAILURE
  • 成功数 = 0
  • 失败数 = 总数
  • 失败原因: "该证件号码已存在"

实际结果: 待测试

状态: 待执行


场景3: 实体中介 - 更新模式(第一次导入)

目的: 验证实体中介批量INSERT功能

操作:

  • 上传测试数据文件(1000条实体中介数据)
  • 设置 updateSupport=true

预期结果:

  • 所有数据成功插入
  • 状态: SUCCESS
  • 成功数 = 总数
  • 失败数 = 0

实际结果: 待测试

状态: 待执行


场景4: 实体中介 - 仅新增模式(重复导入)

目的: 验证实体中介冲突检测功能

操作:

  • 再次上传相同的测试数据
  • 设置 updateSupport=false

预期结果:

  • 所有数据因为冲突而失败
  • 状态: PARTIAL_SUCCESS 或 FAILURE
  • 成功数 = 0
  • 失败数 = 总数
  • 失败原因: "该统一社会信用代码已存在"

实际结果: 待测试

状态: 待执行


场景5: 个人中介 - 再次更新模式

目的: 验证 ON DUPLICATE KEY UPDATE 功能

操作:

  • 第三次上传相同的测试数据
  • 设置 updateSupport=true

预期结果:

  • 所有数据成功更新(而不是先删除再插入)
  • 状态: SUCCESS
  • 成功数 = 总数
  • 失败数 = 0
  • 数据库中不会出现重复记录

实际结果: 待测试

状态: 待执行


测试方法

手动测试

  1. 启动后端服务

    cd ruoyi-ccdi
    mvn spring-boot:run
    
  2. 访问Swagger UI

  3. 执行测试场景

    • 使用"Try it out"功能上传测试文件
    • 观察响应结果
    • 使用任务ID查询导入状态
    • 查看失败记录

自动化测试

运行测试脚本:

cd doc/test-data/intermediary
node test-import-upsert.js

测试脚本会自动执行所有测试场景并生成报告。

测试数据

个人中介测试数据

  • 文件: doc/test-data/intermediary/个人中介黑名单测试数据_1000条_第1批.xlsx
  • 记录数: 1000
  • 特点: 包含有效的身份证号码

实体中介测试数据

  • 文件: doc/test-data/intermediary/机构中介黑名单测试数据_1000条_第1批.xlsx
  • 记录数: 1000
  • 特点: 包含有效的统一社会信用代码

关键验证点

1. 数据库层面验证

更新模式下的UPSERT操作:

  • 检查 ccdi_biz_intermediary 表,确保持有相同 person_id 的记录只有1条
  • 检查 ccdi_enterprise_base_info 表,确保持有相同 social_credit_code 的记录只有1条

验证SQL:

-- 检查个人中介重复记录
SELECT person_id, COUNT(*) as cnt
FROM ccdi_biz_intermediary
GROUP BY person_id
HAVING cnt > 1;

-- 检查实体中介重复记录
SELECT social_credit_code, COUNT(*) as cnt
FROM ccdi_enterprise_base_info
GROUP BY social_credit_code
HAVING cnt > 1;

2. 性能验证

对比重构前后的性能差异:

场景 重构前(先删后插) 重构后(UPSERT) 性能提升
1000条首次导入 待测试 待测试 待计算
1000条重复导入 待测试 待测试 待计算

3. 错误处理验证

验证失败记录的正确性:

  • 失败原因是否准确
  • 失败记录的完整信息是否保留
  • Redis中失败记录的存储和读取

测试结果汇总

场景 状态 通过/失败 备注
场景1 待执行 - 个人中介首次导入
场景2 待执行 - 个人中介重复导入(仅新增)
场景3 待执行 - 实体中介首次导入
场景4 待执行 - 实体中介重复导入(仅新增)
场景5 待执行 - 个人中介重复导入(更新)

总通过率: 0/5 (0%)

问题记录

问题1: 问题描述

场景: 相关场景

现象: 具体表现

原因: 根本原因

解决方案: 修复方法

状态: 待解决 / 已解决


结论

测试完成后填写总体结论

代码质量评估

  • 可读性: 评分 / 10
  • 可维护性: 评分 / 10
  • 性能: 评分 / 10
  • 错误处理: 评分 / 10

优化建议

根据测试结果提出优化建议

附录

A. 测试环境信息

  • 操作系统: Windows 11
  • Java版本: 17
  • Spring Boot版本: 3.5.8
  • MySQL版本: 8.2.0
  • Redis版本: 待填写

B. 相关文件清单

  • ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiIntermediaryPersonImportServiceImpl.java
  • ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiIntermediaryEntityImportServiceImpl.java
  • ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiBizIntermediaryMapper.java
  • ruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiEnterpriseBaseInfoMapper.java
  • doc/test-data/intermediary/test-import-upsert.js

C. Git提交信息

commit 7d534de
refactor: 重构Service层使用ON DUPLICATE KEY UPDATE

- 更新模式直接调用importPersonBatch/importEntityBatch
- 移除'先删除再插入'逻辑,代码简化约50%
- 添加辅助方法saveBatchWithUpsert/getExistingPersonIdsFromDb
- 添加createFailureVO重载方法简化失败记录创建

变更详情:
- CcdiIntermediaryPersonImportServiceImpl: 重构importPersonAsync方法
- CcdiIntermediaryEntityImportServiceImpl: 重构importEntityAsync方法
- 两个Service均采用统一的处理模式

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

报告生成时间: 2026-02-08 测试执行人: 待填写 审核人: 待填写