v1.0.0: PinMAP → PinList 转换器 首次发布

- 支持 .xls (BIFF8) 和 .xlsx 格式
- GUI 文件选择 + 命令行双模式
- 智能结构验证(重复/间隙/空单元格检测)
- 逆时针 PinMAP → 顺时针 PinList 自动转换
- Python 标准库,零第三方依赖
This commit is contained in:
2026-05-25 13:27:08 +08:00
commit 6b718f7af3
24 changed files with 2720 additions and 0 deletions

BIN
Test/fixtures/error_dup.xlsx vendored Normal file

Binary file not shown.

BIN
Test/fixtures/error_empty_a1.xlsx vendored Normal file

Binary file not shown.

BIN
Test/fixtures/error_gap.xlsx vendored Normal file

Binary file not shown.

BIN
Test/fixtures/sample_4x4.xlsx vendored Normal file

Binary file not shown.

BIN
Test/fixtures/sample_rect.xlsx vendored Normal file

Binary file not shown.

BIN
Test/fixtures/warning_missing.xlsx vendored Normal file

Binary file not shown.

149
Test/test_report.md Normal file
View File

@@ -0,0 +1,149 @@
# PinMAP → PinList 转换器 测试报告
> **日期**: 2026-05-25
> **测试类型**: 集成测试 + 端到端测试
> **测试环境**: Python 3.x, Linux x64
---
## 测试概览
| 类别 | 用例数 | 通过 | 失败 |
|------|--------|------|------|
| 标准转换 | 2 | 2 | 0 |
| 错误场景 | 3 | 3 | 0 |
| 边界条件 | 1 | 1 | 0 |
| **总计** | **6** | **6** | **0** |
---
## 测试用例详情
### TC001: 标准4x4 PinMAP 转换
- **输入**: `fixtures/sample_4x4.xlsx` (QFP44, 8个Pin)
- **预期**: 正确解析8个Pin逆时针1-8输出PinList递增排序
- **实际**: ✅ 解析8个PinPin1→Pin8序号递增A1=QFP44
- **结果**: **通过**
### TC002: 长方形PinMAP转换
- **输入**: `fixtures/sample_rect.xlsx` (LQFP100, 13个Pin)
- **预期**: 正确解析13个Pin逆时针排序
- **实际**: ✅ 解析13个Pin逆时针顺序正确
- **结果**: **通过**
### TC003: 序号不连续检测
- **输入**: `fixtures/error_gap.xlsx` (缺失序号3)
- **预期**: 报错"Pin序号不连续",给出缺失序号[3]
- **实际**: ✅ 报错"Pin序号不连续 - 缺失的序号: [3]"
- **结果**: **通过**
### TC004: 序号重复检测
- **输入**: `fixtures/error_dup.xlsx` (序号2重复)
- **预期**: 报错"Pin序号重复",给出重复序号[2]
- **实际**: ✅ 报错"Pin序号重复 - 重复的序号: [2]"
- **结果**: **通过**
### TC005: PinName缺失警告
- **输入**: `fixtures/warning_missing.xlsx` (部分Pin缺少PinName)
- **预期**: 警告"检测到N个引脚缺少PinName"自动设为NC
- **实际**: ✅ 警告"检测到3个引脚缺少PinName",缺失序号[2,3,4]
- **结果**: **通过**
### TC006: A1为空检测
- **输入**: `fixtures/error_empty_a1.xlsx` (A1单元格为空)
- **预期**: 报错"A1单元格为空缺少封装信息"
- **实际**: ✅ 捕获StructureError: "A1 单元格为空,缺少封装信息"
- **结果**: **通过**
---
## 端到端测试
### main.py 命令行模式
```bash
python main.py /tmp/test_4x4.xlsx
```
**输出**:
```
[INFO] 解析完成: 6x6 方形,共 8 个Pin
[INFO] 封装信息: QFP44
[SUCCESS] 转换完成!输出文件: /tmp/test_4x4_PinList.xlsx
- 封装信息: QFP44
- Pin数量: 8
```
**结果**: ✅ 通过
### 输出文件验证
- **输入**: `sample_4x4.xlsx`**输出**: `sample_4x4_PinList.xlsx`
- **A1**: QFP44 ✅
- **A列**: Pin1, Pin2, Pin3, Pin4, Pin5, Pin6, Pin7, Pin8 ✅
- **B列**: 1, 2, 3, 4, 5, 6, 7, 8 ✅
- **排序**: 递增 ✅
---
## 模块单元测试
### xlsx_roundtrip
- 写入 → 读取 → 验证数据一致 ✅
### pinmap_parser
- 4x4方形解析 ✅
- 长方形解析 ✅
- 角点去重 ✅
### validator
- 连续性检查 ✅
- 唯一性检查 ✅
- PinName缺失检测 ✅
- 结构完整性检查 ✅
### pinlist_generator
- PinList生成 ✅
- NC默认值 ✅
- 递增排序 ✅
---
## 问题汇总
| 问题 | 严重性 | 状态 |
|------|--------|------|
| 无 | - | - |
**所有测试用例通过,无阻塞性问题。**
---
## 改进建议
1. **XLS读取测试**: 当前环境无.xls测试样本建议在Windows环境用真实.xls文件验证BIFF8解析
2. **字体格式保留**: 当前版本未实现字体格式保留(架构设计中有提及),可在后续版本添加
3. **GUI模式**: tkinter文件选择对话框在Linux无头环境下需回退到命令行参数已实现
4. **性能优化**: 当前实现适合<1000引脚场景超大文件可后续优化
---
## 结论
**所有测试用例通过,项目可进入发布阶段。**
**交付物清单**:
- `Code/src/main.py` — 主入口
- `Code/src/file_selector.py` — 文件选择
- `Code/src/xls_reader.py` — XLS读取引擎 (19KB)
- `Code/src/xlsx_reader.py` — XLSX读取引擎
- `Code/src/xlsx_writer.py` — XLSX写入引擎
- `Code/src/pinmap_parser.py` — PinMAP解析器
- `Code/src/validator.py` — 数据验证器
- `Code/src/pinlist_generator.py` — PinList生成器
- `Code/src/models.py` — 数据模型
- `Code/src/utils.py` — 工具函数
- `Code/docs/architecture-design.md` — 架构设计文档
- `Test/fixtures/` — 测试夹具 (6个文件)
- `Test/test_report.md` — 测试报告
---
*测试完成 — 2026-05-25*