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 个测试通过。
This commit is contained in:
2026-03-08 22:20:21 +08:00
parent c35bbc90b5
commit 7eab1dcef1
53 changed files with 3094 additions and 259 deletions

View File

@@ -0,0 +1,91 @@
# CLI Testing Specification
## Purpose
定义 CLI 命令行工具的功能测试规范,包括输出格式、选项处理、错误处理等。
## Requirements
### Requirement: CLI 输出解析内容
CLI 在不指定任何选项时MUST 输出完整的解析后 Markdown 内容到标准输出。
#### Scenario: 解析 DOCX 文件
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx`
- **THEN** 标准输出包含解析后的 Markdown 内容
#### Scenario: 解析 PDF 文件
- **WHEN** 用户执行 `python lyxy_document_reader.py file.pdf`
- **THEN** 标准输出包含解析后的 Markdown 内容
#### Scenario: 解析 HTML 文件
- **WHEN** 用户执行 `python lyxy_document_reader.py file.html`
- **THEN** 标准输出包含解析后的 Markdown 内容
### Requirement: CLI 统计字数
CLI 使用 `-c``--count` 选项时MUST 输出解析后内容的字符总数(不包含换行符)。
#### Scenario: 统计 DOCX 字数
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx -c`
- **THEN** 标准输出仅包含一个表示字符总数的数字
### Requirement: CLI 统计行数
CLI 使用 `-l``--lines` 选项时MUST 输出解析后的行数。
#### Scenario: 统计行数
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx -l`
- **THEN** 标准输出仅包含一个表示行数的数字
### Requirement: CLI 提取标题
CLI 使用 `-t``--titles` 选项时MUST 输出所有 1-6 级标题行。
#### Scenario: 提取所有标题
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx -t`
- **THEN** 标准输出包含所有标题行,每行一个标题
### Requirement: CLI 提取标题内容
CLI 使用 `-tc``--title-content` 选项时MUST 输出指定标题及其下级内容。
#### Scenario: 提取存在的标题内容
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx -tc "章节标题"`
- **THEN** 标准输出包含该标题及其下级内容(不包含 # 号)
#### Scenario: 提取不存在的标题
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx -tc "不存在的标题"`
- **THEN** 程序输出错误信息并以非零状态退出
### Requirement: CLI 搜索内容
CLI 使用 `-s``--search` 选项时MUST 使用正则表达式搜索文档并输出匹配结果。
#### Scenario: 搜索匹配内容
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx -s "关键词"`
- **THEN** 标准输出包含所有匹配的上下文,用 `---` 分隔
#### Scenario: 搜索无匹配内容
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx -s "不存在的内容"`
- **THEN** 程序输出错误信息并以非零状态退出
#### Scenario: 搜索使用上下文行数
- **WHEN** 用户执行 `python lyxy_document_reader.py file.docx -s "关键词" -n 5`
- **THEN** 输出每个匹配结果前后各 5 行非空内容
### Requirement: CLI 错误处理
CLI 遇到错误时MUST 输出清晰的错误信息并以非零状态退出。
#### Scenario: 文件不存在
- **WHEN** 用户执行 `python lyxy_document_reader.py nonexistent.docx`
- **THEN** 程序输出错误信息并以状态码 1 退出
#### Scenario: 不支持的文件类型
- **WHEN** 用户执行 `python lyxy_document_reader.py unsupported.xyz`
- **THEN** 程序输出未找到支持 reader 的错误信息
#### Scenario: 所有解析方法失败
- **WHEN** 所有 Reader 解析均失败
- **THEN** 程序输出各 Reader 的失败原因列表
### Requirement: CLI 选项互斥
CLI 的输出选项(`-c``-l``-t``-tc``-s`MUST 互斥,不能同时使用。
#### Scenario: 默认输出与其他选项冲突
- **WHEN** 用户尝试使用多个输出选项
- **THEN** argparse 自动处理互斥,只允许一个选项生效