- 添加自动化测试脚本 test-import-upsert.js - 覆盖5个测试场景(首次导入、重复导入、更新等) - 添加测试报告模板 TEST-REPORT-TEMPLATE.md Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
7.2 KiB
7.2 KiB
中介导入功能重构测试报告
测试目标
验证Service层重构后,使用 importPersonBatch 和 importEntityBatch 方法
(基于 ON DUPLICATE KEY UPDATE) 的导入功能是否正常工作。
重构内容
Task 5: 重构个人中介导入Service
文件: CcdiIntermediaryPersonImportServiceImpl.java
核心变更:
- 移除"先查询后分类再删除再插入"的逻辑
- 更新模式(
isUpdateSupport=true): 直接调用intermediaryMapper.importPersonBatch(validRecords) - 仅新增模式(
isUpdateSupport=false): 先查询冲突,然后只插入无冲突数据 - 新增辅助方法:
saveBatchWithUpsert(): 使用importPersonBatch进行批量UPSERTgetExistingPersonIdsFromDb(): 从数据库获取已存在的证件号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
- 数据库中不会出现重复记录
实际结果: 待测试
状态: ⏳ 待执行
测试方法
手动测试
-
启动后端服务
cd ruoyi-ccdi mvn spring-boot:run -
访问Swagger UI
- URL: http://localhost:8080/swagger-ui/index.html
- 找到
/ccdi/intermediary/importPersonData和/ccdi/intermediary/importEntityData接口
-
执行测试场景
- 使用"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.javaruoyi-ccdi/src/main/java/com/ruoyi/ccdi/service/impl/CcdiIntermediaryEntityImportServiceImpl.javaruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiBizIntermediaryMapper.javaruoyi-ccdi/src/main/java/com/ruoyi/ccdi/mapper/CcdiEnterpriseBaseInfoMapper.javadoc/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 测试执行人: 待填写 审核人: 待填写