Files
lanyuanxiaoyao 7eab1dcef1 test: 添加全面的测试套件,覆盖所有 Reader 实现
- 测试数量从 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 个测试通过。
2026-03-08 22:20:21 +08:00

125 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 异常(或返回失败信息)