除员工外 取消导入更新 添加导入文件重复校验
This commit is contained in:
320
doc/test-scripts/README_TEST.md
Normal file
320
doc/test-scripts/README_TEST.md
Normal file
@@ -0,0 +1,320 @@
|
||||
# 导入重复检测测试使用说明
|
||||
|
||||
## 概述
|
||||
|
||||
本测试套件用于验证"导入文件内部主键重复检测"功能,确保系统能够正确识别并处理Excel文件内部重复的主键数据。
|
||||
|
||||
## 文件结构
|
||||
|
||||
```
|
||||
doc/test-scripts/
|
||||
├── test_import_duplicate_detection.py # Python自动化测试脚本
|
||||
├── test_import_duplicate_detection_cases.md # 详细测试用例文档
|
||||
└── README_TEST.md # 本说明文档
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 环境准备
|
||||
|
||||
#### 必需组件
|
||||
- Python 3.7+
|
||||
- 后端服务运行在 http://localhost:8080
|
||||
- 测试账号: admin / admin123
|
||||
|
||||
#### Python依赖安装
|
||||
```bash
|
||||
pip install requests openpyxl
|
||||
```
|
||||
|
||||
或者使用requirements.txt(如果有的话):
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 2. 运行测试
|
||||
|
||||
#### 方式1: 命令行运行
|
||||
```bash
|
||||
cd D:\ccdi\ccdi
|
||||
python doc/test-scripts/test_import_duplicate_detection.py
|
||||
```
|
||||
|
||||
#### 方式2: IDE运行
|
||||
- 使用PyCharm/VS Code打开 `test_import_duplicate_detection.py`
|
||||
- 直接运行脚本
|
||||
|
||||
### 3. 查看结果
|
||||
|
||||
测试运行时会实时显示进度,完成后会生成JSON格式的测试报告:
|
||||
|
||||
```
|
||||
doc/test-reports/test_report_20260209_153045.json
|
||||
```
|
||||
|
||||
## 测试场景说明
|
||||
|
||||
### 场景1: 采购交易 - Excel内采购事项ID重复
|
||||
- **目的**: 验证3条相同采购事项ID的记录,只有第1条导入成功
|
||||
- **预期**: 成功1条,失败2条
|
||||
- **错误消息**: "采购事项ID[xxx]在导入文件中重复,已跳过此条记录"
|
||||
|
||||
### 场景2: 员工信息 - Excel内柜员号重复
|
||||
- **目的**: 验证3条相同柜员号的记录,只有第1条导入成功
|
||||
- **预期**: 成功1条,失败2条
|
||||
- **错误消息**: "柜员号[xxx]在导入文件中重复,已跳过此条记录"
|
||||
|
||||
### 场景3: 员工信息 - Excel内身份证号重复
|
||||
- **目的**: 验证3条相同身份证号的记录,只有第1条导入成功
|
||||
- **预期**: 成功1条,失败2条
|
||||
- **错误消息**: "身份证号[xxx]在导入文件中重复,已跳过此条记录"
|
||||
|
||||
### 场景4: 混合重复(数据库+Excel)
|
||||
- **目的**: 验证数据库已存在记录和Excel内重复的混合场景
|
||||
- **预期**: 第1条失败(数据库重复),第2条成功,第3条失败(Excel内重复),第4条成功
|
||||
- **注意**: 需要预先在数据库中插入测试数据
|
||||
|
||||
## 测试脚本说明
|
||||
|
||||
### 核心类
|
||||
|
||||
#### 1. APIClient
|
||||
API客户端封装,负责:
|
||||
- 登录获取Token
|
||||
- 上传文件
|
||||
- 查询导入状态
|
||||
- 查询失败记录
|
||||
|
||||
#### 2. ExcelGenerator
|
||||
Excel测试数据生成器,提供:
|
||||
- `create_purchase_duplicate_data()`: 采购重复数据
|
||||
- `create_employee_employee_id_duplicate()`: 员工柜员号重复数据
|
||||
- `create_employee_id_card_duplicate()`: 员工身份证号重复数据
|
||||
- `create_mixed_duplicate_scenario()`: 混合重复数据
|
||||
|
||||
#### 3. TestCase
|
||||
测试用例基类,所有测试用例继承此类:
|
||||
- `PurchaseDuplicateTestCase`: 场景1
|
||||
- `EmployeeEmployeeIdDuplicateTestCase`: 场景2
|
||||
- `EmployeeIdCardDuplicateTestCase`: 场景3
|
||||
- `MixedDuplicateTestCase`: 场景4
|
||||
|
||||
#### 4. TestRunner
|
||||
测试运行器,负责:
|
||||
- 初始化API客户端
|
||||
- 依次执行所有测试用例
|
||||
- 收集测试结果
|
||||
- 生成测试报告
|
||||
|
||||
### 配置参数
|
||||
|
||||
在脚本顶部的配置部分可以修改:
|
||||
|
||||
```python
|
||||
# 服务器地址
|
||||
BASE_URL = "http://localhost:8080"
|
||||
|
||||
# 测试账号
|
||||
USERNAME = "admin"
|
||||
PASSWORD = "admin123"
|
||||
|
||||
# 报告保存目录
|
||||
REPORT_DIR = "D:/ccdi/ccdi/doc/test-reports"
|
||||
EXCEL_DIR = "D:/ccdi/ccdi/doc/test-data/temp"
|
||||
```
|
||||
|
||||
## 测试数据说明
|
||||
|
||||
### 自动生成的Excel文件
|
||||
|
||||
测试脚本会自动在 `doc/test-data/temp/` 目录下生成测试数据:
|
||||
|
||||
1. `purchase_duplicate.xlsx` - 采购重复数据(场景1)
|
||||
2. `employee_employee_id_duplicate.xlsx` - 员工柜员号重复(场景2)
|
||||
3. `employee_id_card_duplicate.xlsx` - 员工身份证号重复(场景3)
|
||||
4. `purchase_mixed_duplicate.xlsx` - 采购混合重复(场景4)
|
||||
5. `employee_mixed_duplicate.xlsx` - 员工混合重复(场景4)
|
||||
|
||||
### 数据字段说明
|
||||
|
||||
#### 采购交易测试数据
|
||||
| 字段 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| purchaseId | 采购事项ID(主键) | PURCHASE001 |
|
||||
| purchaseCategory | 采购类别 | 采购类别1 |
|
||||
| subjectName | 标的物名称 | 标的物名称1 |
|
||||
| purchaseQty | 采购数量 | 10 |
|
||||
| budgetAmount | 预算金额 | 10000.00 |
|
||||
| purchaseMethod | 采购方式 | 公开招标 |
|
||||
| applyDate | 采购申请日期 | 2024-01-01 |
|
||||
| applicantId | 申请人工号 | 1000001 |
|
||||
| applicantName | 申请人姓名 | 张三 |
|
||||
| applyDepartment | 申请部门 | 技术部 |
|
||||
|
||||
#### 员工信息测试数据
|
||||
| 字段 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| name | 姓名 | 员工1 |
|
||||
| employeeId | 柜员号(主键) | 10001 |
|
||||
| deptId | 所属部门ID | 103 |
|
||||
| idCard | 身份证号(主键) | 110101199001011234 |
|
||||
| phone | 电话 | 13800000000 |
|
||||
| hireDate | 入职时间 | 2024-01-01 |
|
||||
| status | 状态 | 0 |
|
||||
|
||||
## 测试报告说明
|
||||
|
||||
### 报告格式
|
||||
JSON格式,包含以下信息:
|
||||
|
||||
```json
|
||||
{
|
||||
"test_time": "2026-02-09 15:30:45",
|
||||
"environment": "http://localhost:8080",
|
||||
"total_count": 4,
|
||||
"passed_count": 3,
|
||||
"failed_count": 1,
|
||||
"pass_rate": "75.0%",
|
||||
"results": [
|
||||
{
|
||||
"name": "采购交易 - Excel内采购事项ID重复",
|
||||
"description": "测试导入3条采购事项ID相同的记录...",
|
||||
"passed": true,
|
||||
"error_message": null,
|
||||
"details": {
|
||||
"expected_success": 1,
|
||||
"expected_failure": 2,
|
||||
"actual_success": 1,
|
||||
"actual_failure": 2,
|
||||
"failures": [...]
|
||||
},
|
||||
"duration": "5.23s"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 查看报告
|
||||
1. 打开测试报告JSON文件
|
||||
2. 查看每个测试用例的passed字段
|
||||
3. 检查details中的实际结果与预期结果是否一致
|
||||
4. 如果失败,查看error_message了解原因
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 1. 连接失败
|
||||
**问题**: `✗ 登录失败: Connection refused`
|
||||
|
||||
**解决**:
|
||||
- 确认后端服务是否启动
|
||||
- 检查BASE_URL配置是否正确
|
||||
- 确认端口8080未被占用
|
||||
|
||||
### 2. 登录失败
|
||||
**问题**: `✗ 登录失败: 用户名或密码错误`
|
||||
|
||||
**解决**:
|
||||
- 确认测试账号密码是否正确(admin/admin123)
|
||||
- 检查数据库中是否存在该账号
|
||||
- 确认登录接口路径是否为/login/test
|
||||
|
||||
### 3. 导入超时
|
||||
**问题**: 查询导入状态时超时
|
||||
|
||||
**解决**:
|
||||
- 增加等待时间(修改脚本中的time.sleep(3)为更大的值)
|
||||
- 检查后端异步任务是否正常执行
|
||||
- 查看后端日志是否有异常
|
||||
|
||||
### 4. 权限不足
|
||||
**问题**: `✗ 上传失败: 没有权限`
|
||||
|
||||
**解决**:
|
||||
- 确认admin账号是否有导入权限
|
||||
- 检查权限标识: `ccdi:purchaseTransaction:import` 和 `ccdi:employee:import`
|
||||
- 在系统管理->角色管理中配置权限
|
||||
|
||||
### 5. 场景4测试失败
|
||||
**问题**: 混合重复测试结果不符合预期
|
||||
|
||||
**解决**:
|
||||
- 场景4需要预先在数据库中插入测试数据(EXIST001, 柜员号99999)
|
||||
- 如果数据库中没有这些数据,测试可能部分失败
|
||||
- 可以手动在数据库中插入,或者跳过该场景
|
||||
|
||||
## 手动测试步骤
|
||||
|
||||
如果需要手动验证测试场景:
|
||||
|
||||
### 1. 准备测试数据
|
||||
运行Python脚本生成Excel文件(即使不执行测试,也会生成数据):
|
||||
```python
|
||||
from doc.test_scripts.test_import_duplicate_detection import ExcelGenerator
|
||||
import os
|
||||
|
||||
# 生成场景1数据
|
||||
file1 = ExcelGenerator.create_purchase_duplicate_data()
|
||||
print(f"文件已生成: {file1}")
|
||||
```
|
||||
|
||||
### 2. 通过前端界面导入
|
||||
1. 访问 http://localhost:8080
|
||||
2. 登录系统(admin/admin123)
|
||||
3. 进入"采购交易管理"或"员工信息管理"
|
||||
4. 点击"导入"按钮
|
||||
5. 选择生成的Excel文件
|
||||
6. 点击"确定"上传
|
||||
7. 等待导入完成
|
||||
8. 点击"查看失败记录"查看详细信息
|
||||
|
||||
### 3. 验证结果
|
||||
- 检查导入成功的记录数量
|
||||
- 查看失败记录的错误消息
|
||||
- 确认数据库中只有第1条重复记录被导入
|
||||
|
||||
## 清理测试数据
|
||||
|
||||
测试完成后,建议清理测试数据:
|
||||
|
||||
### 方式1: 通过前端界面
|
||||
1. 进入采购交易/员工信息管理页面
|
||||
2. 搜索测试数据(如采购事项ID为PURCHASE001的记录)
|
||||
3. 逐条删除
|
||||
|
||||
### 方式2: 直接操作数据库
|
||||
```sql
|
||||
-- 删除采购交易测试数据
|
||||
DELETE FROM ccdi_purchase_transaction WHERE purchase_id LIKE 'PURCHASE%' OR purchase_id LIKE 'NEW%';
|
||||
|
||||
-- 删除员工测试数据
|
||||
DELETE FROM ccdi_employee WHERE employee_id BETWEEN 10001 AND 99999;
|
||||
```
|
||||
|
||||
## 扩展测试
|
||||
|
||||
如需添加新的测试场景:
|
||||
|
||||
1. 在ExcelGenerator中添加新的数据生成方法
|
||||
2. 创建新的TestCase子类
|
||||
3. 在main()函数中将新测试用例添加到TestRunner
|
||||
|
||||
示例:
|
||||
```python
|
||||
class MyNewTestCase(TestCase):
|
||||
def __init__(self):
|
||||
super().__init__("我的新测试", "测试描述")
|
||||
|
||||
def run(self, client: APIClient):
|
||||
# 实现测试逻辑
|
||||
pass
|
||||
|
||||
# 在main函数中添加
|
||||
runner.add_test_case(MyNewTestCase())
|
||||
```
|
||||
|
||||
## 联系支持
|
||||
|
||||
如有问题,请联系开发团队或查看相关文档:
|
||||
- 测试用例详细文档: `test_import_duplicate_detection_cases.md`
|
||||
- 后端实现代码: `CcdiPurchaseTransactionImportServiceImpl.java`, `CcdiEmployeeImportServiceImpl.java`
|
||||
- API文档: Swagger UI (http://localhost:8080/swagger-ui/index.html)
|
||||
Reference in New Issue
Block a user