# 导入重复检测测试使用说明 ## 概述 本测试套件用于验证"导入文件内部主键重复检测"功能,确保系统能够正确识别并处理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)