Files
lyxy-document/openspec/specs/test-fixtures/spec.md
lanyuanxiaoyao fad0edc46a feat: 添加 doc/xls/ppt 旧格式文档静态测试文件支持
- 更新 .gitattributes,将 fixtures 目录所有文件纳入 Git LFS
- 在 tests/test_readers/conftest.py 中添加静态文件 fixtures
- 添加 doc/xls/ppt 静态测试文件(9个文件)
- 更新各旧格式解析器测试用例使用静态文件
- 更新一致性测试使用静态文件
- 在 README.md 中添加 fixtures 使用规范
- 同步 delta specs 到主 specs(doc-reader/xls-reader/ppt-reader/reader-testing/test-fixtures)
- 归档 add-static-test-fixtures 变更
2026-03-11 00:30:47 +08:00

172 lines
6.9 KiB
Markdown
Raw 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.
# Test Fixtures Specification
## Purpose
定义测试 fixtures 的规范,包括临时文件创建、自动清理、fixture 组织结构等。
## Requirements
### Requirement: 临时文件自动清理
测试使用的临时文件 MUST 在测试完成后自动清理,使用 pytest 的 tmp_path fixture。
#### Scenario: 测试完成后临时文件被删除
- **WHEN** 测试使用 tmp_path 创建临时文件
- **THEN** 测试结束后临时文件自动删除
#### Scenario: 测试失败时可保留文件
- **WHEN** 使用 `--tmp-path-retention-count` 参数运行测试
- **THEN** 失败测试的临时文件被保留用于调试
### Requirement: 临时文件独立创建
每个测试 MUST 独立创建自己的临时文件,不共享文件,保证测试隔离。
#### Scenario: 每个测试独立创建文件
- **WHEN** 多个测试使用相同 fixture
- **THEN** 每个测试获得独立的临时文件实例
#### Scenario: 测试间无文件共享
- **WHEN** 测试 A 创建并修改临时文件
- **THEN** 测试 B 的临时文件不受影响
### Requirement: 全局 conftest fixtures
tests/conftest.py MUST 提供全局可用的 fixtures。
#### Scenario: 提供 all_readers fixture
- **WHEN** 测试需要所有 Reader 实例
- **THEN** 可以使用 `all_readers` fixture 获取完整的 Reader 列表
### Requirement: Reader 专用 fixtures
tests/test_readers/conftest.py MUST 提供 Reader 测试专用的 fixtures。
#### Scenario: 提供 temp_docx fixture
- **WHEN** 测试需要临时 DOCX 文件
- **THEN** 可以使用 `temp_docx` fixture 创建临时 DOCX 文件
- **AND** fixture 接受参数(如 paragraphs、table_data自定义内容
#### Scenario: 提供 temp_pdf fixture
- **WHEN** 测试需要临时 PDF 文件
- **THEN** 可以使用 `temp_pdf` fixture 创建临时 PDF 文件
#### Scenario: 提供 temp_html fixture
- **WHEN** 测试需要临时 HTML 文件
- **THEN** 可以使用 `temp_html` fixture 创建临时 HTML 文件
#### Scenario: 提供 temp_pptx fixture
- **WHEN** 测试需要临时 PPTX 文件
- **THEN** 可以使用 `temp_pptx` fixture 创建临时 PPTX 文件
#### Scenario: 提供 temp_xlsx fixture
- **WHEN** 测试需要临时 XLSX 文件
- **THEN** 可以使用 `temp_xlsx` fixture 创建临时 XLSX 文件
#### Scenario: 提供 doc 静态文件 fixtures
- **WHEN** 测试需要 doc 静态测试文件
- **THEN** 可以使用 `simple_doc_path``with_headings_doc_path``with_table_doc_path`
#### Scenario: 提供 xls 静态文件 fixtures
- **WHEN** 测试需要 xls 静态测试文件
- **THEN** 可以使用 `simple_xls_path``multiple_sheets_xls_path``with_formulas_xls_path`
#### Scenario: 提供 ppt 静态文件 fixtures
- **WHEN** 测试需要 ppt 静态测试文件
- **THEN** 可以使用 `simple_ppt_path``multiple_slides_ppt_path``with_images_ppt_path`
### Requirement: CLI 专用 fixtures
tests/test_cli/conftest.py MUST 提供 CLI 测试专用的 fixtures。
#### Scenario: 提供 cli_runner fixture
- **WHEN** 测试需要运行 CLI
- **THEN** 可以使用 `cli_runner` fixture 调用 main() 函数并捕获输出
- **AND** 返回 (stdout, stderr) 元组
#### Scenario: 提供 temp_test_file fixture
- **WHEN** CLI 测试需要临时测试文件
- **THEN** 可以使用 `temp_test_file` fixture 根据格式类型创建对应文件
### Requirement: Fixture 返回文件路径
所有创建临时文件的 fixtures MUST 返回文件路径字符串,而非 Path 对象或文件对象。
#### Scenario: temp_docx 返回路径字符串
- **WHEN** 调用 `temp_docx(paragraphs=["test"])`
- **THEN** 返回临时文件的路径字符串(如 "/tmp/pytest-of-user/test.docx"
### Requirement: DOCX 文件创建能力
temp_docx fixture MUST 支持创建包含段落、标题、表格、列表的 DOCX 文件。
#### Scenario: 创建包含段落的 DOCX
- **WHEN** 调用 `temp_docx(paragraphs=["第一段", "第二段"])`
- **THEN** 创建包含指定段落的 DOCX 文件
#### Scenario: 创建包含表格的 DOCX
- **WHEN** 调用 `temp_docx(table_data=[["A1", "B1"], ["A2", "B2"]])`
- **THEN** 创建包含 2x2 表格的 DOCX 文件
#### Scenario: 创建包含混合内容的 DOCX
- **WHEN** 调用 `temp_docx(paragraphs=["标题"], table_data=[["A", "B"]])`
- **THEN** 创建包含段落和表格的 DOCX 文件
### Requirement: PDF 文件创建能力
temp_pdf fixture MUST 支持创建包含基本文本的 PDF 文件。
#### Scenario: 创建包含文本的 PDF
- **WHEN** 调用 `temp_pdf(text="测试内容")`
- **THEN** 创建包含指定文本的 PDF 文件
### Requirement: HTML 文件创建能力
temp_html fixture MUST 支持创建包含各种元素的 HTML 文件。
#### Scenario: 创建包含标题和段落的 HTML
- **WHEN** 调用 `temp_html(content="<h1>标题</h1><p>段落</p>")`
- **THEN** 创建包含指定内容的 HTML 文件
### Requirement: 静态测试文件目录结构
项目 MUST 在 `tests/test_readers/fixtures/` 下按格式类型组织静态测试文件。
#### Scenario: doc 静态文件目录
- **WHEN** 查看 `tests/test_readers/fixtures/doc/`
- **THEN** 目录存在且包含 .doc 静态测试文件
#### Scenario: xls 静态文件目录
- **WHEN** 查看 `tests/test_readers/fixtures/xls/`
- **THEN** 目录存在且包含 .xls 静态测试文件
#### Scenario: ppt 静态文件目录
- **WHEN** 查看 `tests/test_readers/fixtures/ppt/`
- **THEN** 目录存在且包含 .ppt 静态测试文件
### Requirement: fixtures 目录所有文件纳入 Git LFS
`tests/test_readers/fixtures/` 目录下的 ALL 文件 MUST 纳入 Git LFS 管理。
#### Scenario: .gitattributes 配置正确
- **WHEN** 查看 `.gitattributes`
- **THEN** 包含 `tests/test_readers/fixtures/**/*` 的 LFS 配置,匹配该目录下所有文件
### Requirement: fixtures 目录仅存放静态文件
`tests/test_readers/fixtures/` 目录 MUST 仅用于存放预先准备的静态测试文件,禁止在测试中向该目录动态生成临时文件。
#### Scenario: 不向 fixtures 目录写入临时文件
- **WHEN** 测试运行时
- **THEN** 不会在 `tests/test_readers/fixtures/` 下创建或修改文件
- **AND** 临时文件使用 pytest 的 tmp_path 在其他位置创建
### Requirement: 静态测试文件 Fixture
`tests/test_readers/conftest.py` MUST 提供访问静态测试文件的 fixtures。
#### Scenario: 提供目录路径 fixture
- **WHEN** 测试需要访问静态文件目录
- **THEN** 可以使用 `doc_fixture_path``xls_fixture_path``ppt_fixture_path` 获取对应目录路径
#### Scenario: 提供单个文件 fixture
- **WHEN** 测试需要访问特定静态文件
- **THEN** 可以使用 `simple_doc_path``with_headings_doc_path` 等便捷 fixture
- **AND** 文件不存在时自动 pytest.skip
### Requirement: fixtures 使用规范写入开发文档
fixtures 目录的使用规范 MUST 写入 README.md 开发文档。
#### Scenario: README 包含 fixtures 规范
- **WHEN** 查看 README.md
- **THEN** 包含 fixtures 目录的用途说明
- **AND** 包含静态文件与临时文件的区别说明
- **AND** 包含 Git LFS 配置说明