test: 修复测试静默跳过问题,统一conftest行为
- 移除 test_readers/conftest.py 中重复的 temp_docx/temp_pdf/temp_pptx/temp_xlsx fixtures - 统一测试行为:依赖缺失时测试失败而非静默跳过 - 修复根 conftest.py 中裸露的 except 子句,改为 except Exception - 保留 temp_html 和静态文件相关 fixtures
This commit is contained in:
@@ -109,7 +109,7 @@ def temp_pdf(tmp_path):
|
|||||||
# 使用系统字体
|
# 使用系统字体
|
||||||
pdfmetrics.registerFont(TTFont('SimSun', 'simsun.ttc'))
|
pdfmetrics.registerFont(TTFont('SimSun', 'simsun.ttc'))
|
||||||
c.setFont('SimSun', 12)
|
c.setFont('SimSun', 12)
|
||||||
except:
|
except Exception:
|
||||||
# 回退到默认字体
|
# 回退到默认字体
|
||||||
c.setFont('Helvetica', 12)
|
c.setFont('Helvetica', 12)
|
||||||
|
|
||||||
|
|||||||
@@ -4,108 +4,6 @@ import pytest
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def temp_docx(tmp_path):
|
|
||||||
"""创建临时 DOCX 文件的 fixture 工厂。
|
|
||||||
|
|
||||||
Args:
|
|
||||||
paragraphs: 段落文本列表
|
|
||||||
headings: 标题列表,格式为 [(level, text), ...]
|
|
||||||
table_data: 表格数据,格式为 [[cell1, cell2], [cell3, cell4]]
|
|
||||||
list_items: 列表项列表
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: 临时文件路径
|
|
||||||
"""
|
|
||||||
def _create_docx(paragraphs=None, headings=None, table_data=None, list_items=None):
|
|
||||||
try:
|
|
||||||
from docx import Document
|
|
||||||
except ImportError:
|
|
||||||
pytest.skip("python-docx 未安装")
|
|
||||||
|
|
||||||
doc = Document()
|
|
||||||
|
|
||||||
# 添加标题
|
|
||||||
if headings:
|
|
||||||
for level, text in headings:
|
|
||||||
doc.add_heading(text, level=level)
|
|
||||||
|
|
||||||
# 添加段落
|
|
||||||
if paragraphs:
|
|
||||||
for para_text in paragraphs:
|
|
||||||
doc.add_paragraph(para_text)
|
|
||||||
|
|
||||||
# 添加表格
|
|
||||||
if table_data:
|
|
||||||
table = doc.add_table(rows=len(table_data), cols=len(table_data[0]))
|
|
||||||
for i, row_data in enumerate(table_data):
|
|
||||||
for j, cell_text in enumerate(row_data):
|
|
||||||
table.rows[i].cells[j].text = str(cell_text)
|
|
||||||
|
|
||||||
# 添加列表项
|
|
||||||
if list_items:
|
|
||||||
for item in list_items:
|
|
||||||
doc.add_paragraph(item, style='List Bullet')
|
|
||||||
|
|
||||||
file_path = tmp_path / "test.docx"
|
|
||||||
doc.save(str(file_path))
|
|
||||||
return str(file_path)
|
|
||||||
|
|
||||||
return _create_docx
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def temp_pdf(tmp_path):
|
|
||||||
"""创建临时 PDF 文件的 fixture 工厂。
|
|
||||||
|
|
||||||
Args:
|
|
||||||
text: PDF 文本内容
|
|
||||||
lines: 文本行列表
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: 临时文件路径
|
|
||||||
"""
|
|
||||||
def _create_pdf(text=None, lines=None):
|
|
||||||
try:
|
|
||||||
from reportlab.pdfgen import canvas
|
|
||||||
from reportlab.lib.pagesizes import letter
|
|
||||||
from reportlab.pdfbase import pdfmetrics
|
|
||||||
from reportlab.pdfbase.ttfonts import TTFont
|
|
||||||
except ImportError:
|
|
||||||
pytest.skip("reportlab 未安装")
|
|
||||||
|
|
||||||
file_path = tmp_path / "test.pdf"
|
|
||||||
c = canvas.Canvas(str(file_path), pagesize=letter)
|
|
||||||
|
|
||||||
# 尝试注册中文字体(如果可用)
|
|
||||||
try:
|
|
||||||
# 使用系统字体
|
|
||||||
pdfmetrics.registerFont(TTFont('SimSun', 'simsun.ttc'))
|
|
||||||
c.setFont('SimSun', 12)
|
|
||||||
except:
|
|
||||||
# 回退到默认字体
|
|
||||||
c.setFont('Helvetica', 12)
|
|
||||||
|
|
||||||
y_position = 750
|
|
||||||
|
|
||||||
if text:
|
|
||||||
# 单个文本块
|
|
||||||
for line in text.split('\n'):
|
|
||||||
c.drawString(100, y_position, line)
|
|
||||||
y_position -= 20
|
|
||||||
|
|
||||||
if lines:
|
|
||||||
# 多行文本
|
|
||||||
for line in lines:
|
|
||||||
c.drawString(100, y_position, line)
|
|
||||||
y_position -= 20
|
|
||||||
|
|
||||||
c.save()
|
|
||||||
return str(file_path)
|
|
||||||
|
|
||||||
return _create_pdf
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def temp_html(tmp_path):
|
def temp_html(tmp_path):
|
||||||
"""创建临时 HTML 文件的 fixture 工厂。
|
"""创建临时 HTML 文件的 fixture 工厂。
|
||||||
@@ -132,70 +30,6 @@ def temp_html(tmp_path):
|
|||||||
return _create_html
|
return _create_html
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def temp_pptx(tmp_path):
|
|
||||||
"""创建临时 PPTX 文件的 fixture 工厂。
|
|
||||||
|
|
||||||
Args:
|
|
||||||
slides: 幻灯片内容列表,每个元素为 (title, content) 元组
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: 临时文件路径
|
|
||||||
"""
|
|
||||||
def _create_pptx(slides=None):
|
|
||||||
try:
|
|
||||||
from pptx import Presentation
|
|
||||||
except ImportError:
|
|
||||||
pytest.skip("python-pptx 未安装")
|
|
||||||
|
|
||||||
prs = Presentation()
|
|
||||||
|
|
||||||
if slides:
|
|
||||||
for title, content in slides:
|
|
||||||
slide = prs.slides.add_slide(prs.slide_layouts[1]) # Title and Content layout
|
|
||||||
slide.shapes.title.text = title
|
|
||||||
if content:
|
|
||||||
text_frame = slide.shapes.placeholders[1].text_frame
|
|
||||||
text_frame.text = content
|
|
||||||
|
|
||||||
file_path = tmp_path / "test.pptx"
|
|
||||||
prs.save(str(file_path))
|
|
||||||
return str(file_path)
|
|
||||||
|
|
||||||
return _create_pptx
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def temp_xlsx(tmp_path):
|
|
||||||
"""创建临时 XLSX 文件的 fixture 工厂。
|
|
||||||
|
|
||||||
Args:
|
|
||||||
data: 表格数据,格式为 [[cell1, cell2], [cell3, cell4]]
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: 临时文件路径
|
|
||||||
"""
|
|
||||||
def _create_xlsx(data=None):
|
|
||||||
try:
|
|
||||||
import pandas as pd
|
|
||||||
except ImportError:
|
|
||||||
pytest.skip("pandas 未安装")
|
|
||||||
|
|
||||||
file_path = tmp_path / "test.xlsx"
|
|
||||||
|
|
||||||
if data:
|
|
||||||
df = pd.DataFrame(data)
|
|
||||||
df.to_excel(str(file_path), index=False, header=False)
|
|
||||||
else:
|
|
||||||
# 创建空的 Excel 文件
|
|
||||||
df = pd.DataFrame()
|
|
||||||
df.to_excel(str(file_path), index=False)
|
|
||||||
|
|
||||||
return str(file_path)
|
|
||||||
|
|
||||||
return _create_xlsx
|
|
||||||
|
|
||||||
|
|
||||||
# 静态测试文件目录
|
# 静态测试文件目录
|
||||||
FIXTURES_DIR = Path(__file__).parent / "fixtures"
|
FIXTURES_DIR = Path(__file__).parent / "fixtures"
|
||||||
|
|
||||||
@@ -278,4 +112,3 @@ def multiple_slides_ppt_path(ppt_fixture_path):
|
|||||||
def with_images_ppt_path(ppt_fixture_path):
|
def with_images_ppt_path(ppt_fixture_path):
|
||||||
"""返回带图片 PPT 测试文件路径"""
|
"""返回带图片 PPT 测试文件路径"""
|
||||||
return _get_static_file_path(ppt_fixture_path, "with_images.ppt")
|
return _get_static_file_path(ppt_fixture_path, "with_images.ppt")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user