- 测试数量从 83 个增加到 193 个 (+132%) - 代码覆盖率从 48% 提升到 69% (+44%) - 为每种文档格式的所有 Reader 实现创建独立测试 - 添加跨 Reader 的一致性验证测试 - 新增 4 个测试规范 (cli-testing, exception-testing, reader-testing, test-fixtures) - 更新 README 测试统计信息 测试覆盖: - DOCX: python-docx, markitdown, docling, native-xml, pypandoc, unstructured - PDF: pypdf, markitdown, docling, docling-ocr, unstructured, unstructured-ocr - HTML: html2text, markitdown, trafilatura, domscribe - PPTX: python-pptx, markitdown, docling, native-xml, unstructured - XLSX: pandas, markitdown, docling, native-xml, unstructured - CLI: 所有命令行选项和错误处理 所有 193 个测试通过。
125 lines
4.9 KiB
Markdown
125 lines
4.9 KiB
Markdown
# Exception Testing Specification
|
||
|
||
## Purpose
|
||
|
||
定义异常场景的测试规范,包括文件不存在、空文件、损坏文件、编码问题等异常情况的处理。
|
||
|
||
## Requirements
|
||
|
||
### Requirement: 文件不存在异常处理
|
||
Reader 解析不存在的文件时,MUST 返回 None 作为内容和包含错误信息的失败列表。
|
||
|
||
#### Scenario: DOCX Reader 文件不存在
|
||
- **WHEN** DOCX Reader 解析不存在的文件路径
|
||
- **THEN** 返回 (None, [包含"文件不存在"或"找不到"的失败信息])
|
||
|
||
#### Scenario: PDF Reader 文件不存在
|
||
- **WHEN** PDF Reader 解析不存在的文件路径
|
||
- **THEN** 返回 (None, [包含错误信息的失败列表])
|
||
|
||
#### Scenario: HTML Reader 文件不存在
|
||
- **WHEN** HTML Reader 解析不存在的文件路径
|
||
- **THEN** 返回 (None, [包含错误信息的失败列表])
|
||
|
||
### Requirement: 空文件异常处理
|
||
Reader 解析空文件时,MUST 返回 None 或空字符串作为内容,并包含失败信息。
|
||
|
||
#### Scenario: DOCX Reader 空文件
|
||
- **WHEN** DOCX Reader 解析没有任何内容的 DOCX 文件
|
||
- **THEN** 返回 (None 或空字符串, [包含"空"或"无内容"的失败信息])
|
||
|
||
#### Scenario: PDF Reader 空文件
|
||
- **WHEN** PDF Reader 解析空白 PDF 文件
|
||
- **THEN** 返回 (None 或空字符串, [包含错误信息的失败列表])
|
||
|
||
### Requirement: 损坏文件异常处理
|
||
Reader 解析损坏的文件时,MUST 返回 None 作为内容和包含解析失败原因的失败列表。
|
||
|
||
#### Scenario: DOCX Reader 损坏文件
|
||
- **WHEN** DOCX Reader 解析文件头被破坏的 DOCX 文件
|
||
- **THEN** 返回 (None, [包含"解析失败"或"损坏"的失败信息])
|
||
|
||
#### Scenario: PDF Reader 损坏文件
|
||
- **WHEN** PDF Reader 解析结构损坏的 PDF 文件
|
||
- **THEN** 返回 (None, [包含"解析失败"的失败信息])
|
||
|
||
#### Scenario: 损坏文件创建方式
|
||
- **WHEN** 测试需要损坏文件
|
||
- **THEN** 创建正常文件后以二进制方式破坏部分内容(如覆盖文件头)
|
||
|
||
### Requirement: 编码问题异常处理
|
||
Reader 解析包含编码问题的文件时,MUST 能正确处理或返回明确的错误信息。
|
||
|
||
#### Scenario: HTML Reader 编码声明与实际不符
|
||
- **WHEN** HTML 文件声明的编码与实际内容编码不一致
|
||
- **THEN** Reader 能够检测并正确解析,或返回明确的编码错误信息
|
||
|
||
#### Scenario: HTML Reader 处理 GBK 编码
|
||
- **WHEN** HTML 文件使用 GBK 编码
|
||
- **THEN** Reader 能够正确解析中文内容
|
||
|
||
#### Scenario: HTML Reader 处理 UTF-8 BOM
|
||
- **WHEN** HTML 文件包含 UTF-8 BOM 标记
|
||
- **THEN** Reader 能够正确解析
|
||
|
||
### Requirement: 异常测试跟随功能测试
|
||
异常场景测试 MUST 与对应的功能测试放在同一个测试类中,不单独建立测试类。
|
||
|
||
#### Scenario: 文件不存在测试在 Parse 类中
|
||
- **WHEN** 查看 Reader 的测试文件
|
||
- **THEN** `test_file_not_exists` 位于 `TestXxxReaderParse` 类中
|
||
|
||
#### Scenario: 空文件测试在 Parse 类中
|
||
- **WHEN** 查看 Reader 的测试文件
|
||
- **THEN** `test_empty_file` 位于 `TestXxxReaderParse` 类中
|
||
|
||
#### Scenario: 损坏文件测试在 Parse 类中
|
||
- **WHEN** 查看 Reader 的测试文件
|
||
- **THEN** `test_corrupted_file` 位于 `TestXxxReaderParse` 类中
|
||
|
||
#### Scenario: 特殊字符测试在 Parse 类中
|
||
- **WHEN** 查看 Reader 的测试文件
|
||
- **THEN** `test_special_chars` 位于 `TestXxxReaderParse` 类中
|
||
|
||
### Requirement: CLI 异常处理
|
||
CLI 遇到错误时,MUST 输出清晰的错误信息并以非零状态退出。
|
||
|
||
#### Scenario: CLI 文件不存在
|
||
- **WHEN** 用户执行 CLI 指定不存在的文件
|
||
- **THEN** 程序输出错误信息并以状态码 1 退出
|
||
|
||
#### Scenario: CLI 不支持的文件类型
|
||
- **WHEN** 用户执行 CLI 指定不支持的文件类型
|
||
- **THEN** 程序输出"未找到支持的 reader"错误信息
|
||
|
||
#### Scenario: CLI 所有解析失败
|
||
- **WHEN** 所有 Reader 解析均失败
|
||
- **THEN** 程序输出"所有解析方法均失败"并列出各 Reader 的失败原因
|
||
|
||
#### Scenario: CLI 无效的正则表达式
|
||
- **WHEN** 用户使用 `-s` 选项提供无效的正则表达式
|
||
- **THEN** 程序输出"正则表达式无效"错误信息
|
||
|
||
#### Scenario: CLI 标题不存在
|
||
- **WHEN** 用户使用 `-tc` 选项指定不存在的标题
|
||
- **THEN** 程序输出"未找到标题"错误信息
|
||
|
||
### Requirement: 自定义异常使用
|
||
代码中定义的自定义异常 MUST 在适当场景中被抛出和捕获。
|
||
|
||
#### Scenario: FileDetectionError 抛出
|
||
- **WHEN** 输入路径为空或无法检测文件类型
|
||
- **THEN** 抛出 FileDetectionError 异常
|
||
|
||
#### Scenario: ReaderNotFoundError 抛出
|
||
- **WHEN** 没有找到支持该格式的 Reader
|
||
- **THEN** 抛出 ReaderNotFoundError 异常
|
||
|
||
#### Scenario: ParseError 抛出
|
||
- **WHEN** 文件解析过程中发生错误
|
||
- **THEN** Reader 可以在内部捕获异常并返回失败信息
|
||
|
||
#### Scenario: DownloadError 抛出
|
||
- **WHEN** HTML 下载器下载 URL 内容失败
|
||
- **THEN** 抛出 DownloadError 异常(或返回失败信息)
|