Files
ccdi/doc/test-data/test-scripts/INDEX.md

228 lines
7.2 KiB
Markdown
Raw Normal View History

# 导入重复检测功能测试文档索引
## 文档概述
本文档集为"导入文件内部主键重复检测"功能提供完整的测试支持,包括测试用例、测试脚本、使用说明等。
## 文档结构
```
doc/
├── test-scripts/ # 测试脚本和文档
│ ├── test_import_duplicate_detection.py # Python自动化测试脚本
│ ├── test_import_duplicate_detection_cases.md # 详细测试用例文档
│ └── README_TEST.md # 测试使用说明
├── test-data/ # 测试数据
│ ├── temp/ # 临时测试数据(自动生成)
│ ├── employee/ # 员工测试数据
│ ├── recruitment/ # 招聘测试数据
│ └── README.md # 测试数据说明
└── test-reports/ # 测试报告
└── README.md # 测试报告说明
```
## 快速导航
### 1. 测试执行
- **快速开始**: 查看 [测试使用说明](test-scripts/README_TEST.md)
- **运行测试**: 双击 `run_duplicate_test.bat` 或运行Python脚本
- **查看报告**: 查看 `test-reports/` 目录下的JSON报告
### 2. 测试用例
- **详细用例**: 查看 [测试用例文档](test-scripts/test_import_duplicate_detection_cases.md)
- **场景1**: 采购交易 - Excel内采购事项ID重复
- **场景2**: 员工信息 - Excel内柜员号重复
- **场景3**: 员工信息 - Excel内身份证号重复
- **场景4**: 混合重复(数据库+Excel)
### 3. 测试数据
- **数据说明**: 查看 [测试数据说明](test-data/README.md)
- **自动生成**: 运行测试脚本自动生成临时测试数据
- **手动测试**: 使用现有的员工/招聘测试数据
### 4. 测试报告
- **报告说明**: 查看 [测试报告说明](test-reports/README.md)
- **报告格式**: JSON格式,包含详细的测试结果
- **报告位置**: `doc/test-reports/test_report_YYYYMMDD_HHMMSS.json`
## 功能概述
### 测试目标
验证导入功能能够正确检测并处理Excel文件内部的主键重复数据:
1. ✅ 采购交易导入 - 检测采购事项ID重复
2. ✅ 员工信息导入 - 检测柜员号和身份证号重复
### 核心逻辑
- 同一Excel文件内,重复的主键只会导入第一条
- 后续重复记录会被跳过,并记录到失败列表
- 提供清晰的错误提示信息
- 正确区分数据库重复和Excel内重复
### 错误消息格式
- **数据库重复**: "采购事项ID[xxx]已存在,请勿重复导入"
- **Excel内重复**: "采购事项ID[xxx]在导入文件中重复,已跳过此条记录"
- **柜员号重复**: "柜员号[xxx]在导入文件中重复,已跳过此条记录"
- **身份证号重复**: "身份证号[xxx]在导入文件中重复,已跳过此条记录"
## 测试环境要求
### 必需组件
- Python 3.7+
- 后端服务运行在 http://localhost:8080
- 测试账号: admin / admin123
### Python依赖
```bash
pip install requests openpyxl
```
### 数据库准备
- 场景4需要预先在数据库中插入测试数据
- 其他场景不需要预先准备数据
## 测试执行方式
### 方式1: 批处理脚本(推荐)
```bash
# Windows
双击 run_duplicate_test.bat
# Linux/Mac
bash run_duplicate_test.sh
```
### 方式2: Python命令
```bash
python doc/test-scripts/test_import_duplicate_detection.py
```
### 方式3: IDE运行
- 使用PyCharm/VS Code打开测试脚本
- 直接运行
## 测试结果解读
### 成功标准
- ✅ 所有4个测试场景通过
- ✅ 通过率 >= 75% (场景4可能因缺少预置数据而部分失败)
- ✅ 错误消息格式正确
### 失败处理
1. 查看测试报告中的error_message
2. 检查后端日志
3. 确认测试环境是否正确
4. 确认测试账号权限是否正确
### 常见问题
- **连接失败**: 确认后端服务是否启动
- **登录失败**: 确认测试账号密码是否正确
- **权限不足**: 确认admin账号是否有导入权限
- **超时**: 增加等待时间或检查后端性能
## 代码实现
### 后端实现
- **采购交易**: `CcdiPurchaseTransactionImportServiceImpl.java` (第54-82行)
- **员工信息**: `CcdiEmployeeImportServiceImpl.java` (第52-101行)
### 关键代码片段
#### 采购交易重复检测
```java
// 用于跟踪Excel文件内已处理的采购事项ID
Set<String> processedIds = new HashSet<>();
for (int i = 0; i < excelList.size(); i++) {
CcdiPurchaseTransactionExcel excel = excelList.get(i);
if (existingIds.contains(excel.getPurchaseId())) {
// 数据库中已存在
throw new RuntimeException("采购事项ID[" + excel.getPurchaseId() + "]已存在,请勿重复导入");
} else if (processedIds.contains(excel.getPurchaseId())) {
// Excel文件内部重复
throw new RuntimeException("采购事项ID[" + excel.getPurchaseId() + "]在导入文件中重复,已跳过此条记录");
} else {
// 正常导入
newRecords.add(transaction);
processedIds.add(excel.getPurchaseId()); // 标记为已处理
}
}
```
#### 员工信息重复检测
```java
// 用于跟踪Excel文件内已处理的主键
Set<Long> processedEmployeeIds = new HashSet<>();
Set<String> processedIdCards = new HashSet<>();
for (int i = 0; i < excelList.size(); i++) {
CcdiEmployeeExcel excel = excelList.get(i);
// 统一检查Excel内重复
if (processedEmployeeIds.contains(excel.getEmployeeId())) {
throw new RuntimeException("柜员号[" + excel.getEmployeeId() + "]在导入文件中重复,已跳过此条记录");
}
if (StringUtils.isNotEmpty(excel.getIdCard()) &&
processedIdCards.contains(excel.getIdCard())) {
throw new RuntimeException("身份证号[" + excel.getIdCard() + "]在导入文件中重复,已跳过此条记录");
}
// 统一标记为已处理
processedEmployeeIds.add(excel.getEmployeeId());
processedIdCards.add(excel.getIdCard());
}
```
## API接口
### 采购交易导入
- **上传**: `POST /ccdi/purchaseTransaction/importData`
- **状态**: `GET /ccdi/purchaseTransaction/importStatus/{taskId}`
- **失败记录**: `GET /ccdi/purchaseTransaction/importFailures/{taskId}`
### 员工信息导入
- **上传**: `POST /ccdi/employee/importData`
- **状态**: `GET /ccdi/employee/importStatus/{taskId}`
- **失败记录**: `GET /ccdi/employee/importFailures/{taskId}`
### Swagger文档
访问 http://localhost:8080/swagger-ui/index.html 查看完整API文档
## 版本历史
### v1.0 (2026-02-09)
- ✅ 创建测试框架
- ✅ 实现4个测试场景
- ✅ 生成完整测试文档
- ✅ 支持自动化测试和手动测试
## 贡献指南
### 添加新测试场景
1. 在ExcelGenerator中添加数据生成方法
2. 创建新的TestCase子类
3. 更新测试用例文档
4. 运行测试验证
### 修改测试逻辑
1. 修改对应的TestCase类
2. 更新测试用例文档
3. 运行完整测试确保不影响其他场景
### 报告问题
如发现问题,请提供:
- 测试报告JSON文件
- 后端日志
- 复现步骤
- 环境信息
## 联系方式
如有问题或建议,请联系开发团队。
---
**最后更新**: 2026-02-09
**文档版本**: v1.0
**维护者**: 测试团队