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:
91
openspec/specs/cli-testing/spec.md
Normal file
91
openspec/specs/cli-testing/spec.md
Normal 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 自动处理互斥,只允许一个选项生效
|
||||
Reference in New Issue
Block a user