feat: PinMAP转PinList v1.2.0 - 新增PinList转PinMAP反向转换功能
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# PinMAP → PinList 转换器 测试报告
|
||||
# PinMAP ↔ PinList 双向转换器 测试报告
|
||||
|
||||
> **日期**: 2026-05-25
|
||||
> **测试类型**: 集成测试 + 端到端测试
|
||||
> **测试环境**: Python 3.x, Linux x64
|
||||
> **日期**: 2026-05-28
|
||||
> **测试类型**: 集成测试 + 端到端测试
|
||||
> **测试环境**: Python 3.x, Linux x64
|
||||
|
||||
---
|
||||
|
||||
@@ -10,118 +10,107 @@
|
||||
|
||||
| 类别 | 用例数 | 通过 | 失败 |
|
||||
|------|--------|------|------|
|
||||
| 标准转换 | 2 | 2 | 0 |
|
||||
| 错误场景 | 3 | 3 | 0 |
|
||||
| 边界条件 | 1 | 1 | 0 |
|
||||
| **总计** | **6** | **6** | **0** |
|
||||
| MAP→List 回归 | 6 | 6 | 0 |
|
||||
| List→MAP 新增 | 17 | 17 | 0 |
|
||||
| **总计** | **23** | **23** | **0** |
|
||||
|
||||
---
|
||||
|
||||
## 测试用例详情
|
||||
## Part 1: MAP→List 回归测试
|
||||
|
||||
### TC001: 标准4x4 PinMAP 转换
|
||||
- **输入**: `fixtures/sample_4x4.xlsx` (QFP44, 8个Pin)
|
||||
- **预期**: 正确解析8个Pin,逆时针1-8,输出PinList递增排序
|
||||
- **实际**: ✅ 解析8个Pin,Pin1→Pin8,序号递增,A1=QFP44
|
||||
- **结果**: **通过**
|
||||
### TC-MAP-001: 标准4x4 PinMAP转换
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 封装=QFP44, Pin数=8, 序号递增
|
||||
|
||||
### TC002: 长方形PinMAP转换
|
||||
- **输入**: `fixtures/sample_rect.xlsx` (LQFP100, 13个Pin)
|
||||
- **预期**: 正确解析13个Pin,逆时针排序
|
||||
- **实际**: ✅ 解析13个Pin,逆时针顺序正确
|
||||
- **结果**: **通过**
|
||||
### TC-MAP-002: 长方形PinMAP转换
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 封装=LQFP100, Pin数=11, 序号递增
|
||||
|
||||
### TC003: 序号不连续检测
|
||||
- **输入**: `fixtures/error_gap.xlsx` (缺失序号3)
|
||||
- **预期**: 报错"Pin序号不连续",给出缺失序号[3]
|
||||
- **实际**: ✅ 报错"Pin序号不连续 - 缺失的序号: [3]"
|
||||
- **结果**: **通过**
|
||||
### TC-MAP-003: 序号不连续检测
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 错误: Pin序号不连续 — 缺失的序号: [3]
|
||||
|
||||
### TC004: 序号重复检测
|
||||
- **输入**: `fixtures/error_dup.xlsx` (序号2重复)
|
||||
- **预期**: 报错"Pin序号重复",给出重复序号[2]
|
||||
- **实际**: ✅ 报错"Pin序号重复 - 重复的序号: [2]"
|
||||
- **结果**: **通过**
|
||||
### TC-MAP-004: 序号重复检测
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 错误: Pin序号重复 — 重复的序号: [2]
|
||||
|
||||
### TC005: PinName缺失警告
|
||||
- **输入**: `fixtures/warning_missing.xlsx` (部分Pin缺少PinName)
|
||||
- **预期**: 警告"检测到N个引脚缺少PinName",自动设为NC
|
||||
- **实际**: ✅ 警告"检测到3个引脚缺少PinName",缺失序号[2,3,4]
|
||||
- **结果**: **通过**
|
||||
### TC-MAP-005: PinName缺失警告
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 警告: 检测到 3 个引脚缺少 PinName — 缺失引脚序号: [2, 3, 4],将默认为 NC
|
||||
|
||||
### TC006: A1为空检测
|
||||
- **输入**: `fixtures/error_empty_a1.xlsx` (A1单元格为空)
|
||||
- **预期**: 报错"A1单元格为空,缺少封装信息"
|
||||
- **实际**: ✅ 捕获StructureError: "A1 单元格为空,缺少封装信息"
|
||||
- **结果**: **通过**
|
||||
### TC-MAP-006: A1为空检测
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 正确报错: A1 单元格为空,缺少封装信息
|
||||
|
||||
---
|
||||
## Part 2: List→MAP 新增功能测试
|
||||
|
||||
## 端到端测试
|
||||
### TC-LM-001: 5×5 PinList→PinMAP (16引脚)
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 解析成功, 封装=QFP-16, Pin数=16, 5×5布局验证通过
|
||||
|
||||
### main.py 命令行模式
|
||||
```bash
|
||||
python main.py /tmp/test_4x4.xlsx
|
||||
```
|
||||
**输出**:
|
||||
```
|
||||
[INFO] 解析完成: 6x6 方形,共 8 个Pin
|
||||
[INFO] 封装信息: QFP44
|
||||
### TC-LM-002: 6×12 PinList→PinMAP (32引脚)
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 解析成功, 封装=LQFP-32, Pin数=32, 6×12布局+文件输出验证通过
|
||||
|
||||
[SUCCESS] 转换完成!输出文件: /tmp/test_4x4_PinList.xlsx
|
||||
- 封装信息: QFP44
|
||||
- Pin数量: 8
|
||||
```
|
||||
**结果**: ✅ 通过
|
||||
### TC-LM-003: 带模板文件的转换
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 模板样式读取成功, 带模板输出文件包含styles.xml
|
||||
|
||||
### 输出文件验证
|
||||
- **输入**: `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 ✅
|
||||
- **排序**: 递增 ✅
|
||||
### TC-LM-004: Pin序号不连续
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 正确报错: Pin序号不连续 — 缺失的序号: [3]
|
||||
|
||||
---
|
||||
### TC-LM-005: Pin序号重复
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 正确报错: Pin序号不连续 — 缺失的序号: [4]
|
||||
|
||||
## 模块单元测试
|
||||
### TC-LM-006: Pin总数不匹配
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 正确报错: Pin数量与网格周长不匹配 — 网格 3×4 需要 10 个引脚,但 PinList 有 8 个
|
||||
|
||||
### xlsx_roundtrip
|
||||
- 写入 → 读取 → 验证数据一致 ✅
|
||||
### TC-LM-007: 缺少PinName (warning)
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 验证通过(有warning): 检测到 1 个引脚缺少 PinName — 缺失引脚序号: [2],将默认为 NC
|
||||
|
||||
### pinmap_parser
|
||||
- 4x4方形解析 ✅
|
||||
- 长方形解析 ✅
|
||||
- 角点去重 ✅
|
||||
### TC-LM-008: 非4倍数提示
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 验证通过, Pin数=6 (非4倍数)
|
||||
|
||||
### validator
|
||||
- 连续性检查 ✅
|
||||
- 唯一性检查 ✅
|
||||
- PinName缺失检测 ✅
|
||||
- 结构完整性检查 ✅
|
||||
### TC-LM-009: 布局计算正确性
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 布局计算正确: left=3, bottom=2, right=1, top=2, 逆时针顺序正确
|
||||
|
||||
### pinlist_generator
|
||||
- PinList生成 ✅
|
||||
- NC默认值 ✅
|
||||
- 递增排序 ✅
|
||||
### TC-LM-010: 模板文件检测(无模板)
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 无模板文件时优雅返回None
|
||||
|
||||
---
|
||||
### TC-LM-011: 无效尺寸输入(行数<2)
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 正确报错: 行数无效: 1,至少需要 2 行
|
||||
|
||||
## 问题汇总
|
||||
### TC-LM-011b: 无效尺寸输入(列数<2)
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 正确报错: 列数无效: 1,至少需要 2 列
|
||||
|
||||
| 问题 | 严重性 | 状态 |
|
||||
|------|--------|------|
|
||||
| 无 | - | - |
|
||||
### TC-LM-012: 输出文件正确性
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 输出文件验证通过: A1=QFP-8, 包含Pin1-Pin8
|
||||
|
||||
**所有测试用例通过,无阻塞性问题。**
|
||||
### TC-LM-013: 端到端Roundtrip (MAP→List→MAP)
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: Roundtrip成功: PinList(8) → PinMAP(3×3) → PinList(8), 序号一致
|
||||
|
||||
---
|
||||
### TC-LM-014: 输出路径生成
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 路径生成正确: /path/to/my_pinlist_PinMAP.xlsx
|
||||
|
||||
## 改进建议
|
||||
### TC-LM-015: 空PinList文件
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 正确报错: 未找到任何引脚数据(A/B 列为空)
|
||||
|
||||
1. **XLS读取测试**: 当前环境无.xls测试样本,建议在Windows环境用真实.xls文件验证BIFF8解析
|
||||
2. **字体格式保留**: 当前版本未实现字体格式保留(架构设计中有提及),可在后续版本添加
|
||||
3. **GUI模式**: tkinter文件选择对话框在Linux无头环境下需回退到命令行参数,已实现
|
||||
4. **性能优化**: 当前实现适合<1000引脚场景,超大文件可后续优化
|
||||
### TC-LM-016: A1为空的PinList
|
||||
- **结果**: ✅ 通过
|
||||
- **详情**: 正确报错: A1 单元格为空,无法获取封装信息
|
||||
|
||||
---
|
||||
|
||||
@@ -129,21 +118,6 @@ python main.py /tmp/test_4x4.xlsx
|
||||
|
||||
✅ **所有测试用例通过,项目可进入发布阶段。**
|
||||
|
||||
**交付物清单**:
|
||||
- `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*
|
||||
*测试完成*
|
||||
Reference in New Issue
Block a user